Один и тот же общий объект фиксации сохраняется из разных экземпляров - PullRequest
0 голосов
/ 14 октября 2019

Я использую 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 принимаеттот же запрос, что и тот же.
...