我是 Java Batch 新手。我在 WebSphere Liberty 17.0.0.4 上部署了一个包含 JobListener 的简单批处理作业(请注意,我使用的是 IBM 的 JSR-352 实现,而不是 Spring Batch)。批处理作业本身按预期运行:它读取输入文件,进行简单的数据转换,然后写入数据库。但是在成功执行的 JobListener 的 afterJob() 方法中,我看到批处理状态为 STARTED,退出状态为 null。(这些值与我在 beforeJob() 方法中看到的值相同)。我希望 afterJob() 看到 COMPLETED 的状态,除非有例外。
afterJob() 记录的执行 ID 与 JobOperator.start() 在我开始作业时返回的值相同,所以我知道我得到了正确作业执行的状态。
我找不到任何获取批处理状态的 JobListener 示例,因此我的 JSL 中可能有一个简单的错误,或者我错误地获取了批处理状态。或者我是否需要在步骤的实施中明确设置状态?对于设置和获取作业执行的最终批处理状态和退出状态的正确技术,我将不胜感激。
这是JSL:
<job ...>
<properties>...</properties>
<listeners>
<listener ref="jobCompletionNotificationListener"/>
</listeners>
<flow id="flow1">
<step id="step1">...</step>
</flow>
</job>
这是batch.xml中监听器的定义:
<ref id="jobCompletionNotificationListener"
class="com.llbean.batch.translatepersonnames.jobs.JobCompletedListener"/>
这是 JobListener 的实现:
@Dependent
@Named("jobCompletedListener")
public class JobCompletedListener implements JobListener {
...
@Inject
private JobContext jobContext;
@Override
public void afterJob() {
long executionId = jobContext.getExecutionId();
JobExecution jobExecution = BatchRuntime.getJobOperator().getJobExecution(executionId);
BatchStatus batchStatus = jobExecution.getBatchStatus();
String exitStatus = jobExecution.getExitStatus();
logger.info("afterJob(): Job id " + executionId + " batch status = " + batchStatus +
", exit status = " + exitStatus);
...
}
}
我尝试在 JSL 中添加<end on="*" exit-status="COMPLETED"/>
and <job>
,<flow>
但没有效果或导致状态为 FAILED。