多线程批量处理任务并批量处理状态

1. 获取任务

public ExecutorService executorService = Executors.newCachedThreadPool(); 
    
    @Scheduled(cron = "0 0/1 * * * ? ")
    public void callBack() {
        List<SyncInfoObject> syncInfoList = null;
        if(null != syncInfoList && syncInfoList.size() > 0) {
            try {
                CountDownLatch latch = new CountDownLatch(syncInfoList.size());
                for(SyncInfoObject syncInfoObject:syncInfoList){
                    executorService.submit(new CallBakTask(syncInfoObject,latch));
                }
                //等待所有任务都执行完, 最多等待600秒(10分钟)
                latch.await(600, TimeUnit.SECONDS);
            }catch(Exception e){
                logger.error("---------CallBackService.callBack任务执行异常,"+e.getMessage(),e);
            }finally {
                //批量更新
                asynInfoMapper.batchUpdateCallBackCount(syncInfoList);
            }
        }
    }

2. 任务线程

public class CallBakTask implements Callable<JSONObject>{
    
    private SyncInfoObject syncInfoObject;
    CountDownLatch latch;
  
    public CallBakTask(SyncInfoObject syncInfoObjec
            ,CountDownLatch latch){
        this.syncInfoObject = syncInfoObject;
        this.latch = latch;
    }   
  
    public JSONObject call() throws Exception { 
    try {
           //执行处理
            
        }catch(Exception e){
            logger.error("---------callBack子任务执行异常" +e.getMessage(),e);
            throw new Exception(e);
        }finally {
            latch.countDown();//单次任务结束,计数器减一
        }
        return output;  
    }    
}

3.  任务状态

 <!-- 批量更新回调次数 -->
   <update id="batchUpdateCount" parameterType="java.util.List">
           UPDATE t_table
            SET exec_count = exec_count+ 1
        WHERE key_id in 
        <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
            #{item.keyId,jdbcType=VARCHAR}
        </foreach>
    </update>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值