我的服务器有两个不同类型的客户端,它们有不同的消息格式,因此服务器中有两个NioServerSocketChannelFactory分别处理两个类型的客户端请求。这两种类型的客户端需要在两个NioServerSocketChannelFactory的处理程序中访问同一个对象。我可以在两个ChannelPipelines中共享相同的OrderedMemoryAwareThreadPoolExecutor对象吗?
例如:
Channels.pipeline(
concurrencyHandler,
new Handler1());
}
Channels.pipeline(
concurrencyHandler,
new Handler2());
}
OrderedMemoryAwareThreadPoolExecutor会在handler1&amp ;;处理线程并发。 2访问同一个对象?
答案 0 :(得分:1)
每个ChannelFactory应该使用一个ExecutionHandler,因为OrderedMemoryAwareThreadPoolExecutor使用Channel id为给定的Channel查找正确的Executor。频道ID只对每个ChannelFactory唯一,因此如果您在不同的ChannelFactories中共享它,可能会产生不良副作用。
答案 1 :(得分:0)
在两个ChannelFactory中共享OrderedMemoryAwareThreadPoolExecutor无法在线程之间进行同步。 Channel具有其独占任务队列,OrderedMemoryAwareThreadPoolExecutor仅确保一个通道的事件(队列中的任务)按顺序执行。它不能证明两个通道的两个任务队列中的任务有序执行。不同队列中的任务访问一个对象无法同步。