CXF unregisters MBeans for JAX-WS endpoints twice
-------------------------------------------------

                 Key: CXF-3773
                 URL: https://issues.apache.org/jira/browse/CXF-3773
             Project: CXF
          Issue Type: Bug
          Components: JAX-WS Runtime
    Affects Versions: 2.4.2
         Environment: Tomcat 6.0.33 / Spring 3.0.[56] / Java 1.[67]
            Reporter: Dominik Drzewiecki


MBeans created for JAX-WS endpoints do get unregistered twice during context 
shutdown.

I've placed a breakpoint in 
{{org.apache.cxf.management.jmx.InstrumentationManagerImpl.unregister(ObjectName)}}
 and caught following stacks when reaching it. The first line shows the 
ObjectName being unregistered.

You may notice that the first three stacks are observed during the {{CXFBus}} 
shutdown, and the fourth one during {{JAXWS22SpringEndpointImpl}}.

The last invocation of 
{{org.apache.cxf.management.jmx.InstrumentationManagerImpl.unregister(ObjectName)}}
 results in {{javax.management.InstanceNotFoundException}} being thrown (the 
full message is {{"WARNING: Unregistering ManagedEndpoint failed. 
javax.management.InstanceNotFoundException: 
org.apache.cxf:bus.id=cxf52615653,type=Bus.Service.Endpoint,service="{http://ws.xxx.xxxxx.com/}Service",port="ServicePort"}})
 which prevents from shutting down the endpoint bean, spring context and web 
application context cleanly.

{noformat}
org.apache.cxf:bus.id=cxf52615653,type=Bus.Service.Endpoint,service="{http://ws.xxx.xxxxxx.com/}Service",port="ServicePort";
Thread [main] (Suspended (entry into method unregister in 
InstrumentationManagerImpl))  
        InstrumentationManagerImpl.unregister(ObjectName) line: 229     
        InstrumentationManagerImpl.unregister(ManagedComponent) line: 225       
        ServerImpl.destroy() line: 180  
        ServerRegistryImpl.preShutdown() line: 88       
        CXFBusLifeCycleManager.preShutdown() line: 84   
        CXFBusLifeCycleManager.postShutdown() line: 91  
        SpringBus.onApplicationEvent(ApplicationEvent) line: 94 
        SimpleApplicationEventMulticaster.multicastEvent(ApplicationEvent) 
line: 97     
        
XmlWebApplicationContext(AbstractApplicationContext).publishEvent(ApplicationEvent)
 line: 303   
        XmlWebApplicationContext(AbstractApplicationContext).doClose() line: 
1007       
        XmlWebApplicationContext(AbstractApplicationContext).close() line: 970  
        
ContextLoaderListener(ContextLoader).closeWebApplicationContext(ServletContext) 
line: 384       
        ContextLoaderListener.contextDestroyed(ServletContextEvent) line: 78    
        StandardContext.listenerStop() line: 4245       
        StandardContext.stop() line: 4886       
        StandardHost(ContainerBase).stop() line: 1110   
        StandardEngine(ContainerBase).stop() line: 1110 
        StandardEngine.stop() line: 468 
        StandardService.stop() line: 604        
        StandardServer.stop() line: 788 
        Catalina.stop() line: 662       
        Catalina.start() line: 629      
        NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not 
available [native method]  
        NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57      
        DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
        Method.invoke(Object, Object...) line: 601      
        Bootstrap.start() line: 289     
        Bootstrap.main(String[]) line: 414      
{noformat}

{noformat}
org.apache.cxf:bus.id=cxf52615653,type=Bus.Service.Endpoint,service="{http://ws.xxx.xxxxx.com/}Service",port="Service";
Thread [main] (Suspended (entry into method unregister in 
InstrumentationManagerImpl))  
        InstrumentationManagerImpl.unregister(ObjectName) line: 229     
        InstrumentationManagerImpl.unregister(ManagedComponent) line: 225       
        ServerImpl.destroy() line: 180  
        ServerRegistryImpl.preShutdown() line: 88       
        CXFBusLifeCycleManager.preShutdown() line: 84   
        CXFBusLifeCycleManager.postShutdown() line: 91  
        SpringBus.onApplicationEvent(ApplicationEvent) line: 94 
        SimpleApplicationEventMulticaster.multicastEvent(ApplicationEvent) 
line: 97     
        
XmlWebApplicationContext(AbstractApplicationContext).publishEvent(ApplicationEvent)
 line: 303   
        XmlWebApplicationContext(AbstractApplicationContext).doClose() line: 
1007       
        XmlWebApplicationContext(AbstractApplicationContext).close() line: 970  
        
ContextLoaderListener(ContextLoader).closeWebApplicationContext(ServletContext) 
line: 384       
        ContextLoaderListener.contextDestroyed(ServletContextEvent) line: 78    
        StandardContext.listenerStop() line: 4245       
        StandardContext.stop() line: 4886       
        StandardHost(ContainerBase).stop() line: 1110   
        StandardEngine(ContainerBase).stop() line: 1110 
        StandardEngine.stop() line: 468 
        StandardService.stop() line: 604        
        StandardServer.stop() line: 788 
        Catalina.stop() line: 662       
        Catalina.start() line: 629      
        NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not 
available [native method]  
        NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57      
        DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
        Method.invoke(Object, Object...) line: 601      
        Bootstrap.start() line: 289     
        Bootstrap.main(String[]) line: 414      
{noformat}

