Hi,
I ran into an issue where a registered web service cannot be updated. The
scenario is as follows:
1. Register a services as shown below. Implementation and interface are defined
in separate bundles.
2. Verify that http://<host>/MyInterfaceService?wsdl returns the correct
interface.
3. Stop de running interface and implementation bundles.
4. Verify that the service is stopped by requesting the wsdl again. Should fail
with 404.
5. Change the interface definition (add a method, delete a method, anything…)
6. Update the bundles in the framework.
7. Restart the bundles and notice the cxf registration messages.
8. Request the wsdl again. Make sure to use 'reload' in the browser.
Expected to see the new interface definition, instead the previous definition
still shows up.
Even unregistering the bundle from the framework altogether before installing
the new one does not solve the problem.
This behavior is probably caused becasue the /MyInterfaceService context is
never removed from the web server, even though the service itself is removed.
I am using a somewhat older version of cxf, so this may have been fixed/changed
in later versions, although I cannot find any evidence re. that. Apart from it
being inconvenient, I would like to understand exactly what is happening here,
and come up withat a work-around from there.
Your help and insight is appreciated.
Kind Regards,
Erwin
From the Activator:
public void start( BundleContext context ) throws Exception {
myInterfaceService = new MyInterfaceServiceImpl( context,
RepositoryFactory.getInstance());
myServiceTracker = new ServiceTracker(context, MyTrackedService.class,
myInterfaceService);
myServiceTracker.open();
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put( "name", "MyInterfaceServiceImpl" );
props.put( "type", "internal" );
props.put( "service.exported.interfaces", "*" );
props.put( "service.exported.configs", "org.apache.cxf.ws" );
props.put( "org.apache.cxf.ws.httpservice.context",
"/MyInterfaceService" );
myInterfaceService = context.registerService(
MyInterfaceService.class.getName(), myInterfaceService, props );
}
public void stop( BundleContext context ) throws Exception {
if ( myInterfaceService != null ) {
myInterfaceService.unregister();
}
if (myServiceTracker != null){
myServiceTracker.close();
}
}