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“批量请求中的所有操作均已成功进行!”;
}
}
}