Spring Batch中的队列作业实例

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

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

我用谷歌搜索了一下但找不到任何有用的东西 . 所以我想知道这是否合适,在 Spring 季批次中排队作业实例?如果是这样,我该怎么做?我已经研究过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

回答(2)

2 years ago

好吧,如果您在应用程序和Spring Batch一起使用Spring Integration,那么利用 job-launching-gateway 功能真的是个好主意 .

是的,您可以将任务放入队列 - 基本上是 QueueChannel .

可以使用 max-message-per-poll="1" 配置轮询该通道的 endpoints ,以便一次仅从内部队列轮询一个任务 .

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

确保在同一版本中使用所有Spring Integration模块:spring-integration-core 3.0.5,spring-integration-file,-http,-sftp,-stream 3.0.5 .

2 years ago

如果仍然需要答案,可以使用CorePoolTaskExecutor,其核心大小为1,最大大小为1,然后是您想要的队列大小 .

<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>