0

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

例如:

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

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

当 handler1 和 2 访问同一个对象时,OrderedMemoryAwareThreadPoolExecutor 会处理线程并发吗?

4

2 回答 2

1

您应该为每个 ChannelFactory 使用一个 ExecutionHandler,因为 OrderedMemoryAwareThreadPoolExecutor 使用 Channel id 来查找给定 Channel 的正确 Executor。Channel id 仅在每个 ChannelFactory 中是唯一的,因此如果您在不同的 ChannelFactories 之间共享它,可能会产生不好的副作用。

于 2012-04-18T09:56:00.893 回答
0

共享 OrderedMemoryAwareThreadPoolExecutor 在两个 ChannelFactory 中不能进行线程间的同步。Channel 有其专属的任务队列,OrderedMemoryAwareThreadPoolExecutor 只保证一个通道的事件(队列中的任务)有序执行。它不能证明两个通道的两个任务队列中的任务是有序执行的。不同队列中的任务访问同一个对象是不能同步的。

于 2012-04-18T11:36:26.230 回答