当前位置: 首页 > 知识库问答 >
问题:

在netty中,如何使用单独的任务执行器来阻塞子任务?

爱琪
2023-03-14

情况:考虑到telnet客户端

这是Netty 4!

通道处理程序在一段时间内阻塞线程,而不是echo回复消息(就像telnet服务器演示所做的那样)(在现实世界中,像JDBC或JSch,...).

try { Thread.sleep(3000); } catch (InterruptedException e) {};
future = ctx.write("Task finished at " + new Date());
future.addListener(ChannelFutureListener.CLOSE);

这实际上是可行的:我正在用echo“Hello”|nc-localhost$port)测试它,线程将被阻塞(并且ncwaitis),直到3秒钟后返回。

然而,这意味着我正在用一个不相关的任务阻塞Netty的事件循环工作组的线程。

因此,我更改了频道注册并应用了自定义执行器:

public class TelnetServerInitializer extends ChannelInitializer<SocketChannel> {

    private static final StringDecoder DECODER = new StringDecoder();
    private static final StringEncoder ENCODER = new StringEncoder();

    private TelnetServerHandler serverHandler;
    private EventExecutorGroup executorGroup;

    public TelnetServerInitializer() {
        executorGroup = new DefaultEventExecutorGroup(10);
        serverHandler = new TelnetServerHandler();
    }

    @Override
    protected void initChannel(final SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();

        pipeline.addLast("framer", new DelimiterBasedFrameDecoder(
            8192, Delimiters.lineDelimiter()));

        pipeline.addLast("decoder", DECODER);
        pipeline.addLast("encoder", ENCODER);

        // THIS!
        pipeline.addLast(executorGroup, "handler", serverHandler);
    }
}

不幸的是,在此配置后,套接字将在退出处理程序的< code>channelRead0()后立即关闭。我可以看到任务本身将被处理,包括调用处理程序的事件方法。但是相应的通道已经与客户端断开连接(我的< code>nc命令已经退出)。

整合另一个执行者是如何工作的?我是否遗漏了一个细节?

共有1个答案

韦宏扬
2023-03-14

您的网络服务器正在按预期工作,这是回显|您正在测试的nc命令正在提前退出。

尝试使用“telnet localhost 3000”与您的测试服务器进行交互会话,输入一些文本,您将看到在延迟后会写入正确的响应,然后通道关闭。

或者只需使用“nc -v -w10 localhost 3000”,写一些文本,按回车键,在延迟和频道关闭后,您再次看到预期的输出。

 类似资料:
  • 我正在使用以下项目结构 子模块包含在设置中。gradle,并在内部版本中配置。根项目的渐变。 我有3个任务要做 (每个子项目都有这个) (这是每个子项目都需要自己工作的打包机制) (这只需要调用一次) 我想能够打电话 $gradle部署 build.gradle

  • 我正在使用Spring Cloud Data Flow来协调任务应用程序的执行,并且需要用它自己的资源配额(有些可能是有保证的,有些是不稳定的)在它的专用名称空间中运行每个任务应用程序。 按照Spring Cloud Data Flow Tasks Configuration中的指南,并使用timestamp-task docker映像,我在中有以下配置 但是,当我使用参数启动任务时,任务仍然在运

  • 我有代码: 年级4.5.1对此警告为 但是link没有给我任何可以替换它的提示,因为我不能仅仅设置任务依赖项,比如dependsOn或FinalizdBy--它不是从其他任务调用的,而是从构建的末尾调用的。

  • 在我的用例中,我有一个带有Reactor Netty的Spring Webflux微服务,我有以下依赖项: null 由于(版本0.7.6版)已包含在最新的(版本2.0.1版)中,因此不能再使用:,请参阅->https://github.com/reactor/reactor-netty/issues/312 我的代码段: 这适用于版本2.0.0.release,但由于升级到版本2.0.1.rel

  • 请注意:虽然我更喜欢使用Akka的JavaAPI的解决方案(这就是我正在使用的),但我对任何工作解决方案都很满意,并且可能会想出如何将基于Scala的答案翻译成Java。 我有一个Akka应用程序,有很多演员,其中两个是和。actor可以接受两种类型的消息: ;和 执行器简单地接受一条消息。这些参与者和系统其他部分之间的消息流如下: 任何东西(其他参与者,甚至参与者系统之外的事件驱动组件)都可以随

  • 我有一个需要执行一些业务逻辑的处理程序,我希望它在单独的线程池中执行,以不阻塞io事件循环。我已将DefaultEventExecutorGroup添加到管道中,如http://netty.io/4.0/api/io/netty/channel/ChannelPipeline.htmljavadoc和http://netty.io/wiki/new-and-noteworthy-in-4.0.ht