【问题标题】:Spring Integration - Router, task-executor and smart LBSpring Integration - 路由器、任务执行器和智能负载均衡
【发布时间】:2017-05-18 09:52:12
【问题描述】:

我有一个队列通道和一个链,轮询器和任务执行器在该通道上“侦听”,并行执行一些处理。我想做的是以这样一种方式对其进行配置,即我可以根据某些逻辑/属性路由特定的消息,以确保特定的消息“类型”始终由来自任务执行器的特定线程处理。

示例:消息,其中:PAYLOAD_PROPERTY & 1 == 0 始终转到线程 1,PAYLOAD_PROPERTY & 1 == 1 始终转到线程 2(请注意,这只是 2 个线程的示例 - 我可以在这里轻松使用路由器,但我可以想象有逻辑 -像模运算 - 也适用于 10 个线程) - 换句话说:线程 1 和线程 2 不能同时处理相同“类型”的消息。因此,目的不仅仅是对其进行负载平衡 - 它是基于某些逻辑坚持使用相同的线程。

我最初的想法是以某种方式使用通道调度程序(它可以有load-balancer-reftask-executor),但不确定这是否可行,因为我有一个带有轮询器的链,可以进行我需要进一步的处理。

您能否建议具有上述工作流程的最佳组件设置是什么?

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

    在“标准”任务执行器中没有这样的东西。

    删除队列通道可能更容易,有一个路由器(订阅直接通道)路由到 10 个单独的执行器通道,每个执行器通道都配置有一个单线程执行器。

    【讨论】:

    • 是的,recipient-list-router 是我可以使用的,但是使用 10 个recipient 标签看起来......我认为可能会有更智能的东西。那么,你推荐这里的路由器吗?
    • 要么就是这样,要么你需要以某种方式创建一个自定义任务执行器。
    • 很公平 - 感谢您的建议。顺便说一句:我注意到一些奇怪的行为 - 我已经为我使用任务执行器为轮询器配置的线程定义了名称,但我可以在控制台日志中看到 task-scheduler-X 名称 - 你知道这些来自哪里以及为什么吗?代码是否在与 poller/task-executor 不同的线程中执行?
    • Spring Integration [定义了一个 TaskScheduler bean(docs.spring.io/spring-integration/reference/html/…) 用于轮询(和其他计划任务)。如果轮询器有taskExecutor,调度器会将任务交给它。
    • 在我之前的评论中,s/(in this case the executor)/(in this case the scheduler)/ CallerRuns with the bounded queue 意味着如果队列已满,任务将在调度程序线程上运行。 Spring Integration 提供了CallerBlocksPolicy
    猜你喜欢
    • 2021-12-07
    • 2018-08-11
    • 2021-08-10
    • 2022-01-24
    • 2019-07-16
    • 2020-05-18
    • 2013-08-26
    • 2015-10-18
    • 1970-01-01
    相关资源
    最近更新 更多