gpt4 book ai didi

jsr352 - JSR-352 Java Batch : why does JobListener. afterJob() 总是获得批处理状态 STARTED?

转载 作者:行者123 更新时间:2023-12-03 21:43:46 25 4
gpt4 key购买 nike

我是 Java Batch 新手。我在 WebSphere Liberty 17.0.0.4 上部署了一个包含 JobListener 的简单批处理作业(请注意,我使用的是 IBM 的 JSR-352 实现,而不是 Spring Batch)。批处理作业本身按预期运行:它读取输入文件,进行简单的数据转换,然后写入数据库。但是在成功执行的 JobListener 的 afterJob() 方法中,我看到了批处理状态 STARTED 和退出状态 null。 (这些值与我在 beforeJob() 方法中记录的值相同)。我希望 afterJob() 看到 COMPLETED 状态,除非有异常(exception)。

afterJob() 记录的执行 ID 与我启 Action 业时 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);
...
}
}

我尝试添加 <end on="*" exit-status="COMPLETED"/><job><flow>在 JSL 中,但这没有效果或导致状态失败。

最佳答案

好问题。让我针对@cheng 的回答强调几点。

首先,要理解我们为什么这样实现,请考虑 JobListener 抛出异常的情况。那应该失败吗?在 Liberty,我们决定它应该这样做。但是,如果该作业已经具有 COMPLETED 状态,那么,这将意味着它已经...完成,并且此时不应失败。

所以 afterJob() 实际上更像是“作业结束”(或者您可以将其视为“作业步骤之后”)。

其次,问这个问题的一个原因是因为您想知道在 afterJob() 方法中作业是否成功执行。

好吧,至少在 Liberty 实现中(我为 IBM 工作),您确实可以看到这一点。先前的失败会将 BatchStatus 设置为 FAILED,而成功的(到目前为止)执行的状态仍为 STARTED

(就其值(value)而言,这是我们意识到在 1.0 规范工作的后期需要更多关注和标准化的一个领域,我希望我们能在未来解决更多问题。)

如果它有帮助并且您有兴趣,您可以看到导致并包括 WorkUnitThreadControllerImpl.endOfWorkUnit 调用的流程中的基本逻辑 here .

关于jsr352 - JSR-352 Java Batch : why does JobListener. afterJob() 总是获得批处理状态 STARTED?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48311434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com