|
@@ -2,14 +2,7 @@ package wei.yigulu.netty;
|
|
|
|
|
|
|
|
|
|
import io.netty.channel.ChannelFuture;
|
|
import io.netty.channel.ChannelFuture;
|
|
-import io.netty.channel.ChannelFutureListener;
|
|
|
|
import io.netty.util.internal.StringUtil;
|
|
import io.netty.util.internal.StringUtil;
|
|
-import lombok.AllArgsConstructor;
|
|
|
|
-import lombok.NoArgsConstructor;
|
|
|
|
-import org.slf4j.Logger;
|
|
|
|
-import wei.yigulu.utils.FutureListenerReconnectThreadPool;
|
|
|
|
-
|
|
|
|
-import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
* 负责监听启动时连接失败,重新连接功能
|
|
* 负责监听启动时连接失败,重新连接功能
|
|
@@ -18,62 +11,53 @@ import java.util.concurrent.TimeUnit;
|
|
* @author 修唯xiuwei
|
|
* @author 修唯xiuwei
|
|
* @version 3.0
|
|
* @version 3.0
|
|
*/
|
|
*/
|
|
-@AllArgsConstructor
|
|
|
|
-public class HSConnectionListener implements ChannelFutureListener {
|
|
|
|
-
|
|
|
|
- private Logger log;
|
|
|
|
|
|
+public class HSConnectionListener extends ProtocolConnectionListener<AbstractHSTcpMasterBuilder> {
|
|
|
|
|
|
- private final AbstractHSTcpMasterBuilder masterBuilder;
|
|
|
|
|
|
|
|
private int retryTimes;
|
|
private int retryTimes;
|
|
|
|
|
|
/**
|
|
/**
|
|
- * Hs connection listener
|
|
|
|
|
|
+ * Only host connection listener
|
|
*
|
|
*
|
|
* @param masterBuilder master builder
|
|
* @param masterBuilder master builder
|
|
*/
|
|
*/
|
|
public HSConnectionListener(AbstractHSTcpMasterBuilder masterBuilder) {
|
|
public HSConnectionListener(AbstractHSTcpMasterBuilder masterBuilder) {
|
|
- this.masterBuilder = masterBuilder;
|
|
|
|
- this.log = masterBuilder.getLog();
|
|
|
|
|
|
+ super(masterBuilder);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
- public void operationComplete(ChannelFuture channelFuture) throws Exception {
|
|
|
|
- if (channelFuture == null || channelFuture.channel() == null || !channelFuture.channel().isActive()) {
|
|
|
|
- FutureListenerReconnectThreadPool.getInstance().submitReconnectJob(masterBuilder,(() -> {
|
|
|
|
- try {
|
|
|
|
- if (masterBuilder.future == null || !masterBuilder.future.channel().isActive()) {
|
|
|
|
- if (this.retryTimes < 10) {
|
|
|
|
- log.error("服务端{}:{}链接不上,开始重连操作,第{}次尝试", this.masterBuilder.getIp(), this.masterBuilder.getPort(), retryTimes);
|
|
|
|
- masterBuilder.create();
|
|
|
|
- log.warn("重试连接失败");
|
|
|
|
- this.retryTimes++;
|
|
|
|
- } else {
|
|
|
|
- if (!StringUtil.isNullOrEmpty(this.masterBuilder.getSpareIp()) || (this.masterBuilder.getSparePort() != null && this.masterBuilder.getSparePort() != 0)) {
|
|
|
|
- log.info("服务端{}:{}链接不上,切换主备机{}:{}", this.masterBuilder.getIp(), this.masterBuilder.getPort(), this.masterBuilder.getSpareIp(), this.masterBuilder.getSparePort());
|
|
|
|
- this.masterBuilder.switchover();
|
|
|
|
- }
|
|
|
|
- this.masterBuilder.refreshLoopGroup();
|
|
|
|
- this.retryTimes = 0;
|
|
|
|
- masterBuilder.create();
|
|
|
|
- log.info("重置重试次数=0");
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- log.warn("masterBuilder在延迟过程中已由其他线程连接成功,此处略过重连");
|
|
|
|
|
|
+ protected void reconnectFuture(ChannelFuture channelFuture) {
|
|
|
|
+ try {
|
|
|
|
+ if (masterBuilder.future == null || !masterBuilder.future.channel().isActive()) {
|
|
|
|
+ log.warn("开始执行{}重连任务", masterBuilder.builderId);
|
|
|
|
+ if (this.retryTimes < 10) {
|
|
|
|
+ log.error("服务端{}:{}链接不上,开始重连操作,第{}次尝试", this.masterBuilder.getIp(), this.masterBuilder.getPort(), retryTimes);
|
|
|
|
+ masterBuilder.createByUnBlock();
|
|
|
|
+ log.warn("重试连接失败");
|
|
|
|
+ this.retryTimes++;
|
|
|
|
+ } else {
|
|
|
|
+ if (!StringUtil.isNullOrEmpty(this.masterBuilder.getSpareIp()) || (this.masterBuilder.getSparePort() != null && this.masterBuilder.getSparePort() != 0)) {
|
|
|
|
+ log.info("服务端{}:{}链接不上,切换主备机{}:{}", this.masterBuilder.getIp(), this.masterBuilder.getPort(), this.masterBuilder.getSpareIp(), this.masterBuilder.getSparePort());
|
|
|
|
+ this.masterBuilder.switchover();
|
|
}
|
|
}
|
|
- } catch (Exception e) {
|
|
|
|
- log.error("ModbusMaster重试连接时发生异常", e);
|
|
|
|
this.masterBuilder.refreshLoopGroup();
|
|
this.masterBuilder.refreshLoopGroup();
|
|
this.retryTimes = 0;
|
|
this.retryTimes = 0;
|
|
- try {
|
|
|
|
- operationComplete(channelFuture);
|
|
|
|
- } catch (Exception ex) {
|
|
|
|
- ex.printStackTrace();
|
|
|
|
- }
|
|
|
|
|
|
+ masterBuilder.createByUnBlock();
|
|
|
|
+ log.info("重置重试次数=0");
|
|
}
|
|
}
|
|
- }));
|
|
|
|
- } else {
|
|
|
|
- log.info("服务端{}:{}链接成功...", this.masterBuilder.getIp(), this.masterBuilder.getPort());
|
|
|
|
|
|
+ } else {
|
|
|
|
+ log.warn("masterBuilder在延迟过程中已由其他线程连接成功,此处略过重连");
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("ModbusMaster重试连接时发生异常", e);
|
|
|
|
+ this.masterBuilder.refreshLoopGroup();
|
|
|
|
+ this.retryTimes = 0;
|
|
|
|
+ try {
|
|
|
|
+ operationComplete(channelFuture);
|
|
|
|
+ } catch (Exception ex) {
|
|
|
|
+ ex.printStackTrace();
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|