我们每个工作日都会在Spring batch中运行一个作业,该作业是从另一个系统触发的。有时会有多个作业实例在同一天运行。每一个都是从另一个系统触发的。每个作业运行大约一个小时,如果有几个作业实例要运行,我们会遇到一些数据问题。
我们希望优化此步骤如下,如果没有作业实例正在运行,则启动一个新的作业实例,如果有一个作业实例正在运行,则将新的作业实例放入队列中。每个作业实例必须在触发下一个作业实例之前完成。如果一个失败了,下一个必须等待。作业参数是一个增量器和一个时间戳。
我用谷歌搜索了一下,但找不到任何有用的东西。所以我想知道,在spring batch中排队作业实例是否有责任?如果是这样,我该怎么做呢?我已经研究了Spring集成和工作启动网关,但我真的不知道如何实现它,我想我不明白它是如何工作的。我试着阅读这些东西,但我仍然不明白。
也许我搞错了spring batch的版本?也许我错过了什么?
如果你需要我的更多信息,请让我知道!谢谢!
我们使用了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
发布于 2017-10-11 02:02:43
好吧,如果你喜欢在你的应用程序中使用Spring Integration和Spring批处理,那么利用job-launching-gateway功能真的是一个很好的主意。
对,你可以把你的任务放到队列中--本质上是QueueChannel。
轮询通道的端点可以使用max-message-per-poll="1"进行配置,以便一次只从内部队列轮询一个任务。
当您刚刚轮询了一条消息时,将其发送到job-launching-gateway中,同时向控制总线组件发送停止该轮询端点的命令,直到当前作业完成才会接触队列中的其他消息。当作业为COMPLETED时,您可以再发送一条控制消息来启动该轮询端点。
请确保使用同一版本中的所有Spring Integration模块:spring-integration-core3.0.5、spring-integration-file、-http、-sftp、-stream 3.0.5 。
发布于 2018-04-30 23:42:31
如果您仍然需要答案,可以使用核心大小为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>https://stackoverflow.com/questions/46660073
复制相似问题