Web服务中客户端的CXF总线 - 内存泄漏

时间:2014-11-17 14:02:57

标签: web-services memory-leaks jboss cxf

我有一个Jax-WS服务需要使用CXF客户端调用另一个JAX-WS服务。由于此客户端需要其他WS- *功能,例如WS-Trust,因此我创建了一个新的CXF总线。

private void startupBus() 
{
    // if the bus is already active, shut it down to pick up any endpoint changes
    if (bus != null) {
        bus.shutdown(false);
    }

    bus = BusFactory.newInstance().createBus();

    // Add logging interceptors to log messages to and from the services it calls
    ...
    inBusLog.setPrettyLogging(true);
    outBusLog.setPrettyLogging(true);
    bus.getInInterceptors().add(inBusLog);
    bus.getOutInterceptors().add(outBusLog);
    bus.getInFaultInterceptors().add(inBusLog);
    bus.getOutFaultInterceptors().add(outBusLog);

    BusFactory.setThreadDefaultBus(bus);

    ...//create service proxy with this bus, setup STS client parameters, etc
}

我的总线和服务代理都是静态实例,因为我想在外部修改我的参数,所以这种方法每天重新运行一次。

但是,当这项服务保持运行几天时,我发现内存泄漏。它相对较慢,所以我无法确定它是否与我的总线/代理旋转逻辑有关,或者它是否在其他地方。

是否需要在代理上进行任何额外的清理(例如java.io.Closable.close?)或者我是否错误地配置/管理我的CXF总线实例?

1 个答案:

答案 0 :(得分:3)

也许它对未来有用 https://docs.jboss.org/author/display/JBWS/Apache+CXF+integration#ApacheCXFintegration-BusselectionstrategiesforJAXWSclients

try {
  Service service = Service.create(wsdlURL, serviceQName);
  MyEndpoint port = service.getPort(MyEndpoint.class);
  //...
} finally {
  BusFactory.setThreadDefaultBus(null);
  // OR (if you don't need the bus and the client anymore)
  Bus bus = BusFactory.getThreadDefaultBus(false);
 bus.shutdown(true);
}