我正在使用 Netty camel-netty:jar:2.10.0.redhat-60024 。 下面是我对Netty监听器的配置
网状:TCP://10.1.33.204:9001的TextLine =真安培; autoAppendDelimiter =真安培;定界符= LINE&安培;的keepAlive =真安培;同步=假安培; orderedThreadPoolExecutor =假安培; sendBufferSize = 2000&安培; receiveBufferSize = 2000&安培; decoderMaxLineLength = 2000&安培; workerCount = 20
这里我看到,基于调试日志,Netty只创建一个工作线程,因此传入的消息被阻塞,直到处理现有消息。
像:
2014-08-23 12:36:48,394 |调试| w I / O工作人员#5 | NettyConsumer
| ty.handlers.ServerChannelHandler 85 | 126 - org.apache.camel.camel-netty - 2.10.0.redhat-60024
直到5分钟的进程正在运行,但我看到只有这个线程处于活动状态。只有当该线程发送响应时,它才接受下一个请求
答案 0 :(得分:0)
对于TCP,Netty创建了许多工作线程,并将每个连接分配给特定的工作线程。该通道的所有事件都由该单个线程处理(注意它可能更复杂,但这足以满足此答案)。
听起来你正在Netty工作线程中处理你的消息。因此,您将阻止处理该连接上的任何其他事件,以及分配给工作线程的所有其他连接,直到您的进程返回。
Netty实际上正在创建多个工作线程。您可以在调试消息中看到您的通道正由I / O工作器5处理。默认情况下,Netty将创建2 * Runtime.availableProcessors,但除非您介入,否则每个连接都由单个线程处理。
目前尚不清楚您是否可以同时处理请求和乱序,或者订购是否重要。如果排序很重要,您可以告诉camel使用有序的线程池执行程序。这将在单独的线程池中处理请求,但第一个请求仍将阻止同一连接上的后续请求。
如果订购不重要,您可以选择几种方式。鉴于camel似乎正在使用Netty 3,并允许您创建自定义管道,您可以使用Netty的MemoryAwareThreadPoolExecutor同时处理请求。如果你这样做,也许请看What happens when shared MemoryAwareThreadPoolExecutor's threshold is reached?。
Camel可能会提供其他机制来帮助我,但我对Camel并不过分熟悉。 SEDA组件可能是一个很好的起点。