我在被动ElasticSearch中的索引名如下:
logs-2020.08.18
logs-2020.08.17
logs-2020.08.16
它将每天创建。
我想获取最新的索引名并使用reactiveelasticsearchclient或spring数据获取日志。有可能吗?
我在SpringWebFlux应用程序中尝试了以下方法:
我有以下代码段来查找索引可用性:
public Flux<Log> getLogFromLatestIndex(String serialId) {
Calendar cal = Calendar.getInstance();
String currentIndex = StringUtils.EMPTY;
boolean indexExists = false;
while (!indexExists) {
currentIndex = String.format("logs-%s”, format(cal.getTime(), "yyyy.MM.dd"));
indexExists = isIndexExists(currentIndex).block();
cal.add(Calendar.DATE, -1); // Decrease day 1 until you find index
}
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(matchQuery("serialId", serialId))
.withIndices(currentIndex)
.build();
return reactiveElasticsearchTemplate.find(searchQuery, Log.class);
}
public Mono<Boolean> isIndexExists(String indexName) {
return reactiveElasticsearchClient.indices().existsIndex(new GetIndexRequest().indices(indexName));
}
如何在不使用block的情况下获取布尔值
indexExists = isIndexExists(currentIndex).block();
显然,我会得到以下错误:
java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-nio-2
2条答案
按热度按时间yk9xbfzb1#
应用程序.yml
配置.java
控制器.java
其余的都是你的代码。我只是在Map里面打印索引名。虽然我在ElasticSearch中有索引logs-2020.08.21,但它一直在打印logs-2020.08.20、logs-2020.08.19、logs-2020.08.18等索引,最终抛出错误。
注意:当我在application.yml中尝试使用单ip时,我得到了相同的错误。
jhkqcmku2#
你可以用
Flux.generate
以及(take/skip)(Until/While)
在React堆里做一个循环。笔记:
已替换
Calendar
与LocalDate
因为它是不可变的,更适合于函数式/React式编程。这个
isIndexExists
方法返回Tuple
有索引名的引用,但显然可以根据需要用更具描述性的类来替换