简单场景:
- 扩展 SimpleChannelUpstreamHandler 的较低级别的类 A。此类是发送消息和接收响应的主力。
-
系统其他部分可以使用顶级类 B 来发送和接收消息(可以模拟同步和异步)。此类创建 ClientBootstrap、设置管道工厂、调用 bootstrap.connect() 并最终获取用于发送和接收消息的类 A 的句柄/引用。就像是:
ChannelFuture future = bootstrap.connect();
Channel channel = future.awaitUninterruptibly().getChannel();
处理程序=channel.getPipeline().get(A.class);
我知道在 A 类中,我可以覆盖
公共无效channelClosed(ChannelHandlerContext ctx,ChannelStateEvent e);
这样当远程服务器出现故障时,我可以收到通知。
由于通道关闭后,B类中原来的A类引用(上面的处理程序)不再有效,所以我需要用新的引用替换它。
理想情况下,我希望 A 类有一种机制在上述重写的 ChannelClosed 方法中通知 B 类,以便可以在 B 类中再次调用 bootstrap.connect 。实现此目的的一种方法是在 A 类中引用 B 类为此,我需要将 B 类引用传递给 PipelineFactory,然后让 PipelineFactory 将 B 的引用传递给 A。
还有其他更简单的方法可以实现同样的目标吗?
thanks,
Channel.closeFuture()
返回一个ChannelFuture
当频道关闭时,它会通知您。您可以添加一个ChannelFutureListener
到 B 中的未来,以便您可以在那里进行另一次连接尝试。
您可能想重复此操作,直到连接尝试最终成功:
private void doConnect() {
Bootstrap b = ...;
b.connect().addListener((ChannelFuture f) -> {
if (!f.isSuccess()) {
long nextRetryDelay = nextRetryDelay(...);
f.channel().eventLoop().schedule(nextRetryDelay, ..., () -> {
doConnect();
}); // or you can give up at some point by just doing nothing.
}
});
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)