{noformat}
org.apache.cxf:bus.id=cxf52615653,type=Bus
Thread [main] (Suspended (entry into method unregister in 
InstrumentationManagerImpl))  
        InstrumentationManagerImpl.unregister(ObjectName) line: 229     
        InstrumentationManagerImpl.shutdown() line: 263 
        InstrumentationManagerImpl.postShutdown() line: 279     
        CXFBusLifeCycleManager.postShutdown() line: 97  
        SpringBus.onApplicationEvent(ApplicationEvent) line: 94 
        SimpleApplicationEventMulticaster.multicastEvent(ApplicationEvent) 
line: 97     
        
XmlWebApplicationContext(AbstractApplicationContext).publishEvent(ApplicationEvent)
 line: 303   
        XmlWebApplicationContext(AbstractApplicationContext).doClose() line: 
1007       
        XmlWebApplicationContext(AbstractApplicationContext).close() line: 970  
        
ContextLoaderListener(ContextLoader).closeWebApplicationContext(ServletContext) 
line: 384       
        ContextLoaderListener.contextDestroyed(ServletContextEvent) line: 78    
        StandardContext.listenerStop() line: 4245       
        StandardContext.stop() line: 4886       
        StandardHost(ContainerBase).stop() line: 1110   
        StandardEngine(ContainerBase).stop() line: 1110 
        StandardEngine.stop() line: 468 
        StandardService.stop() line: 604        
        StandardServer.stop() line: 788 
        Catalina.stop() line: 662       
        Catalina.start() line: 629      
        NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not 
available [native method]  
        NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57      
        DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
        Method.invoke(Object, Object...) line: 601      
        Bootstrap.start() line: 289     
        Bootstrap.main(String[]) line: 414      
{noformat}

{noformat}
org.apache.cxf:bus.id=cxf52615653,type=Bus.Service.Endpoint,service="{http://ws.xxx.xxxxx.com/}Service",port="ServicePort";
Thread [main] (Suspended (entry into method unregister in 
InstrumentationManagerImpl))  
        InstrumentationManagerImpl.unregister(ObjectName) line: 229     
        InstrumentationManagerImpl.unregister(ManagedComponent) line: 225       
        ServerImpl.destroy() line: 180  
        JAXWS22SpringEndpointImpl(EndpointImpl).stop() line: 263        
        NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not 
available [native method]  
        NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57      
        DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
        Method.invoke(Object, Object...) line: 601      
        DisposableBeanAdapter.invokeCustomDestroyMethod(Method) line: 273       
        DisposableBeanAdapter.destroy() line: 199       
        
DefaultListableBeanFactory(DefaultSingletonBeanRegistry).destroyBean(String, 
DisposableBean) line: 487  
        
DefaultListableBeanFactory(DefaultSingletonBeanRegistry).destroySingleton(String)
 line: 463     
        
DefaultListableBeanFactory(DefaultSingletonBeanRegistry).destroySingletons() 
line: 431  
        XmlWebApplicationContext(AbstractApplicationContext).destroyBeans() 
line: 1048  
        XmlWebApplicationContext(AbstractApplicationContext).doClose() line: 
1022       
        XmlWebApplicationContext(AbstractApplicationContext).close() line: 970  
        
ContextLoaderListener(ContextLoader).closeWebApplicationContext(ServletContext) 
line: 384       
        ContextLoaderListener.contextDestroyed(ServletContextEvent) line: 78    
        StandardContext.listenerStop() line: 4245       
        StandardContext.stop() line: 4886       
        StandardHost(ContainerBase).stop() line: 1110   
        StandardEngine(ContainerBase).stop() line: 1110 
        StandardEngine.stop() line: 468 
        StandardService.stop() line: 604        
        StandardServer.stop() line: 788 
        Catalina.stop() line: 662       
        Catalina.start() line: 629      
        NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not 
available [native method]  
        NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57      
        DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43  
        Method.invoke(Object, Object...) line: 601      
        Bootstrap.start() line: 289     
        Bootstrap.main(String[]) line: 414      
{noformat}

For the completness, my spring context is as simple as:
{code:xml}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans";
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd
                http://cxf.apache.org/jaxws 
http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/core 
http://cxf.apache.org/schemas/core.xsd
                http://cxf.apache.org/jaxrs 
http://cxf.apache.org/schemas/jaxrs.xsd";
        xmlns:context="http://www.springframework.org/schema/context";
        xmlns:jaxws="http://cxf.apache.org/jaxws"; 
xmlns:jaxrs="http://cxf.apache.org/jaxrs";
        xmlns:cxf="http://cxf.apache.org/core";>

        <import resource="classpath:META-INF/cxf/cxf.xml" />
        <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

        <cxf:bus />

        <bean id="instrumentationManager"
                
class="org.apache.cxf.management.jmx.InstrumentationManagerImpl" >
                <property name="bus" ref="cxf" />
                <property name="enabled" value="true" />
                <property name="usePlatformMBeanServer" value="true" />
        </bean>

        <bean id="counterRepository" 
class="org.apache.cxf.management.counters.CounterRepository" >
                <property name="bus" ref="cxf" />
        </bean>

        <jaxws:endpoint id="webService" implementor="#service"
                address="${web.ws.uri}" />
</beans>
{code}
While the class and the interface exposed as a service looks somewhat like this:

{code}
@WebService(endpointInterface="com.xxxxx.xxx.ws.IService", 
serviceName="Service" )
@Component("service")
public class Service implements IService {
 // implementation here
}
{code}

{code}
@WebService
public interface IService {
        @WebResult(name = "status")
        @WebMethod(operationName = "send")
        public boolean send(@WebParam(name = "message") SomeMessage message)
                        throws SomeException;

        @Oneway
        @WebMethod(operationName = "doSend")
        public void doSend(@WebParam(name = "message") SomeMessage message)
                        throws SomeException;
}
{code}

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to