我们有一个工作在每个工作日运行Spring批处理,从另一个系统触发。有时候,有几个工作要在同一天运行。每个人都从另一个系统触发。 每个作业运行大约一个小时,如果要运行多个作业实例,我们会遇到一些数据问题。
如果没有正在运行的作业实例,则我们希望优化此步骤,如果没有正在运行的作业实例,则如果正在运行的作业实例已将新的实例放入队列中。 在触发下一个作业实例之前,必须完成每个作业实例。如果一个失败,下一个必须等待。 作业参数是增量器和时间戳。
我用Google搜索了一下,但找不到任何有用的东西。 所以我想知道这是否合适,在春季批次中排队作业实例? 如果是这样,我该怎么做?我已经研究过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 0.3
答案 0 :(得分:0)
好吧,如果您在应用程序和Spring Batch一起使用Spring Integration,那么利用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,-stream 3.0.5 ,以及。
答案 1 :(得分:0)
如果仍然需要答案,可以使用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>