修复生产:

任务认领现在通过 REQUIRES_NEW 独立提交,确保任务进入线程池前,状态 RUNNING 已对工作线程可见。[实现位置 (line 492)](D:/code/BMS/bms-back/ruoyi-system/src/main/java/com/ruoyi/ar/service/impl/ArBillServiceImpl.java:492) Spring 官方也说明,AFTER_COMMIT 回调中访问数据库时,事务资源仍可能绑定;需要独立事务确保操作提交。Spring 事务说明
工作线程启动时若发现任务已是 CANCEL_REQUESTED,现在会走安全清理,不再直接返回、留下悬挂状态
This commit is contained in:
caojia
2026-09-24 16:23:01 +08:00
parent 7e54dbff95
commit bbbadfa246
@@ -30,6 +30,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
@@ -412,9 +413,17 @@ public class ArBillServiceImpl implements IArBillService {
public void processGenerateTask(Long taskId) {
try {
ArBillGenerateTask task = generateTaskMapper.selectById(taskId);
if (task == null || !ArBillGenerateTaskStatus.RUNNING.equals(task.getStatus())) {
if (task == null) {
log.warn("应收账单生成任务不存在,taskId={}", taskId);
return;
}
if (ArBillGenerateTaskStatus.CANCEL_REQUESTED.equals(task.getStatus())) {
finishGenerateTaskSafely(taskId, "用户取消账单生成");
return;
}
if (!ArBillGenerateTaskStatus.RUNNING.equals(task.getStatus())) {
log.warn("应收账单生成任务未执行,任务不存在或状态不是 RUNNING,taskId={}, status={}",
taskId, task == null ? null : task.getStatus());
taskId, task.getStatus());
return;
}
log.info("开始执行应收账单生成任务,taskId={}, arBillId={}, selectionMode={}",
@@ -480,6 +489,7 @@ public class ArBillServiceImpl implements IArBillService {
* 用数据库条件更新抢占 WAITING 任务,返回 true 才表示当前节点获得执行权。
*/
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public boolean claimGenerateTask(Long taskId) {
return generateTaskMapper.markRunning(taskId, new Date()) == 1;
}