Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.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
Java SpringBoot-elasticsearch请求-添加和同步;冲洗控制器_Java_Spring Boot_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Java,Spring Boot,elasticsearch" /> elasticsearch,Java,Spring Boot,elasticsearch" />

Java SpringBoot-elasticsearch请求-添加和同步;冲洗控制器

Java SpringBoot-elasticsearch请求-添加和同步;冲洗控制器,java,spring-boot,elasticsearch,Java,Spring Boot,elasticsearch,我使用高级rest客户端从spring boot应用程序连接到elasticsearch 6.5 我想创建一个控制器,其中包含向批量请求添加命令的方法和刷新(实际执行)批量请求操作的方法 我这样编码: bulkRequestbean-注意单例范围 @Bean public BulkRequest bulkRequest() { return new BulkRequest(); } 批量控制器 @RestController @RequestMapping("/bulk") public


我使用高级rest客户端从spring boot应用程序连接到elasticsearch 6.5

我想创建一个控制器,其中包含向批量请求添加命令的方法和刷新(实际执行)批量请求操作的方法

我这样编码:
bulkRequestbean-注意单例范围

@Bean
public BulkRequest bulkRequest() {
  return new BulkRequest();
}
批量控制器

@RestController
@RequestMapping("/bulk")
public class BulkController {

    @Autowired
    private BulkRequest bulkRequest;

    @Autowired
    RestHighLevelClient client;

    @PostMapping
    public void index(@RequestBody String o) {
        bulkRequest.add(new IndexRequest(config.INDEX, config.TYPE).source(o, XContentType.JSON));
    }

    @PostMapping(path = "/flush")
    public String flush() throws Exception {
        BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);

        if(bulkResponse.hasFailures()) {
          return bulkResponse.buildFailureMessage();
        }
        else {
          return "All operations in the bulk request proceeded successfully!";
        }
    }

现在开始提问:
-
bulkRequest.add方法是否在bulkRequest bean的范围内同步(在本例中为单例)?

-调用
BulkController.flush
方法后,如何启动新的BulkRequest?我是否需要实例化BulkRequest的新bean并以某种方式将其推送到bean环境中?


-如果BulkRequestbean具有
@session
作用域,需要更改什么

我在StackOverflow上发现了一个类似的问题,不幸的是,我忘了保存一个链接,所以我将在这里的回答中进行解释

我使用AtomicReference作为bean类型,在flush方法中重新初始化了BulkRequest对象。然后,我通过
BulkRequest.add添加了同步,因为它在后台使用List

请注意,这个解决方案有点脏,在参考答案中也有这样的描述-但它对我有效

代码:
Bean

    @Bean
    public AtomicReference<BulkRequest> bulkRequest() {
      return new AtomicReference<BulkRequest>(new BulkRequest());
    }
@Bean
公共原子引用请求(){
返回新的原子引用(new BulkRequest());
}
控制器:

        @Autowired
        private AtomicReference<BulkRequest> bulkRequest;

        @PostMapping
        public void index(@RequestBody String o) {
            synchronized (bulkRequest.get()) {
                bulkRequest.get().add(new IndexRequest(config.INDEX, config.TYPE).source(o, XContentType.JSON));
            }
        }

        @DeleteMapping(path="/{id}")
        public void delete(@PathVariable String id) {
            synchronized (bulkRequest.get()) {
                bulkRequest.get().add(new DeleteRequest(config.INDEX, config.TYPE, id));
            }
        }

        @PutMapping(path="/{id}")
        public void update(@PathVariable String id, @RequestBody String o) {
            synchronized (bulkRequest.get()) {
                bulkRequest.get().add(new UpdateRequest(config.INDEX, config.TYPE, id).doc(o, XContentType.JSON));
            }
        }

 @PostMapping(path = "/flush")
    public String flush() throws Exception {
        synchronized (bulkRequest.get()) {
            String result = bulkService.flush(bulkRequest);

            bulkRequest.set(new BulkRequest());

            return result;
        }
    }
@Autowired
私有原子请求;
@邮戳
公共无效索引(@RequestBody字符串o){
已同步(bulkRequest.get()){
bulkRequest.get().add(新的IndexRequest(config.INDEX,config.TYPE).source(o,XContentType.JSON));
}
}
@DeleteMapping(path=“/{id}”)
公共无效删除(@PathVariable字符串id){
已同步(bulkRequest.get()){
bulkRequest.get().add(新的DeleteRequest(config.INDEX,config.TYPE,id));
}
}
@PutMapping(path=“/{id}”)
公共无效更新(@PathVariable字符串id,@RequestBody字符串o){
已同步(bulkRequest.get()){
bulkRequest.get().add(新的UpdateRequest(config.INDEX,config.TYPE,id).doc(o,XContentType.JSON));
}
}
@后映射(路径=“/flush”)
公共字符串flush()引发异常{
已同步(bulkRequest.get()){
字符串结果=bulkService.flush(bulkRequest);
set(新的bulkRequest());
返回结果;
}
}
批量服务

@Service
public class BulkService {

    @Autowired
    private RestHighLevelClient client;

    public String flush( AtomicReference<BulkRequest> bulkRequest) throws Exception {

        BulkResponse bulkResponse = client.bulk(bulkRequest.get(), RequestOptions.DEFAULT);

        if(bulkResponse.hasFailures()) {
            return bulkResponse.buildFailureMessage();
        }
        else {
            return "All operations in the bulk request proceeded successfully!";
        }
    }
}
@服务
公共舱位服务{
@自动连线
私有REST高级客户端;
公共字符串刷新(原子引用请求)引发异常{
BulkResponse BulkResponse=client.bulk(bulkRequest.get(),RequestOptions.DEFAULT);
if(bulkResponse.hasFailures()){
返回bulkResponse.buildFailureMessage();
}
否则{
return“批量请求中的所有操作均已成功进行!”;
}
}
}