场景
对列表执行大批量的提交,或者发起流程等,由于时间较长而需要发起异步操作。
即第一步全部发起成功,然后提供第二个接口来查询之前的提交的内容的执行进度。
整体思路和要点
- 首先批量发起动作的接口要将每一条记录的唯一标识(id,uuid 等均可,保证唯一即可),同时根据自身处理的容量限定一个最大值,防止过多后应用资源不够导致崩溃。
- 定义一个异步处理的线程池 例如:ExecutorService 等均可,然后在提交接口内将所有任务通过提交到线程池的方式去异步执行,在具体执行逻辑内,可以在当前类定义一个存放所有结果的Map 或者其他容器或者集合,例如,可以定义
private Map<String, String> myMultiMap = new ConcurrentHashMap<>();
通过 ConcurrentHashMap 来存放所有提交记录的唯一标识的作为 map 的 Key put 入内,并将执行的结果作为对应 key 的值,也就是结果,成功的则更新对应标识key put 为成功,异常的为失败,依旧还在进行中的为执行中。
- 但上一个步骤需要防止重入,如果 我们的 ConcurrentHashMap 中已经对应key 的值,那么说明记录已经在记录内了 不再需要放入,同样的 已经有了结果的也不需要再次放入。
另起查询状态的接口
- 上面我们已经在 ConcurrentHashMap 存放了我们对应的key 和结果,那么我们新的接口查询状态则就需要第一个发起接口的唯一标识作为入参,可以直接从页面获取,或者由第一个接口作为结果返回。
- 接下来查询就相对比较简单了,使用入参的唯一标识在当前 ConcurrentHashMap 中查询对应的结果即可,如果都有了结果并且获取到的数量与入参一致或者大于,那么说明就全部执行完了,给到页面展示时 状态也就是完成,否则数量对不上 小于入参,说明还在执行中,页面继续等待 并做相应的等待动画。
- 执行结束后可以做个数据清除,或者不做,但是要在逻辑中保证不可重入或者同样的唯一标识再次发起时直接获取结果或者覆盖原有结果。