修复生产:
任务认领现在通过 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:
+12
-2
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user