我正在 liberty 服务器上的 java-ee-7 中开发批处理作业。使用 REST API 启动批处理作业。这里的问题是当我尝试为相同的输入参数启动批处理作业时,会创建新的作业实例。而 Spring Batch 进程会抛出一个错误,指出 JobInstanceAlreadyExistsException。我期待这样的事情,以避免为相同的输入参数创建新作业
输入参数和批处理状态已使用 liberty 服务器表(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>
预期:如果传递相同的输入参数,作业应引发异常。 实际:它为相同的输入参数创建新的作业实例
最佳答案
使用 Liberty 批处理 REST API查看匹配的作业实例是否已存在
我将在这里给出第二个完全不同的答案。另一个答案证明了为什么 Liberty Batch 以及更普遍的 JSR 352 规范永远不会将提交与前一个作业参数相同的第二个作业视为错误情况。
但如果您确实想阻止这种情况,您可以在 Liberty Batch 中执行此操作,方法是在提交之前使用 REST API 查询匹配的作业实例是否已存在。不过,此时,您可以中止/阻止作业提交。
假设我想匹配 BonusPayout
的 jobName,作业参数 parm1 的值为 1000
和作业参数parm2 匹配 500*
(使用 glob/通配符)。
我可以通过 URL 做到这一点:
https:///ibm/api/batch/v4/jobinstances?jobName=BonusPayout&jobParameter.parm1=1000&jobParameter.parm2=500*
doc中的注释还有各种其他选项,例如忽略大小写(或不忽略)。
因此,如果我找到匹配项,我可以选择不继续(再次)提交作业。
关于java - 使用与 Spring Batch 相同的输入参数启 Action 业时,Liberty Batch 不会引发异常(JobInstanceAlreadyExistsException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54043192/