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();
        }
    }

Reply via email to