LCN5.0重连问题

最近把lcn4.0版本更新到5.0版本后,出现一个问题:

LCN4.0版本在客户端启动时如果找不到tx-manager,默认会一直重试,但更新到5.0版本后默认只会重试8次,并且无法设置无限重试。

这样就限制了客户端要在tx-manager之前启动,并且如果lcn没有集群,并且挂了的话,启动lcn后还得把客户端都重启一遍,个人觉得这样不好。

官方目前还没有优化这个功能,本人只能通过修改部分源码先凑合着用,期待官方尽早优化!

相信各位也都下载了tx-lcn,如果不下载修改txlcn-tm里面的数据库配置和redis配置,估计也没法用,下面是修改的代码:

1、在txlcn-txmsg-netty模块下找到NettyRpcClientInitializer.connect(),下面只贴出修改后的代码:

@Override
    public synchronized Optional<Future> connect(SocketAddress socketAddress) {
        //原代码,lcn通过配置reconnectCount来设置重试次数,而这个重试次数就是由这个for循环去使用
        //for (int i = 0; i < rpcConfig.getReconnectCount(); i++) {
        //下面两行是修改后的代码,
        int i = 0;
        while (!rpcConfig.isReconnectLimit() ||     (rpcConfig.isReconnectLimit() && i < rpcConfig.getReconnectCount())){
            if (SocketManager.getInstance().noConnect(socketAddress)) {
                try {
                    //修改后的代码,将i+1改为++i
                    log.info("Try connect socket({}) - count {}", socketAddress, ++i);
                    Bootstrap b = new Bootstrap();
                    b.group(workerGroup);
                    b.channel(NioSocketChannel.class);
                    b.option(ChannelOption.SO_KEEPALIVE, true);
                    b.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);
                    b.handler(nettyRpcClientChannelInitializer);
                    return Optional.of(b.connect(socketAddress).syncUninterruptibly());
                } catch (Exception e) {
                    log.warn("Connect socket({}) fail. {}ms latter try again.", socketAddress, rpcConfig.getReconnectDelay());
                    try {
                        Thread.sleep(rpcConfig.getReconnectDelay());
                    } catch (InterruptedException e1) {
                        e1.printStackTrace();
                    }
                    continue;
                }
            }
            // 忽略已连接的连接
            return Optional.empty();
        }

        log.warn("Finally, netty connection fail , socket is {}", socketAddress);
        clientInitCallBack.connectFail(socketAddress.toString());
        return Optional.empty();
    }

2、在txlcn-txmsg模块下找到RpcConfig类,只贴出修改后的代码

@NoArgsConstructor
@Data
public class RpcConfig {
    /**
     * 最大等待时间 (ms)
     */
    private long waitTime = -1;

    /**
     * 最大缓存锁的数量
     */
    private int cacheSize = 1024;

    /**
     * appName 参数延迟删除时间(ms)
     */
    private long attrDelayTime = -1;

    /**
     * 断线重连次数
     */
    private int reconnectCount = 8;

    /**
     * 重连延迟时间(ms)
     */
    private long reconnectDelay = 6000;

    /**
     * 是否限制断线重连次数
     */
    private boolean reconnectLimit = false;


}

RpcConfig类就是配置重试属性的类,原RpcConfig中没有reconnectLimit属性,这个属性是自己加的,就是用于配置重连次数限制

加上这个属性之后,可以在引用了tx-lcn的模块上配置这个属性,例:

tx-lcn.message.netty.reconnect-limit=false

猜你喜欢

转载自www.cnblogs.com/jagerLan/p/10606115.html
今日推荐