创建原则:
每一个JAXRSClientFactoryBean只创建一个Client,不要创建多个,如需要多线程访问则预先调用JAXRSClientFactoryBean的setThreadSafe(true)开启多线程支持
原因:
同一个JAXRSClientFactoryBean对象创建的Client会共用同一个ConduitSelector
每次创建Client都会调用getConduitSelector(Endpoint ep)方法来给共用的ConduitSelector设置新的Endpoint,导致上次设置的被覆盖
连接资源管理机制的Bug:
默认情况下,由JAXRSClientFactoryBean创建出来的Client在一个请求完成后,不会调用关闭连接的逻辑,即使调用了Client的Close()方法也无法立即将连接释放,由此导致JVM连接池无法及时复用连接。
所以,我们需要取消Client的连接保持机制,使得每个请求完成后立即释放连接资源以便JVM复用连接,想要达到这个目的就需要在创建JAXRSClientFactoryBean的时候,设置自定义ConduitSelector,该自定义ConduitSelector需要重写AbstractConduitSelector的public void complete(Exchange exchange)方法,将传入的exchange的值做如下设置:exchange.put(KEEP_CONDUIT_ALIVE, false);
每一个JAXRSClientFactoryBean只创建一个Client,不要创建多个,如需要多线程访问则预先调用JAXRSClientFactoryBean的setThreadSafe(true)开启多线程支持
原因:
同一个JAXRSClientFactoryBean对象创建的Client会共用同一个ConduitSelector
每次创建Client都会调用getConduitSelector(Endpoint ep)方法来给共用的ConduitSelector设置新的Endpoint,导致上次设置的被覆盖
连接资源管理机制的Bug:
默认情况下,由JAXRSClientFactoryBean创建出来的Client在一个请求完成后,不会调用关闭连接的逻辑,即使调用了Client的Close()方法也无法立即将连接释放,由此导致JVM连接池无法及时复用连接。
所以,我们需要取消Client的连接保持机制,使得每个请求完成后立即释放连接资源以便JVM复用连接,想要达到这个目的就需要在创建JAXRSClientFactoryBean的时候,设置自定义ConduitSelector,该自定义ConduitSelector需要重写AbstractConduitSelector的public void complete(Exchange exchange)方法,将传入的exchange的值做如下设置:exchange.put(KEEP_CONDUIT_ALIVE, false);
图例: