【问题标题】:are spring integration channels single threaded?弹簧集成通道是单线程的吗?
【发布时间】:2013-07-26 07:18:28
【问题描述】:

如果我有一个休息服务,我肯定知道每个请求都由一个单独的线程处理,并且线程可以并行运行。

如果我在 spring 集成中有一个 rest(http) 服务作为入站通道会发生什么。每个请求是否仍然被并行处理或者请求将被放置在队列中......并且它更像是单线程

【问题讨论】:

    标签: java multithreading spring spring-integration


    【解决方案1】:

    普通通道 (DirectChannel) 使用与将某些内容放入通道的对象相同的执行线程(它们基本上是一种抽象方法调用的方式),因此它们是多线程的。

    来自docs

    除了是最简单的点对点通道选项之外,还有一个 它最重要的特点是它使单个线程能够 在通道的“两侧”执行操作。例如,如果 处理程序订阅 DirectChannel,然后发送消息到 该通道将触发该处理程序的调用 handleMessage(Message) 方法直接在发送者的线程中,之前 send() 方法调用可以返回。


    编辑

    你的问题有一个很好的观点。当您在通道中设置 Queue 元素时,spring 会自动将其转换为 QueueChannel (documentation),据我所知,一次只有一个线程能够从队列中消费。如果你想要“真正的”队列语义(多个生产者和消费者线程),你可以使用 ExecutorChannel

    【讨论】:

    • 感谢您的回复。我看到在出站通道上可以设置容量-我觉得有点矛盾....
    【解决方案2】:

    使用Rest(http)时,线程由servlet容器管理;容器支持多个并发请求,但设置并发是在容器中完成的,而不是 Spring Integration。

    使用默认的 Direct 通道,容器线程将在容器线程上并发调用 Spring Integration 流。

    【讨论】:

    • 如果有相同的“通道” - 会出现性能问题吗?
    • 不,没有性能问题;每个请求都在容器的线程上运行。
    猜你喜欢
    • 1970-01-01
    • 2013-04-23
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多