gpt4 book ai didi

java - 为什么 Netty 客户端连接 future.operationComplete 在调用者线程中被调用?

转载 作者:行者123 更新时间:2023-12-01 15:06:17 25 4
gpt4 key购买 nike

下面我演示了如何使用 Netty NioClientSocketChannelFactory 进行连接。 Connect 返回一个 future,我可以检查是否连接成功/失败。

我的理解是连接过程是非锁定的,因此操作Complete方法将由netty线程调用(不在调用者线程内),因此调用者线程将退出。

大多数时候,在我拥有的各种 Windows 部署上,它都是这样工作的。

但是在其中一个部署中,我注意到当连接失败时,在我的调用者线程而不是 netty 线程中调用 operationComplete 方法。抛出的异常也会在调用者线程中捕获。我没想到会这样。

在我的代码中,当连接失败时,我会重新尝试连接(下面未演示)...并且由于它发生在我的调用者线程中,所以我永远不会从连接调用中返回,因为operationComplete 在我的调用者线程中被调用。

我做错了什么?注意-我在任何地方都没有 future.awaitUninterruptically 调用。

public static void main(String[] args)
{
String host = "localhost";
int port = 5555;
ChannelFactory factory = new NioClientSocketChannelFactory(Executors
.newCachedThreadPool(), Executors.newCachedThreadPool());
MyHandler handler = new MyHandler();
PipelineFactory factory = new PipelineFactory(handler);
ClientBootstrap bootstrap = new ClientBootstrap(factory);
ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));

future.addListener(new ChannelFutureListener()
{
@Override
public void operationComplete(ChannelFuture future) throws Exception
{
if (future.isSuccess()) {
// SUCCESS
}
else
{
// FAILURE
}
}
});
}

最佳答案

您不应假设实际的 ChannelFutureListener 在哪个线程中得到通知。大多数情况下,这将是 Netty 的 IO 线程(工作线程),但有时这也可以是调用者线程。

我仍然不明白为什么在这种情况下它不会“返回”给你。

关于java - 为什么 Netty 客户端连接 future.operationComplete 在调用者线程中被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12905227/

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