在不同的ChannelPipeline中共享ExecutionHandler

时间:2012-04-18 02:39:31

标签: java netty

我的服务器有两个不同类型的客户端,它们有不同的消息格式,因此服务器中有两个NioServerSocketChannelFactory分别处理两个类型的客户端请求。这两种类型的客户端需要在两个NioServerSocketChannelFactory的处理程序中访问同一个对象。我可以在两个ChannelPipelines中共享相同的OrderedMemoryAwareThreadPoolExecutor对象吗?

例如:

Channels.pipeline(
    concurrencyHandler,
    new Handler1());
}

Channels.pipeline(
    concurrencyHandler,
    new Handler2());
}

OrderedMemoryAwareThreadPoolExecutor会在handler1&amp ;;处理线程并发。 2访问同一个对象?

2 个答案:

答案 0 :(得分:1)

每个ChannelFactory应该使用一个ExecutionHandler,因为OrderedMemoryAwareThreadPoolExecutor使用Channel id为给定的Channel查找正确的Executor。频道ID只对每个ChannelFactory唯一,因此如果您在不同的ChannelFactories中共享它,可能会产生不良副作用。

答案 1 :(得分:0)

在两个ChannelFactory中共享OrderedMemoryAwareThreadPoolExecutor无法在线程之间进行同步。 Channel具有其独占任务队列,OrderedMemoryAwareThreadPoolExecutor仅确保一个通道的事件(队列中的任务)按顺序执行。它不能证明两个通道的两个任务队列中的任务有序执行。不同队列中的任务访问一个对象无法同步。