gpt4 book ai didi

java - 如何使用单独的任务执行器来阻止 netty 中的子任务?

转载 作者:行者123 更新时间:2023-11-30 09:07:55 25 4
gpt4 key购买 nike

情况:鉴于官方 repo (https://github.com/netty/netty/tree/4.0/example/src/main/java/io/netty/example/telnet) 的 telnet 客户端和服务器示例,我使用假阻塞任务对此做了一些更改:https://github.com/knalli/netty-with-bio-task/tree/master/src/main/java/de/knallisworld/poc

这是 Netty 4!

channel 处理程序不是回显回复消息(就像 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) 并且线程将被阻塞(并且 nc 等待)直到它在 3 秒后返回。

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

因此,我更改了 channel 注册并应用了自定义执行程序:

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

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

集成另一个执行器如何工作?我是否遗漏了一个细节?

最佳答案

您的 netty 服务器正在按预期工作,它是 echo |您正在测试的 nc 命令提前退出。

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

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

关于java - 如何使用单独的任务执行器来阻止 netty 中的子任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23823574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com