Spring Batch: - 分两个阶段运行Job

时间:2017-07-05 05:55:18

标签: spring-batch

以下是我的客户推荐工作的弹簧批量设计: -

UI应用程序将在API服务器上调用Rest API。 Rest API创建一个唯一的id,并将唯一的id,作业参数,作业名称作为jms消息发送到某个批处理服务器。 Rest API将唯一令牌ID发送给UI。

批处理服务器上的JMS消息侦听器创建一个新的spring批处理作业实例,并将唯一ID设置为作业参数并运行该作业。

UI通过传递唯一令牌继续轮询Status Rest API。

Rest API从作业参数表中查找唯一ID,作业执行ID并将作业状态提供给UI。

请告知任何建议,以便我们可以在API服务器上创建作业,以便创建作业实例和参数但不执行任何步骤。我们知道作业执行ID

在具有输入作业执行ID的批处理服务器上,我们可以重新运行/恢复作业。

3 个答案:

答案 0 :(得分:0)

我认为您可以使用JobRequest表来存储具有初始唯一令牌的初始请求。您可以将此标记与批处理请求一起传递给JMS服务器。一旦JMS批处理服务器创建/启动请求,它还应该更新JobRequest表并插入实际的Batch-JobInstance-Id。

因此,客户可以使用唯一令牌询问状态。 Rest-API服务器可以使用该令牌查找作业ID并获取有关作业进度的信息

答案 1 :(得分:0)

我能够通过在创建Job Repository bean的同时提供我自己的增量工厂来实现这一点。现在,我可以在UI层从Seq获取作业,并在运行作业时使用它。作业执行ID存储在批处理服务器的本地线程中。我从OracleSequenceMaxValueIncrementer

中推翻了getNextKey()方法

答案 2 :(得分:-1)

我正在调试Spring批处理代码。我采用这种方法。但现在试图解决这个问题,看看它有用: -

我的客户端使用oracle DB。 Spring Batch在batch-oracle.properties文件中提供此属性。 batch.database.incrementer.class = org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer 我将覆盖batch.database.incrementer.class属性 客户特定的增量类通过继承OracleSequenceMaxValueIncrementer并覆盖getNextKey()抽象方法。

在API服务器上,我将只调用作业执行序列,获取id并在jms消息中传递相同内容。

在批处理服务器上,将作业执行ID存储在某个本地线程中。 getNextKey()方法检查增量器名称是否为JOB EXEC SEQ,从线程本地获取id,否则创建spring批处理方式。在弹出批处理创建作业执行期间将调用getNextKey()。对于其他表序列,这不会导致问题,因为增量符名称将是diff。