Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当使用与spring批处理相同的输入参数启动作业时,Liberty批处理未引发异常(JobInstanceAlreadyExistsException)_Java_Jakarta Ee_Websphere Liberty_Java Ee 7_Jsr352 - Fatal编程技术网

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

Java 当使用与spring批处理相同的输入参数启动作业时,Liberty批处理未引发异常(JobInstanceAlreadyExistsException),java,jakarta-ee,websphere-liberty,java-ee-7,jsr352,Java,Jakarta Ee,Websphere Liberty,Java Ee 7,Jsr352,我正在liberty服务器上用java-ee-7开发批处理作业。使用RESTAPI启动批处理作业。这里的问题是,当我尝试为同一输入参数启动批处理作业时,创建了新的作业实例。而spring批处理会抛出一个错误,称为JobInstanceAlreadyExistsException。我希望这样做可以避免为相同的输入参数创建新作业 输入参数和批处理状态已使用liberty server表(WLPJOBINSTANCE、WLPSTEPTHREADINSTANCE、wlpjobparameter等)存储在

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

输入参数和批处理状态已使用liberty server表(WLPJOBINSTANCE、WLPSTEPTHREADINSTANCE、wlpjobparameter等)存储在Oracle数据库的永久存储中


预期:如果传递了相同的输入参数,则作业应引发异常。
实际:为同一输入参数创建新作业实例时,Liberty批处理实现按照JSR 352规范的设计工作

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

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

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

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

这是用另一种方式表达的,您会发现更详细地讨论了规范概念

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

使用Liberty批处理查看匹配的作业实例是否已存在 我将给出第二个完全不同的答案。另一个答案证明了为什么自由批处理,更一般地说,JSR 352规范将永远不会认为提交一个与先前的工作参数相同的第二个作业是错误的。 但是如果您真的想防止这种情况发生,您可以在Liberty批处理中这样做,在提交之前,使用RESTAPI查询匹配的作业实例是否已经存在。不过,此时您将决定是否中止/阻止作业提交

假设我想匹配
BonusPayout
jobName,作业参数parm1的值为
1000
,作业参数parm2的值为
500*
(带全局/通配符)

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

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

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


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

说了这些,我很想在评论中听到更多关于您的用例(动机)的信息。谢谢,我同意。如何防止针对同一输入参数再次启动作业。已同意。如何防止针对同一输入参数再次启动作业(假设上一次启动仍在运行)。例如:下午2点,在下午2点02分启动参数作业(“起始日期”:“04/20/2017”,“结束日期”:“04/21/2017”),再次启动相同输入参数的作业(注:上一个作业仍在运行)。在这种情况下,我希望批处理不应该启动新实例,因为它已经为给定参数创建了一个实例,并且仍在运行。我相信在这种情况下,Spring Buffing会抛出一个例外,如JoWorkSnaseRealyIsExsExeExt。因此,概念背景解释了为什么我们不认为在我们的规范和REST API中内置支持这是一个“主要”用例。因此,如果您仍然希望这样做,我认为最好的方法是在提交新作业实例之前使用REST API提前进行搜索(因为如上所述,我们永远不会失败提交,因为其他作业实例已经存在)。然后我会给出另一个不同的答案,解释你可能会怎么做。谢谢Scott。。那是最好的办法。使用RESTAPI上的GET调用获取实例列表,如果匹配,则可以选择不再提交作业。
<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>