本地启动springboot项目自测定时任务代码时候报错,发现如下可以解决。
@Slf4j
@RunWith(SpringRunner.class)
@ActiveProfiles("local")
@SpringBootTest(classes = AssetApp.class)
public class SendDataJobTest {
@Resource
private sendDataJob job;
@Test
public void testDoJob() {
try {
String param = null;
job.sendData(param);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
通过sql查询相关批处理表,并通过sql更新相关状态来解决该异常。
检查两个表:batch_step_execution、batch_job_execution
这两张表如果有已启动(正在启动)和未完成的作业,就可能出现该异常。
一:使用sql在数据库查询是否有未完成的任务
SELECT
STEP_EXECUTION_ID
, JOB_EXECUTION_ID
, STEP_NAME
, STATUS
, EXIT_CODE
, bse.*
FROM batch_step_execution bse
WHERE 1=1
AND status IN ('STARTED', 'STARTING')
AND exit_code NOT IN ('COMPLETED', 'FAILED')
ORDER BY start_time desc
;
SELECT bje.JOB_EXECUTION_ID
, bji.JOB_NAME
, bje.JOB_INSTANCE_ID
, bje.STATUS
, bje.EXIT_CODE
-- , timediff(bje.CREATE_TIME, NOW())
, bje.*
FROM batch_job_execution bje
INNER JOIN batch_job_instance bji
ON bje.job_instance_id = bji.job_instance_id
WHERE 1=1
AND status IN ('STARTED', 'STARTING')
AND exit_code NOT IN ('COMPLETED', 'FAILED')
ORDER BY bje.create_time desc
;
二:如果sql执行后有记录,执行更新sql
UPDATE batch_step_execution
SET END_TIME = now()
,LAST_UPDATED = now()
,STATUS = 'COMPLETED'
,EXIT_CODE = 'FAILED'
WHERE
STEP_EXECUTION_ID in (
select STEP_EXECUTION_ID
from batch_step_execution bse
where 1=1
and status not in ('COMPLETED', 'FAILED')
or EXIT_CODE not in ('COMPLETED', 'FAILED')
)
;
UPDATE BATCH_JOB_EXECUTION
SET
END_TIME = now()
,LAST_UPDATED = now()
,STATUS = 'COMPLETED'
,EXIT_CODE = 'FAILED'
WHERE
JOB_EXECUTION_ID in (
select bje.JOB_EXECUTION_ID
from batch_job_execution bje
where 1=1
and (status not in ('COMPLETED', 'FAILED'))
or (EXIT_CODE not in ('COMPLETED', 'FAILED'))
)
;
三: 重启服务,报错消失