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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM