最近把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 Optionalconnect(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@Datapublic 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