Оптимизация c блокировка данных Spring для ElasticSearch не работает - PullRequest
0 голосов
/ 07 апреля 2020

Поддерживает ли Spring Data для ElasticSearch управление версиями документов через @Version? Кажется нет. Если не поддерживает, как это сделать правильно?

Пример:

ElasticSearchConfig:

@Configuration
public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {

    @Override
    public RestHighLevelClient elasticsearchClient() {
        String host = "localhost"; int port = 9200;
        try {
            System.out.println("ElasticSearch host: " + host + ", port: " + port);
            ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                    .connectedTo(host + ":" + port)
                    .build();
            return  RestClients.create(clientConfiguration).rest();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Объект:

@Document(indexName = Ent.INDEX_ENTITY, type = "_doc")
public class Ent {
    public static final String INDEX_ENTITY = "entity";
    @Id
    public String id;
    public String data;
    public Ent(String data) {
        this.data = data;
    }
    @JsonIgnore
    public long version;
    public Ent setData(String arg) {
        this.data = arg;
        return this;
    }
}

Тестовое приложение :

@SpringBootApplication
public class App {

@Autowired
ObjectMapper objectMapper;
@Autowired
protected ElasticsearchOperations elasticsearchOperations;

public static void main(String[] args) {
    SpringApplication.run(App.class, args);
}

@Autowired
EntRepository entRepository;

@PostConstruct
public void testUpdate() throws Exception {
    Ent ent = entRepository.save(new Ent("some data"));
    for (int i = 0; i < 3; i++) {
        update(ent.setData("data-"+System.currentTimeMillis()));
        System.out.println("version = " + ent.version);
    }
}

public Ent update(Ent ent) throws JsonProcessingException {
    UpdateQuery updateQuery = new UpdateQuery();
    updateQuery.setIndexName(Ent.INDEX_ENTITY);
    updateQuery.setId(ent.id);
    updateQuery.setType("_doc");
    updateQuery.setUpdateRequest(
            new UpdateRequest()
                    .version(1)
                    .versionType(VersionType.EXTERNAL_GTE) // doesn't affect actually...
                    .doc(objectMapper.writeValueAsString(ent), XContentType.JSON)
    );
    UpdateResponse updateResponse = elasticsearchOperations.update(updateQuery);
    ent.version = updateResponse.getVersion();
    return ent;
}

}

Итак, я получаю вывод:

version = 2
version = 3
version = 4

, но он никогда не завершается ошибкой, хотя я установил новый UpdateRequest (). Version (1)

Так как сделать так, чтобы произошел сбой, если версия не соответствует ожидаемой (или ниже ожидаемой)?

...