我正在自由服务器上的java 7中开发批处理作业。使用REST启动批处理作业。这里的问题是,当我试图为相同的输入参数启动批处理作业时,会创建新的作业实例。而春季批处理,抛出一个错误说JobInstanceAlreadyExistsException。我期望这样的东西可以避免为相同的输入参数创建新的作业。
输入参数和批处理状态已使用空闲服务器表(WLPJOBINSTANCE、WLPSTEPTHREADINSTANCE、input参数等)存储在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>如果传递相同的输入参数,作业应该抛出一个异常。它为相同的输入参数创建新的作业实例。
发布于 2019-01-08 20:55:43
使用空闲批处理REST API查看是否存在匹配的作业实例
我要给出一个完全不同的答案。另一个答案解释了为什么自由批处理,以及更一般的JSR 352规范,永远不会认为提交与早期作业参数相同的第二个作业是错误的。
但是,如果您真的想要防止这种情况,可以在自由批处理中使用REST在提交之前进行查询,如果匹配的作业实例已经存在的话。但是,此时将由您来中止/阻止作业提交。
假设我想匹配jobName of BonusPayout,使用作业参数parm1 of value 1000和作业参数parm2匹配500* (使用glob/通配符)。
我可以通过URL做这件事:
注意,在文档中还有其他各种选项,比如忽略大小写(或不忽略)。
因此,如果我得到一个匹配,我可以选择不继续提交工作(再次)。
发布于 2019-01-05 04:33:29
根据JSR 352规范,自由批处理实现按设计工作。
在from (或JSR 352规范)中,没有办法阻止您从给定的作业定义中创建任意数量的作业实例,因此您必须创建自己的机制。
JSR 352中的概念起点是一个作业定义,它通常会按照一些日程反复运行:每天、每月、季度等等。
自由批处理或规范中没有任何东西可以阻止您通过JobOperator 开始()方法启动新的作业实例,或者使用自由批处理REST API通过POST /ibm/api/batch/jobinstances/启动新作业实例,因为已经存在一些类似的作业实例。
阻止您重新启动已完成但从未创建新作业实例的作业实例。
这是在这个答案中用另一种方式表述的,您可以找到更详细的这里中讨论的规范概念。
因此,这里所提供的Spring批处理对于它的实现是独一无二的。
https://stackoverflow.com/questions/54043192
复制相似问题