【发布时间】:2013-07-26 07:18:28
【问题描述】:
如果我有一个休息服务,我肯定知道每个请求都由一个单独的线程处理,并且线程可以并行运行。
如果我在 spring 集成中有一个 rest(http) 服务作为入站通道会发生什么。每个请求是否仍然被并行处理或者请求将被放置在队列中......并且它更像是单线程
【问题讨论】:
标签: java multithreading spring spring-integration
如果我有一个休息服务,我肯定知道每个请求都由一个单独的线程处理,并且线程可以并行运行。
如果我在 spring 集成中有一个 rest(http) 服务作为入站通道会发生什么。每个请求是否仍然被并行处理或者请求将被放置在队列中......并且它更像是单线程
【问题讨论】:
标签: java multithreading spring spring-integration
普通通道 (DirectChannel) 使用与将某些内容放入通道的对象相同的执行线程(它们基本上是一种抽象方法调用的方式),因此它们是多线程的。
来自docs:
除了是最简单的点对点通道选项之外,还有一个 它最重要的特点是它使单个线程能够 在通道的“两侧”执行操作。例如,如果 处理程序订阅 DirectChannel,然后发送消息到 该通道将触发该处理程序的调用 handleMessage(Message) 方法直接在发送者的线程中,之前 send() 方法调用可以返回。
你的问题有一个很好的观点。当您在通道中设置 Queue 元素时,spring 会自动将其转换为 QueueChannel (documentation),据我所知,一次只有一个线程能够从队列中消费。如果你想要“真正的”队列语义(多个生产者和消费者线程),你可以使用 ExecutorChannel
【讨论】:
使用Rest(http)时,线程由servlet容器管理;容器支持多个并发请求,但设置并发是在容器中完成的,而不是 Spring Integration。
使用默认的 Direct 通道,容器线程将在容器线程上并发调用 Spring Integration 流。
【讨论】: