在Netty 4.0中正确设置DefaultEventExecutorGroup

时间:2014-09-10 12:24:43

标签: netty

我误解了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的想法相矛盾。

是否可以同时进行多个长查询,如果是,我们如何将各个部分连接在一起以提供此功能?

1 个答案:

答案 0 :(得分:2)

它会对同一个Channel使用相同的EventExecutor,否则你可能会对你的处理程序进行无序处理,这不是你想要的TCP。如果你真的想这样做,只需在你的处理程序中使用你自己的Executor并手动发送东西。