Spring boot 无法使用AbstractReactiveElasticsearchConfiguration将数据写入ElasticSearch
我正在尝试将数据写入我的本地Elasticsearch Docker容器(7.4.2),为简单起见,我使用了Spring提供的AbstractReactiveElasticsearchConfiguration,它也覆盖了entityMapper函数。我构建了我的存储库,扩展了ReactiveElasticsearchRepository 最后,我使用autowired存储库保存了包含数据的所有元素集合。但是Elasticsearch不会写入任何数据。此外,我还有一个REST控制器,它正在启动我的整个过程,基本上不返回任何内容,延迟结果> 其余方法来自我的ApiDelegateImplSpring boot 无法使用AbstractReactiveElasticsearchConfiguration将数据写入ElasticSearch,spring-boot,
elasticsearch,junit5,java-11,spring-reactive,Spring Boot,
elasticsearch,Junit5,Java 11,Spring Reactive,我正在尝试将数据写入我的本地Elasticsearch Docker容器(7.4.2),为简单起见,我使用了Spring提供的AbstractReactiveElasticsearchConfiguration,它也覆盖了entityMapper函数。我构建了我的存储库,扩展了ReactiveElasticsearchRepository 最后,我使用autowired存储库保存了包含数据的所有元素集合。但是Elasticsearch不会写入任何数据。此外,我还有一个REST控制器,它正在启动我
@Override
public DeferredResult<ResponseEntity<Void>> openUsageExporterStartPost() {
final DeferredResult<ResponseEntity<Void>> deferredResult = new DeferredResult<>();
ForkJoinPool.commonPool().execute(() -> {
try {
openUsageExporterAdapter.startExport();
deferredResult.setResult(ResponseEntity.accepted().build());
} catch (Exception e) {
deferredResult.setErrorResult(e);
}
}
);
return deferredResult;
}
我的存储库
public interface OpenUsageRepository extends ReactiveElasticsearchRepository<OpenUsage, Long> {
}
我的适配器实现
@Autowired
private final OpenUsageRepository openUsageRepository;
...transform entity into OpenUsage...
public void doSomething(final List<OpenUsage> openUsages){
openUsageRepository.saveAll(openUsages)
}
@Autowired
私人最终开放性开放性开放性开放性开放性开放性开放性;
…将实体转换为OpenUsage。。。
公共无效剂量(最终开放使用清单){
OpenUsagePository.saveAll(openUsages)
}
最后是我的IT测试
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@Testcontainers
@TestPropertySource(locations = {"classpath:application-it.properties"})
@ContextConfiguration(initializers = OpenUsageExporterApplicationIT.Initializer.class)
class OpenUsageExporterApplicationIT {
@LocalServerPort
private int port;
private final static String STARTCALL = "http://localhost:%s/open-usage-exporter/start/";
@Container
private static ElasticsearchContainer container = new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:6.8.4").withExposedPorts(9200);
static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(final ConfigurableApplicationContext configurableApplicationContext) {
final List<String> pairs = new ArrayList<>();
pairs.add("spring.data.elasticsearch.client.reactive.endpoints=" + container.getContainerIpAddress() + ":" + container.getFirstMappedPort());
pairs.add("spring.elasticsearch.rest.uris=http://" + container.getContainerIpAddress() + ":" + container.getFirstMappedPort());
TestPropertyValues.of(pairs).applyTo(configurableApplicationContext);
}
}
@Test
void testExportToES() throws IOException, InterruptedException {
final List<OpenUsageEntity> openUsageEntities = dbPreparator.insertTestData();
assertTrue(openUsageEntities.size() > 0);
final String result = executeRestCall(STARTCALL);
// Awaitility here tells me nothing is in ElasticSearch :(
}
private String executeRestCall(final String urlTemplate) throws IOException {
final String url = String.format(urlTemplate, port);
final HttpUriRequest request = new HttpPost(url);
final HttpResponse response = HttpClientBuilder.create().build().execute(request);
// Get the result.
return EntityUtils.toString(response.getEntity());
}
}
@SpringBootTest(webEnvironment=webEnvironment.RANDOM\u端口)
@测试容器
@TestPropertySource(位置={“类路径:应用程序it.properties”})
@ContextConfiguration(initializers=OpenUsageExporterApplicationIT.Initializer.class)
类OpenUsageExporterApplicationIT{
@本地服务器端口
专用int端口;
私有最终静态字符串STARTCALL=”http://localhost:%s/open-用法导出器/开始/“;
@容器
私有静态ElasticsearchContainer容器=新的ElasticsearchContainer(“docker.elastic.co/elasticsearch/elasticsearch:6.8.4”)。具有公开端口(9200);
静态类初始值设定项实现ApplicationContextInitializer{
@凌驾
公共无效初始化(最终配置Application Context配置Application Context){
最终列表对=新的ArrayList();
add(“spring.data.elasticsearch.client.reactive.endpoints=“+container.getContainerIpAddress()+”:“+container.getFirstMappedPort());
add(“spring.elasticsearch.rest.uris=http://“+container.getContainerIpAddress()+”:“+container.getFirstMappedPort());
TestPropertyValues.of(pairs).applyTo(configurableApplicationContext);
}
}
@试验
void testExportToES()引发IOException、InterruptedException{
最终列表openusagenties=dbPreparator.insertTestData();
assertTrue(openUsageEntities.size()>0);
最终字符串结果=ExecuterTestCall(STARTCALL);
//这里的等待告诉我ElasticSearch中没有任何东西:(
}
私有字符串ExecuterTestCall(最终字符串urlTemplate)引发IOException{
最终字符串url=String.format(url模板,端口);
最终HttpUriRequest请求=新的HttpPost(url);
最终HttpResponse响应=HttpClientBuilder.create().build().execute(请求);
//得到结果。
返回EntityUtils.toString(response.getEntity());
}
}
但这将以一种阻塞的方式保存数据,有效地阻止反应性
另一种选择是,如果从调用的代码只是返回由saveAll()
返回的Flux
,但是,由于doSomething()
具有void
返回类型,这是值得怀疑的
你的
startExport()
是如何连接到doSomething()
的还不清楚。但是你的“调用代码”似乎没有使用任何反应性的概念,所以真正的解决方案是重写调用代码以使用反应性(获得发布者和订阅()
,然后等待数据到达),或者恢复使用阻塞API(ElasticsearchRepository
,而不是ReactiveElasticsearchRepository
)。是的,我意识到需要订阅频道的人,我最初的想法是elasticsearch可以完成阻塞()但对我来说,我是个傻瓜。然而,我的想法得出结论,如果我的目标是反应,我需要返回响应流量。无论如何,感谢您的响应
@Autowired
private final OpenUsageRepository openUsageRepository;
...transform entity into OpenUsage...
public void doSomething(final List<OpenUsage> openUsages){
openUsageRepository.saveAll(openUsages)
}
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@Testcontainers
@TestPropertySource(locations = {"classpath:application-it.properties"})
@ContextConfiguration(initializers = OpenUsageExporterApplicationIT.Initializer.class)
class OpenUsageExporterApplicationIT {
@LocalServerPort
private int port;
private final static String STARTCALL = "http://localhost:%s/open-usage-exporter/start/";
@Container
private static ElasticsearchContainer container = new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:6.8.4").withExposedPorts(9200);
static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(final ConfigurableApplicationContext configurableApplicationContext) {
final List<String> pairs = new ArrayList<>();
pairs.add("spring.data.elasticsearch.client.reactive.endpoints=" + container.getContainerIpAddress() + ":" + container.getFirstMappedPort());
pairs.add("spring.elasticsearch.rest.uris=http://" + container.getContainerIpAddress() + ":" + container.getFirstMappedPort());
TestPropertyValues.of(pairs).applyTo(configurableApplicationContext);
}
}
@Test
void testExportToES() throws IOException, InterruptedException {
final List<OpenUsageEntity> openUsageEntities = dbPreparator.insertTestData();
assertTrue(openUsageEntities.size() > 0);
final String result = executeRestCall(STARTCALL);
// Awaitility here tells me nothing is in ElasticSearch :(
}
private String executeRestCall(final String urlTemplate) throws IOException {
final String url = String.format(urlTemplate, port);
final HttpUriRequest request = new HttpPost(url);
final HttpResponse response = HttpClientBuilder.create().build().execute(request);
// Get the result.
return EntityUtils.toString(response.getEntity());
}
}
public void doSomething(final List<OpenUsage> openUsages){
openUsageRepository.saveAll(openUsages)
}
openUsageRepository.saveAll(openUsages).blockLast();