公司项目用的是java的HighLevelClient客户端,当使用delete_by_query删除大数据量的时候,会出现socket超时异常,原因是执行时间太长,client的一个socket默认超时时间是30s,如果执行时间超过30s,就会断开连接,抛出异常,但是命令会执行完毕。只是不知道最后的执行情况。
根据这种情况我上网查了一下,如果是用rest工具访问的话,可以设置wait_for_completion=false参数,表示不等待执行完毕再返回,而是直接返回一个taskid,可以根据taskid去查执行情况,例子如下:
但是我是用的client,不支持这种参数,所以只能分两种方式处理:
1、无返回值
1)直接捕获异常:直接在代码里catch IOException,然后不做处理就行了,如果超时就没有执行结果
2)用异步调用:官方文档提供异步调用方式,用listener监听返回结果,可以分别设置成功和失败情况的操作,我这边是打印日志,如下图:
2、有返回值
1)在client初始化时socket超时时间设置长一点:设置方式如下图,设置socketTimeOut时间。但是这还是有问题,如果数据量过大,执行时间超过设置的时间,还是会出现超时现象
2)使用异步:和上面无返回值的异步调用方式是一样的,但是上面是因为我封装了一个ES使用工具包,无法回调业务方法,如果调用ES代码在业务代码里面自己写的话,就可以直接回调业务代码了,写法参照上面
3)使用maxDocs参数:这个参数是指一次删除多少文档,如果我一次删除不超时的话,就可以循环请求,不会抛出异常。这个方法有个缺点就是,循环请求会降低效率,不如一次请求的效率高
总结:以上是我对delete_by_query删除数据超时的解决方式总结。如有问题,希望指正