JestClient之HTTP长连接判断

目的:
判断jestclient连接ES集群时,是HTTP短连接,还是HTTP长连接。

为什么要判断:
因为如果是短连接,我们需要连接池控制连接数,防止大量请求,重复创建连接导致系统崩溃;如果是长连接,我们需要注意如果长连接断开,该组件是否具备自动重连机制,防止生产因为长连接断开而导致不可补救的错误。

验证步骤:
第一步,验证是否为长连接:
通过jestclientES集群里重复连续插入300000条数据,观察循环中,该进程的连接端口号是否一直在变化;如果端口号一直变化,说明是短连接,否则是长连接。
下面请看测试代码:

/**
 * 〈一句话功能简述〉操作ES的Jest客户端<br>
 * 〈功能详细描述〉
 *
 * @author wangzha
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
@Service
public class JestService<T> implements InitializingBean {

    public static Logger logger = LoggerFactory.getLogger(JestService.class);

    /**
     * jest客户端,单例
     */
    public JestClient client = null;

    @Value("${es.cluster}")
    private String cluster;

    /**
     * es 读取超时时间
     */
    private static final String ES_READ_TIMEOUT = "es.read.timeout";

    /**
     * es 连接超时时间
     */
    private static final String ES_CONNECT_TIMEOUT = "es.connect.timeout";

    @Override
    public void afterPropertiesSet() throws Exception {
        init();
    }

    /**
     * 客户端初始化
     */
    public void init() {
        logger.info("ESJestClient Init Start...");
        synchronized (JestService.class) {
            if (client != null)
                return;
//            String[] uriArr = cluster.split(Symbols.COMMA);
            String[] uriArr = new String[]{"http://10.37.2.142:9900",
                    "http://10.37.2.143:9900", "http://10.37.2.144:9900"};
            if (uriArr.length > 0) {
                Set<String> serverUris = new LinkedHashSet<String>(Arrays.asList(uriArr));
                JestClientFactory factory = new JestClientFactory();
                factory.setHttpClientConfig(new HttpClientConfig.Builder(serverUris)
//                        .connTimeout(SCMServiceCfg.getNodeTransInt(ES_CONNECT_TIMEOUT))
//                        .readTimeout(SCMServiceCfg.getNodeTransInt(ES_READ_TIMEOUT))
                        .connTimeout(1000)
                        .readTimeout(10000)
                        .multiThreaded(true)
                        .build());
                client = factory.getObject();
                logger.info(String.format("ESJestClient init success,ip:[%s]", uriArr));
            } else {
                throw new AppException("ESJestClient init error,uri is null,Check scm ! ", ResponseCode.FAIL.getCode());
            }
        }
    }

    /**
     * 资源释放
     */
    public void destory() {
        if (client != null) {
            client.shutdownClient();
            logger.debug("ESJestClient destory ! ");
        }
    }


    /**
     * 插入单条数据
     * 若该条数据已经存在,则覆盖。
     *
     * @param t
     * @return
     */
    public boolean insertOrUpdateDoc(T t, String uniqueId, String index, String type) {
        //是否插入成功标识
        boolean flag = false;
        Index.Builder builder = new Index.Builder(t);
        builder.id(uniqueId);
        builder.refresh(true);
        Index indexDoc = builder.index(index).type(type).build();
        JestResult result;
        try {
            result = client.execute(indexDoc);
            if (result != null && result.isSucceeded())
                flag = true;
        } catch (Exception e) {
            logger.error("ESJestClient insertDoc exception", e);
        }
        return flag;
    }

    public static void main(String[] args) {
        JestService service = new JestService();
        service.init();
        ServiceLogEntity serviceLogEntity = new ServiceLogEntity();
        serviceLogEntity.setResponseTime(new Date());
        serviceLogEntity.setRequestTime(new Date());
        serviceLogEntity.setOutBizNo("1");
        serviceLogEntity.setChannelResponseCode("0");
        serviceLogEntity.setServiceResponseCode("0000");
        serviceLogEntity.setGateWay("3");
        serviceLogEntity.setSource("4");
        serviceLogEntity.setAppCode("5");
        serviceLogEntity.setId("11");
        for(int i=0;i<300000;i++){
            System.out.println("第"+i+"次操作");
              service.insertOrUpdateDoc(serviceLogEntity,serviceLogEntity.getId(),"sfeicuss"
              ,"servicelog");
        }
    }

}

运行结果:
这里写图片描述

再通过cmd,敲入命令netstat -ano|findstr TCP 查看我们正在运行的这个进程。

String[] uriArr = new String[]{"http://10.37.2.142:9900",
                    "http://10.37.2.143:9900", "http://10.37.2.144:9900"};

查看进程中,服务端的地址和ES集群地址相同的那个进程即是我们要寻找的。
这里写图片描述
显然这里是9768这个进程。

再重复敲入命令查看该进程netstat -ano|findstr TCP|findstr 9768
我们发现在程序运行过程中,即不断地向ES集群发送HTTP请求的过程中,端口号不变。说明jestclient和ES建立的连接为长连接。

第二步,验证是否自动重连:
我们手动断开网络
这里写图片描述
查看程序运行情况,可以看到HTTP连接已经爆出网络不可用了
这里写图片描述

接下来我们将网络重连,程序恢复正常,说明jestclient的长连接具备自动重连机制
这里写图片描述

因为重连,此时端口号和之前的已经不同了
这里写图片描述

阅读更多
换一批

没有更多推荐了,返回首页