首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Spring Batch中排队作业实例

在Spring Batch中排队作业实例
EN

Stack Overflow用户
提问于 2017-10-10 14:36:39
回答 2查看 3.5K关注 0票数 2

我们每个工作日都会在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

EN

回答 2

Stack Overflow用户

发布于 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

票数 0
EN

Stack Overflow用户

发布于 2018-04-30 23:42:31

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

代码语言:javascript
复制
<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

代码语言:javascript
复制
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
    <property name="jobRepository" ref="jobRepository" />
    <property name="taskExecutor" ref="jobLauncherTaskExecutor" />
</bean>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46660073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档