有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Liberty批处理在使用与spring批处理相同的输入参数启动作业时未引发异常(JobInstanceAlreadyExistsException)

我正在liberty服务器上用java-ee-7开发批处理作业。使用RESTAPI启动批处理作业。这里的问题是,当我尝试为同一输入参数启动批处理作业时,创建了新的作业实例。而spring批处理会抛出一个错误,称为JobInstanceAlreadyExistsException。我希望这样做可以避免为相同的输入参数创建新作业

输入参数和批处理状态已使用liberty server表(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>

预期:如果传递了相同的输入参数,则作业应引发异常。 实际:为同一输入参数创建新作业实例


共 (2) 个答案

  1. # 1 楼答案

    Liberty批处理实现按照JSR352规范的设计工作

    Liberty Batch(或JSR 352规范)中没有办法阻止您从给定的作业定义创建任意数量的作业实例,您必须创建自己的机制来执行此操作

    JSR352中的概念起点是一个作业定义,该作业通常会根据某些计划重复运行:每日、每月、每季度等

    Liberty Batch或规范中没有任何内容阻止您通过JobOperatorstart()方法启动新作业实例,或者使用Liberty Batch REST API,通过POST /ibm/api/batch/jobinstances/启动新作业实例,因为某些类似作业实例已经存在

    系统会阻止您重新启动已完成的作业实例,但不会阻止您创建新作业实例

    这在this answer中以另一种方式表述,您将发现在here中更详细地讨论了规范概念

    因此,无论SpringBatch在这里提供什么,都是其实现所独有的

  2. # 2 楼答案

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

    我将给出第二个完全不同的答案。另一个答案证明了为什么自由批处理,更一般地说,JSR 352规范将永远不会认为提交一个与先前的工作参数相同的第二个作业是错误的。p>

    但是如果您真的想防止这种情况发生,您可以在Liberty批处理中这样做,在提交之前,使用RESTAPI查询匹配的作业实例是否已经存在。不过,此时您将决定是否中止/阻止作业提交

    假设我想将BonusPayout作业名与值1000的作业参数parm1匹配500*(使用全局/通配符)

    我可以通过URL进行此操作:

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

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

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