[
https://issues.apache.org/jira/browse/CXF-3773?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13093897#comment-13093897
]
Aki Yoshida commented on CXF-3773:
----------------------------------
This problem can happen when the container tries to stop the endpoint after its
associated bus has been stopped.
I'm fixing the clean up code of ServerImpl to prevent this problem from
happening.
> 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
> Assignee: Aki Yoshida
>
> 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