我误解了DefaultEventExecutorGroup的角色或设置。
我有一个处理程序:
HandlerClass:
public RequestEventHandler extends LongDelayThreadCapable
private final static int SLEEP_IN_SECONDS = 10;
public RequestEventHandler()
{
super(ConfigurationRequestEventHandler.supportedEvent);
}
@Override
public void userEventTriggered(final ConfigurationRequestEvent event) throws Exception
{
System.out.println("CONFIGURATION REQUEST @ " + new Date());
// Simulate a long query to a legacy JDBC connection
Thread.sleep(ConfigurationRequestEventHandler.SLEEP_IN_SECONDS * 1000);
System.out.println("CONFIGURATION ANSWER @ " + new Date());
}
我像这样添加到管道中:
管道添加:
public SetupTest(final List<ChannelHandler> channelHandlers)
{
super();
handlers = channelHandlers;
executorGroup = new DefaultEventExecutorGroup(Constants.EXECUTOR_THREADS);
}
public void initChannel(final ChannelPipeline pipeline) throws Exception
{
Assert.notNull(pipeline, "Pipeline must not be null");
if (handlers != null)
{
for (final ChannelHandler h : handlers)
{
if (h instanceof LongDelayThreadCapable)
{
pipeline.addLast(executorGroup, h.getClass().getSimpleName(), h);
}
else
{
pipeline.addLast(h);
}
}
}
}
我的期望是,如果三个事件快速连续发生,事件将被异步处理,随后该过程的输出将是:
run
CONFIGURATION REQUEST @ [date]
CONFIGURATION REQUEST @ [date]
CONFIGURATION REQUEST @ [date]
CONFIGURATION ANSWER
CONFIGURATION ANSWER
CONFIGURATION ANSWER
但输出表示串行处理:
run
CONFIGURATION REQUEST @ [date]
CONFIGURATION ANSWER
CONFIGURATION REQUEST @ [date]
CONFIGURATION ANSWER
CONFIGURATION REQUEST @ [date]
CONFIGURATION ANSWER
我已经看到一些帖子,其中有讨论和声明,Netty 4.0将始终使用单个线程。这似乎与这个EventGroup的想法相矛盾。
是否可以同时进行多个长查询,如果是,我们如何将各个部分连接在一起以提供此功能?
答案 0 :(得分:2)
它会对同一个Channel使用相同的EventExecutor,否则你可能会对你的处理程序进行无序处理,这不是你想要的TCP。如果你真的想这样做,只需在你的处理程序中使用你自己的Executor并手动发送东西。