gpt4 book ai didi

java - Netty 连接重试

转载 作者:行者123 更新时间:2023-11-30 04:29:29 27 4
gpt4 key购买 nike

在 Netty 中重试连接

我正在构建一个客户端套接字系统。要求是:第一次尝试连接到远程服务器当第一次尝试失败时,继续尝试,直到服务器上线。

我想知道netty中是否有这样的功能可以做到这一点,或者我该如何最好地解决这个问题。

非常感谢

这是我正在努力解决的代码片段:

protected void connect() throws Exception {

this.bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));

// Configure the event pipeline factory.
bootstrap.setPipelineFactory(new SmpPipelineFactory());

bootstrap.setOption("writeBufferHighWaterMark", 10 * 64 * 1024);
bootstrap.setOption("sendBufferSize", 1048576);
bootstrap.setOption("receiveBufferSize", 1048576);
bootstrap.setOption("tcpNoDelay", true);
bootstrap.setOption("keepAlive", true);
// Make a new connection.
final ChannelFuture connectFuture = bootstrap
.connect(new InetSocketAddress(config.getRemoteAddr(), config
.getRemotePort()));

channel = connectFuture.getChannel();
connectFuture.addListener(new ChannelFutureListener() {

@Override
public void operationComplete(ChannelFuture future)
throws Exception {
if (connectFuture.isSuccess()) {
// Connection attempt succeeded:
// Begin to accept incoming traffic.
channel.setReadable(true);
} else {
// Close the connection if the connection attempt has
// failed.
channel.close();
logger.info("Unable to Connect to the Remote Socket server");
}

}
});
}

最佳答案

假设 netty 3.x 最简单的例子是:

// Configure the client.
ClientBootstrap bootstrap = new ClientBootstrap(
new NioClientSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));


ChannelFuture future = null;

while (true)
{
future = bootstrap.connect(new InetSocketAddress("127.0.0.1", 80));
future.awaitUninterruptibly();
if (future.isSuccess())
{
break;
}
}

显然,您希望为设置最大尝试次数等的循环拥有自己的逻辑。Netty 4.x 的 Bootstrap 略有不同,但逻辑是相同的。这也是同步的、阻塞的,并且忽略InterruptedException;在真实的应用程序中,您可以向 Future 注册一个 ChannelFutureListener,并在 Future 完成时收到通知。

在OP编辑问题后添加:

您有一个正在收到通知的 ChannelFutureListener。如果您想重试连接,则必须让该监听器保留对 Bootstrap 的引用,或者与主线程通信连接尝试失败并让它重试操作。如果您让监听器执行此操作(这是最简单的方法),请注意您需要限制重试次数以防止无限递归 - 它是在 Netty 工作线程的上下文中执行的。如果您再次用尽重试次数,则需要将其传达回主线程;您可以通过 volatile 变量来做到这一点,或者可以使用观察者模式。

在处理异步时,你确实必须同时思考。有很多种方法可以给特定的猫剥皮。

关于java - Netty 连接重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15006303/

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