对Spring Batch中的作业实例进行排队



我们每个工作日都有一个作业在Spring批处理中运行,由另一个系统触发。有时在同一天要运行多个作业实例。每一个都由另一个系统触发。每个作业运行大约一个小时,如果有几个作业实例要运行,我们会遇到一些数据问题。

我们希望按如下方式优化此步骤,如果没有作业实例正在运行,则启动一个新的作业实例,如果有作业实例在运行,则将新实例放入队列中。在触发下一个作业实例之前,必须先完成每个作业实例。如果一个失败了,下一个必须等待。作业参数是一个增量和一个时间戳。

我在谷歌上搜索了一下,但找不到任何有用的东西。所以我想知道这是否是双重的,在春季批处理中排队作业实例?如果是,我该怎么做?我已经研究了Spring集成和作业启动网关,但我真的不知道如何实现它,我想我不明白它是如何工作的。我试着读这些东西,但我还是不明白。

也许我的春季批次版本不对?也许我错过了什么?

如果你需要我提供更多信息,请告诉我!非常感谢。

我们使用的是spring-core和spring-beans 3.2.5,spring-batch integration 1.2.2,spring-integration core 3.0.5,spring-integration file,-http,-sftp,-stream 2.0.3

如果您仍然需要答案,可以使用核心大小为1、最大大小为1的ThreadPoolTaskExecutor,然后使用您想要的队列大小。

<bean id="jobLauncherTaskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="1" />
<property name="maxPoolSize" value="1" />
<property name="queueCapacity" value="200" />
</bean>

然后将其传递给SimpleJobLauncher

<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
<property name="taskExecutor" ref="jobLauncherTaskExecutor" />
</bean>

好吧,如果您的应用程序中有Spring Integration和Spring Batch,那么利用job-launching-gateway功能真的是个好主意。

对,您可以将任务放入队列中——本质上是QueueChannel

要轮询该通道的端点可以配置为max-message-per-poll="1",以便一次仅从内部队列轮询一个任务。

当您刚刚轮询了一条消息时,将其发送到job-launching-gateway,同时将停止该轮询端点的命令发送到控制总线组件。在当前作业完成之前,不要接触队列中的其他消息。当作业为COMPLETED时,您可以再发送一条控制消息来启动该轮询端点。

请确保使用同一版本中的所有Spring Integration模块:Spring Integration core 3.0.5、Spring Integration file、-http、-sftp、-stream3.0.5

最新更新