我有一个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总线实例?
答案 0 :(得分:3)
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);
}