xxl-job中使用多线程处理订单导致的问题
背景介绍:
项目使用jdk1.8,xxl-job-2.2.0,对于待支付状态的订单查询对应的支付平台,确定支付结果
定时任务配置:
代码编写
/**
* 线程池工厂
*/
private static final ThreadFactory FACTORY_BUILDER = new ThreadFactoryBuilder()
.setDaemon(true).setNameFormat("PayOrderQueryJob-order-%d").build();
/**
* 工行查询订单的线程池
*/
private static final Executor ICBC_POOL_EXECUTOR = new ThreadPoolExecutor(20, 20, 5, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(1024), FACTORY_BUILDER);
// 查询待支付的订单
List<Order> orders = …………;
orders.forEach(item -> {
// 工行待支付订单处理
POOL_EXECUTOR.execute(new Thread(orderService, item, icbcService));
});
public class Thread implements Runnable {
@Override
public void run() {
try {
// 查询银行确定支付结果
Order order = service.query(……);
// 对支付结果进行处理
service.dealPayResult(order);
} catch (Exception e) {
log.error("[{}]工行e支付查询结果,异常{},{}", order.getOrderNo(), e.getMessage(), e);
}
}
}
// 对支付结果进行处理
dealPayResult
……
if (PAY_FAIL.equals(order.getStatus())) {
// 如果是支付失败,则退还用户的参与机会
// redis中退还用户参与次数
redis.reduce(……);
try {
transactionTemplate.executeWithoutResult(transaction -> {
// 事务是因为其他业务逻辑,有多条更新语句
……
// 更新数据库中订单支付状态
orderDao.updateUnPayOrder(order);
……