最近把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