Netty 4.0中DefaultEventExecutorGroup的正确设置

Netty 4.0中DefaultEventExecutorGroup的正确设置,netty,Netty,我误解了DefaultEventExecutor组的角色或设置 我有一个处理程序: 手柄类: public RequestEventHandler extends LongDelayThreadCapable private final static int SLEEP_IN_SECONDS = 10; public RequestEventHandler() { super(ConfigurationRequestEventHandler.supportedEvent); } @

我误解了DefaultEventExecutor组的角色或设置

我有一个处理程序:

手柄类:

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);
            }
        }
    }

}
我将其添加到管道中,如下所示:

管道添加:

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 ANSWER
CONFIGURATION REQUEST @ [date]
CONFIGURATION ANSWER
CONFIGURATION REQUEST @ [date]
CONFIGURATION ANSWER
我已经看到了一些帖子,其中有讨论和声明Netty 4.0将始终使用单个线程。这似乎与这个活动组的想法相矛盾


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

它将对同一通道使用相同的EventExecutor,否则您可能会对处理程序进行无序处理,而这不是您想要的TCP。如果您真的想这样做,只需在处理程序中使用您自己的Executor并手动分派内容。

因此,DefaultEventExecutorGroup中分配的多个线程实际上说明了有多少快速连续调用可以从多个通道传入。因此,如果10个通道有类似的请求,那么它们将被异步处理。但是,当所有事件都发生在同一个通道中时,它们会被串行处理,以保持正确的顺序。对