Netty 4在线程池中运行阻塞操作的代码

Netty 4在线程池中运行阻塞操作的代码,netty,Netty,该文件没有提供关于不同类型执行人的任何详细信息。我想要的是有一个基于可配置线程池的执行器,很像netty 3中的MemoryWareThreadPoolExecutor 我该怎么做?当您向管道中添加处理程序时,可以指定一个EventExecutorGroup以及处理程序: EventExecutorGroup executor = new DefaultEventExecutorGroup(...); ... ChannelPipeline p = ch.pipeline(); p.addLa

该文件没有提供关于不同类型执行人的任何详细信息。我想要的是有一个基于可配置线程池的执行器,很像netty 3中的MemoryWareThreadPoolExecutor


我该怎么做?

当您向管道中添加处理程序时,可以指定一个
EventExecutorGroup
以及处理程序:

EventExecutorGroup executor = new DefaultEventExecutorGroup(...);
...

ChannelPipeline p = ch.pipeline();
p.addLast(executor, new MyHandler());
EventExecutorGroup
OrderedMemoryAwareThreadPoolExecutor
类似,只是它不强制执行任何内存约束。您必须实现自己的处理程序来强制执行内存约束-
MemoryWareThreadPoolExecutor
效率不高,经常出现性能问题


由于Netty 4中的所有处理程序方法都是为同一个连接顺序调用的,因此不能替换
MemoryWareThreadPoolExecutor
。如果希望无序执行,则必须将任务交给
java.util.concurrent.Executor
。此决定是有意的-否则处理程序实现无法对线程安全进行任何消耗。

DefaultEventExecutor不是公共的。我找不到一个真正适用于最新CR1的示例。我使用的是DefaultEventExecutorGroup,这看起来很有效,但让我想知道我到底应该在这里做什么。此外,Netty提交了一个OneTimeTask,其中包含返回AbstractChannelHandlerContext的getValue()。我找不到明显的方法来抓取调用到处理程序的msg对象。您唯一可以访问此对象的地方是处理程序上的read方法,如果您想计算进入队列而不是离开队列的字节数,则该方法太迟了。