239.10. 重新使用 Netty boss 和 worker 线程池

可作为 Camel 2.12 提供

Netty 有两个线程池:WE 和 worker。默认情况下,每个 Netty 使用者和制作者都有自己的私有线程池。如果要在多个消费者或制作者之间重复使用这些线程池,则必须在 Registry 中创建并列出线程池。

例如,使用 Spring XML,我们可使用 NettyWorkerPoolBuilder 和 2 worker 线程创建共享 worker 线程池,如下所示:

  <!-- use the worker pool builder to help create the shared thread pool -->
  <bean id="poolBuilder" class="org.apache.camel.component.netty.NettyWorkerPoolBuilder">
    <property name="workerCount" value="2"/>
  </bean>

  <!-- the shared worker thread pool -->
  <bean id="sharedPool" class="org.jboss.netty.channel.socket.nio.WorkerPool"
        factory-bean="poolBuilder" factory-method="build" destroy-method="shutdown">
  </bean>
提示

对于 boss 线程池,存在用于 Netty producers 的 org.apache.camel.component.nettyServerBossPoolBuilder 构建器,以及 org.apache.camel.component.nettyClientBossPoolBuilder,用于 Netty producers。

然后,在 Camel 路由中,通过配置 URI 中的 workerPool 选项,即可引用此 worker 池,如下所示:

    <route>
      <from uri="netty:tcp://0.0.0.0:5021?textline=true&amp;sync=true&amp;workerPool=#sharedPool&amp;orderedThreadPoolExecutor=false"/>
      <to uri="log:result"/>
      ...
    </route>

另外,如果我们有另一个路由,我们可以参考共享 worker 池:

    <route>
      <from uri="netty:tcp://0.0.0.0:5022?textline=true&amp;sync=true&amp;workerPool=#sharedPool&amp;orderedThreadPoolExecutor=false"/>
      <to uri="log:result"/>
      ...
    </route>
  1. 以此类推。