我们有一个工作在每个工作日运行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 回答
好吧,如果您在应用程序和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 .
如果仍然需要答案,可以使用CorePoolTaskExecutor,其核心大小为1,最大大小为1,然后是您想要的队列大小 .
即
然后将其传递给SimpleJobLauncher
即