Я использую Javers версии 5.1.2 с jdk 11 в своем приложении, где я фиксирую Generic Object T и сохраняю в mongodb. Общие объекты коммитов фактически создаются из универсального сервиса отдыха, где пользователь может передать любой Json. Все идет хорошо в одном случае. Всякий раз, когда любая повторная фиксация отправляется с тем же запросом, метод Javers commit.getChanges (). IsEmpty () возвращает true.
Проблемы: 1) Всякий раз, когда один и тот же запрос отправляется другому экземпляру, commit.getChanges (). IsEmpty() метод возвращает false. 2) Если я фиксирую один запрос и перезапускаю экземпляр, а затем снова фиксирую, commit.getChanges (). IsEmpty () снова возвращает false. Вместо true.
В результате вышеуказанной проблемы создается новая версия, если запрос переходит к другому новому экземпляру или экземпляр перезапускается.
Не могли бы вы сообщить мне, как мы можемсправиться с этой проблемой.
Я извлеку код из проекта и создам пример работающего проекта и поделюсь им. Прямо сейчас я могу поделиться несколькими классами, пожалуйста, посмотрите, помогают ли они:
// --------------------- Entitiy Class:
import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class ClientEntity<T> {
@Getter
@Setter
private String entityId;
@Getter
@Setter
private T commitObj;
@Getter
@Setter
private String authorName;
@Getter
@Setter
private boolean major;
@Getter
@Setter
private Map<String, String> commitProperties;
}
// -------- DataIntegrator
@Service
public class DataIntegrator {
private final Javers javers;
private IVersionRepository versionDao;
private IdGenerator idGenerator;
@Inject
public DataIntegrator(Javers javers, IVersionRepository versionDao, IdGenerator idGenerator) {
this.javers = javers;
this.versionDao = versionDao;
this.idGenerator = idGenerator;
}
public <T> String commit(ClientEntity<T> clientObject) {
CommitEntity commitEntity = new CommitEntity();
commitEntity.setEntityId(clientObject.getEntityId());
commitEntity.setEntityObject(clientObject.getCommitObj());
Map<String, String> commitProperties = new HashMap<>();
commitProperties.putAll(clientObject.getCommitProperties());
commitProperties.put(commit_id_property_key, clientObject.getEntityId());
commitProperties.putAll(idGenerator.getEntityVersions(clientObject.getEntityId(), clientObject.isMajor()));
Commit commit = javers.commit(clientObject.getAuthorName(), commitEntity, commitProperties);
if (commit.getChanges().isEmpty()) {
return "No Changes Found";
}
versionDao.save(
new VersionHead(clientObject.getEntityId(), Long.parseLong(commitProperties.get(major_version_id_key)),
Long.parseLong(commitProperties.get(minor_version_id_key))));
return commit.getProperties().get(major_version_id_key) + ":"
+ commit.getProperties().get(minor_version_id_key);
}
}
1) commitObj
- это универсальный объект в ClientEntity, который содержит приход JsonОт остальных веб-сервисов. JSON может быть любым допустимым JSON. Может иметь также вложенную структуру. 2) После вызова метода javers.commit
мы проверяем, является ли он существующим объектом или есть какие-либо изменения, используя commit.getChanges().isEmpty()
.
- Если тот же второй запрос передается в тот же экземпляр, он возвращает true для изменения, как и ожидалось
- Если один и тот же второй запрос переходит к другому экземпляру, при балансировке нагрузки он принимает его как другой запрос и
commit.getChanges().isEmpty()
возвращает falseОжидаемый ответ должен быть истинным, так как это та же версия. - Если после первого запроса я перезапускаю экземпляр и выполняю тот же запрос, он возвращает ложь вместо истины, что означает, что метод
getChanges
принимаеттот же запрос, что и тот же.