Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 无法使用AbstractReactiveElasticsearchConfiguration将数据写入ElasticSearch_Spring Boot_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Junit5_Java 11_Spring Reactive - Fatal编程技术网 elasticsearch,junit5,java-11,spring-reactive,Spring Boot,elasticsearch,Junit5,Java 11,Spring Reactive" /> elasticsearch,junit5,java-11,spring-reactive,Spring Boot,elasticsearch,Junit5,Java 11,Spring Reactive" />

Spring boot 无法使用AbstractReactiveElasticsearchConfiguration将数据写入ElasticSearch

Spring 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控制器,它正在启动我

我正在尝试将数据写入我的本地Elasticsearch Docker容器(7.4.2),为简单起见,我使用了Spring提供的AbstractReactiveElasticsearchConfiguration,它也覆盖了entityMapper函数。我构建了我的存储库,扩展了ReactiveElasticsearchRepository 最后,我使用autowired存储库保存了包含数据的所有元素集合。但是Elasticsearch不会写入任何数据。此外,我还有一个REST控制器,它正在启动我的整个过程,基本上不返回任何内容,延迟结果>

其余方法来自我的ApiDelegateImpl

  @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();