【问题标题】:job-launching-gateway and persistent queue作业启动网关和持久队列
【发布时间】:2017-03-11 03:30:32
【问题描述】:

我正在开发一个包含 spring-boot、spring-batch 和 spring-integration 的项目。

我已经将 spring-integration 配置为在新消息到达时启动 spring-batch 作业。

我向附加到 JobLaunchingGateway 的 spring-integration 通道发送一条消息,并且对于每条消息,JobLaunchingGateway 尝试启动一个新的 TaskExecutor。

让通道由一个持久队列支持(以 ActiveMQ 为例) 让task-executor pool-size等于2。

我想配置系统,以便当执行程序池大小已被使用时,新消息不会被 JobLaunchingGateway 消耗,而是保留在持久队列中。

有可能吗?是否有任何最佳做法。

我们将不胜感激任何反馈。 提前致谢。

【问题讨论】:

    标签: spring-integration spring-batch


    【解决方案1】:

    您可以向 TE 添加队列限制并使用CallerBlocksPolicy' for theRejectedExecutionHandler`。

    但是,如果发生故障,您将丢失队列中的任务。

    通常最好使用消息驱动通道,将并发设置为 2,然后在侦听器容器线程上运行作业,而不是使用 TE 来运行作业。

    额外的好处是,如果作业失败或机器崩溃,您不会丢失该请求。一旦你移交给 TE,消息就会从队列中消失。

    【讨论】:

    • 感谢您的快速回复。第二种方式正是我想要实现的,因为我不想在崩溃的情况下丢失任何东西。但是,“在侦听器容器上运行作业”是什么意思?您是否建议在 MessageDelegate 的实现中运行该作业并通过 MessageListenerAdapter 将此 MessageDelegate 传递给 DefaultMessageListenerContainer?您如何看待使用带有 SyncTaskExecutor 的 jobLouncher 的“batch-int:job-launching-gateway”?
    • 根本不使用任务执行器,作业将在通道的侦听器容器线程上运行。该框架将为您处理一切。 SubscribableJmsChannel 有一个容器;根据需要设置其并发性并将作业启动网关直接连接到它。如果您仍然无法理解,请使用您当前的配置编辑您的问题,以便有人指导您。
    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 2019-11-04
    • 2012-01-23
    • 2015-07-07
    • 2011-02-21
    • 2023-04-05
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多