Spring Batch

时间:2017-10-10 06:36:39

标签: spring-integration spring-batch spring-batch-admin

我们有一个工作在每个工作日运行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

2 个答案:

答案 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)

如果仍然需要答案,可以使用CorePoolTask​​Executor,其核心大小为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>