Spring batch Spring批处理:-分两个阶段运行作业

Spring batch Spring批处理:-分两个阶段运行作业,spring-batch,Spring Batch,以下是向我的客户推荐工作的spring批量设计:- UI应用程序将在API服务器上调用RESTAPI。RESTAPI创建一个唯一id,并将唯一id、作业参数、作业名称作为jms消息发送到某个批处理服务器。RESTAPI将唯一令牌id发送到UI 批处理服务器上的JMS消息侦听器创建一个新的spring批处理作业实例,并将唯一id设置为job param并运行该作业 UI通过传递唯一令牌来持续轮询RESTAPI的状态 RESTAPI从作业参数表中查找唯一id、作业执行id,并向UI提供作业状态 请提

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

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

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

UI通过传递唯一令牌来持续轮询RESTAPI的状态

RESTAPI从作业参数表中查找唯一id、作业执行id,并向UI提供作业状态

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


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

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


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

我正在调试Spring批处理代码。我是用这种方法来的。但现在,要想解决这个问题,请看这个:-

我的客户端使用oracle数据库。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


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

我可以通过在创建作业存储库bean时提供自己的递增器工厂来做到这一点。现在我可以在UI层从Seq获得作业执行,并在运行作业时使用相同的命令。作业执行id存储在批处理服务器的本地线程中。我对OracleSequenceMaxValueIncrementer中的getNextKey()方法的优先级过高