线程池批量处理业务,一条报错全部回滚

1、主要代码

@Component
public class BatchOperationThreadTaskUtil {

	//工具类静态执行
    private static PlatformTransactionManager transactionManager;
	//此属性只是为了动态赋值给上面的属性
    @Autowired
    private PlatformTransactionManager remoteTransactionManager;

    private static final Logger log = LoggerFactory.getLogger(BatchOperationThreadTaskUtil.class);

    private static final int TIME = 30;

    private static final int CORE_POOL_SIZE = 15;

    private static final int MAXIMUM_POOL_SIZE = 15;

    private static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, TIME, TimeUnit.MINUTES, new LinkedBlockingQueue(), new ThreadFactoryBuilder().setNameFormat("batchOperationThread-pool-%d").build());

	//初始化时赋值给静态属性
    @PostConstruct
     public void init() {
        this.transactionManager = this.remoteTransactionManager;
     }

    /**
     * 多任务执行 开启多个线程
     * @param executeBeans
     * @param callable
     */
    public static <T> void excute(Collection<T> executeBeans, CallableWithException<T> callable) throws Exception{
        CountDownLatch mainLatch = new CountDownLatch(1);
        CountDownLatch sampleLatch = new CountDownLatch(executeBeans.size());
        AtomicBoolean rollBackFlag = new AtomicBoolean(false);

        executeBeans.forEach(b->{
            threadPoolExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    if(rollBackFlag.get()){
                        sampleLatch.countDown();
                        return;
                    }

                    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
                    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
                    TransactionStatus status = transactionManager.getTransaction(def);

                    try{

                        callable.call(b);

                        sampleLatch.countDown();
                        mainLatch.await();
                        if(rollBackFlag.get()){
                            transactionManager.rollback(status);
                        }else{
                            transactionManager.commit(status);
                        }
                    }catch (Exception e){
                        log.error("批量操作失败",e);
                        rollBackFlag.set(true);
                        sampleLatch.countDown();
                        transactionManager.rollback(status);
                    }
                }
            });
        });

        sampleLatch.await();
        mainLatch.countDown();
        if(rollBackFlag.get()){
            throw new RuntimeException("批量操作失败");
        }
    }
}

2、动态执行代码块用到lambda


@FunctionalInterface
public interface CallableWithException<T>{
    void call(T e) throws Exception;
}

3、具体使用

BatchOperationThreadTaskUtil.excute(yourlist,(item)->{
            //具体业务代码块,尽量不要用外部对象引用,很容易造成数据库死锁
        });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值