Apache CXF uncorrelatedExchanges持续增长致内存耗尽问题求助
针对你遇到的org.apache.cxf.ws.addressing.soap.MAPCodec中uncorrelatedExchanges条目持续增长的问题,在CXF 3.4.0版本中可以通过以下几种方式处理:
1. 配置WS-Addressing特性的超时参数
uncorrelatedExchanges用于暂存未找到匹配请求的响应消息,默认无自动清理超时设置,导致条目堆积。你可以通过配置WS-Addressing特性的timeout参数,让框架自动清理超时的未关联条目:
Spring XML配置方式:
<jaxws:client id="yourClient" serviceClass="com.your.ServiceInterface" address="http://device-address"> <jaxws:features> <bean class="org.apache.cxf.ws.addressing.WSAddressingFeature"> <!-- 设置超时时间(单位:毫秒),示例为5分钟 --> <property name="timeout" value="300000"/> </bean> </jaxws:features> </jaxws:client>代码编程方式:
WSAddressingFeature addressingFeature = new WSAddressingFeature(); // 设置5分钟超时 addressingFeature.setTimeout(300000); YourServiceInterface client = ClientProxyFactoryBean.create(YourServiceInterface.class, "http://device-address", addressingFeature);
配置后,MAPCodec会定期检查并清理超过超时时间的uncorrelatedExchanges条目。
2. 手动触发清理逻辑
如果自动清理的频率或时机不符合需求,可通过定时任务手动调用MAPCodec的cleanup()方法清理超时条目:
// 从CXF Bus中获取MAPCodec实例 MAPCodec mapCodec = BusFactory.getDefaultBus().getExtension(MAPCodec.class); // 定时执行清理,示例为每1小时执行一次 ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate(mapCodec::cleanup, 0, 3600, TimeUnit.SECONDS);
注意:若使用多个Bus,需对应获取目标Bus的MAPCodec实例,确保清理的是当前客户端/服务端使用的对象。
3. 排查根源减少未关联条目产生
大量uncorrelatedExchanges堆积往往源于业务层面问题,建议同步排查:
- 检查物理设备返回的响应是否符合WS-Addressing规范,是否正确携带与请求对应的
RelatesTo头,确保响应能和请求正确关联。 - 调整客户端请求超时时间,避免请求超时后设备后续返回的响应无法匹配,进而进入
uncorrelatedExchanges。 - 排查是否存在重复发送请求、设备重复返回响应的情况,这类场景也会导致未关联条目增多。
内容的提问来源于stack exchange,提问作者kc7bfi
相关产品推荐
相关产品推荐

