当使用相同的输入参数启动作业时,Liberty Batch 不会抛出异常,而 spring 批处理会抛出异常(JobInstanceAlreadyExistsException)

Liberty Batch not throwing exception when job launched with same input parameter where as spring batch does(JobInstanceAlreadyExistsException)

我正在自由服务器之上的 java-ee-7 中开发批处理作业。使用 REST API 启动批处理作业。这里的问题是当我尝试为相同的输入参数启动批处理作业时,创建了新的作业实例。而 spring 批处理,抛出一个错误,指出 JobInstanceAlreadyExistsException。我期待这样的事情来避免为相同的输入参数创建新工作

输入参数和批次状态已使用自由服务器表(WLPJOBINSTANCE、WLPSTEPTHREADINSTANCE、wlpjobparameter 等)存储在 Oracle 数据库的持久存储中。

<job xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd"
    id="my-batch-job" restartable="true" version="1.0">
</job>

预期:如果传递相同的输入参数,作业应抛出异常。 实际:它为相同的输入参数创建新的作业实例

根据 JSR 352 规范,Liberty Batch 实现按设计运行。

Liberty Batch(或 JSR 352 规范)无法阻止您根据给定作业定义创建任意数量的作业实例,您必须为此创建自己的机制。

JSR 352 中的概念起点是一个作业的作业定义,该作业通常会 运行 根据某些时间表重复进行:每日、每月、每季度等。

Liberty Batch 或规范中没有任何内容可以阻止您通过 JobOperator start() method, or, using the Liberty Batch REST APIPOST /ibm/api/batch/jobinstances/ 启动新的作业实例,因为一些类似的作业实例已经存在。

您无法重新启动已经完成但永远无法创建新作业实例的作业实例。

这在 and you'll find the spec concepts discussed in more detail here 中有另一种表达方式。

因此 Spring Batch 在这里提供的任何内容都是其实现所独有的。

使用 Liberty Batch REST API 查看匹配的作业实例是否已经存在

我要在这里给出第二个完全不同的答案。另一个答案证明了为什么 Liberty Batch 以及更普遍的 JSR 352 规范永远不会将提交具有与先前作业相同作业参数的第二个作业视为错误情况。

但如果您真的想防止这种情况发生,您可以在 Liberty Batch 中执行此操作,方法是使用 REST API 在提交之前查询匹配的作业实例是否已存在。不过,此时 abort/prevent 作业提交将取决于您。

说我想匹配 BonusPayoutjobName,作业参数 parm1 的值为 1000 和作业参数 parm2 匹配 500*(与 glob/wildcard)。

我可以通过 URL:

https:///ibm/api/batch/v4/jobinstances?jobName=BonusPayout&jobParameter.parm1=1000&jobParameter.parm2=500*

注意 doc 中还有其他各种选项,例如忽略大小写(或不忽略)。

因此,如果我找到匹配项,我可以选择不继续并(再次)提交作业。