Hi,
I would like to ask for some guidance on using CXF together with Spring, more
specifically in terms of lifecycle management. There seems to be two ways how
CXF can be integrated with Spring:
1) It can be embedded in Spring as outlined in
http://cwiki.apache.org/CXF20DOC/deploymentspring.html. In this case, the
user's application context imports the cxf spring configuration and the CXF
runtime will be in the same context as the application. For servlet
environment, this seems to be the only option.
2) CXF can start up a separate context (bus application context) for its
runtime. Config example for this can be found at
http://cwiki.apache.org/CXF20DOC/jax-ws-configuration.html (first config, no
imports).
CXF seems to have its own lifecycle manager component implemented in
CXFBusLifeCycleManager, which can control the spring context through
org.apache.cxf.bus.spring.SpringBusFactory.BusApplicationContextLifeCycleListener
in case 2).
However, if a user chooses to embed cxf in the spring context (case 1) of his
application there seems to be no default mapping from some of the spring
lifecycle events to the bus events. For example, CXFBusImpl.shutdown() does not
get called when spring closes the context because it does not hook into
Spring's destroy callback, which leaves servers running after the user
application context is shut down. Is there any reason why that is not done
automatically? For example, we need to do this now to get servers shut down
properly:
public class CXFBusSpringLifecycleBridge implements InitializingBean,
DisposableBean {
@Resource(name = org.apache.cxf.buslifecycle.BusLifeCycleManager)
private org.apache.cxf.buslifecycle.BusLifeCycleManager
busLifeCycleManager;
@Resource(name = Bus.DEFAULT_BUS_ID)
private Bus bus;
...
@Override
public void destroy() throws Exception {
((CXFBusImpl) bus).shutdown(true);
}
}
Also, could you please advise on what would be the best way of delegating
Spring's org.springframework.context.Lifecycle start() and stop() events to cxf
servers? org.apache.cxf.endpoint.Server.start() and stop() seems to have the
same semantics as Lifecycle.start() and stop(), so could CXF maybe implement
the spring Lifecycle interface directly?
Another problem around spring integration seems to be that it includes a
Jsr250BeanPostProcessor by default, which pollutes the user's config in case 1.
Should that be maybe made optional similarly to the extensions?
Thanks,
Gyorgy
NOTICE: If received in error, please destroy and notify sender. Sender does not
intend to waive confidentiality or privilege. Use of this email is prohibited
when received in error.