Apache CXF在关闭tomcat时挂起

Apache CXF在关闭tomcat时挂起,tomcat,cxf,jax-ws,spring-java-config,Tomcat,Cxf,Jax Ws,Spring Java Config,我将一个CXFServlet连接到我的应用程序,该应用程序已经连接到一个DispatcherServlet。端点工作正常,在我们关闭tomcat之前,一切似乎都正常。我发现我可以连接CXFServlet,tomcat在连接总线之前不会出现任何问题。之后,我看到了关机挂起的问题。 要关闭tomcat,我必须终止进程。有什么想法吗 关闭tomcat后剩下的线程有: 守护进程线程[线程2] 线程[Event-1] 线程[javavm] 使用的库和服务器版本: Apache CXF 3.0.1 弹

我将一个CXFServlet连接到我的应用程序,该应用程序已经连接到一个DispatcherServlet。端点工作正常,在我们关闭tomcat之前,一切似乎都正常。我发现我可以连接CXFServlet,tomcat在连接总线之前不会出现任何问题。之后,我看到了关机挂起的问题。 要关闭tomcat,我必须终止进程。有什么想法吗

关闭tomcat后剩下的线程有:

  • 守护进程线程[线程2]
  • 线程[Event-1]
  • 线程[javavm]
使用的库和服务器版本:

  • Apache CXF 3.0.1
  • 弹簧4.0.3.1释放
  • Spring Security 3.2.0.0版本
  • Spring Java配置
  • ApacheTomcat 7.0.47
My pom.xml具有来自cxf库和servlet api库的以下依赖项:

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>3.0.1</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>3.0.1</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
以下是我连接端点的方式:

import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

import com.verisk.underwriting.id_access_api.api.authentication.AuthenticationService;
import com.verisk.underwriting.id_access_api.token.DefaultTokenInfo;
import com.verisk.underwriting.id_access_api.token.TokenService;
import com.verisk.underwriting.ims.web.service.LoginWebService;
import com.verisk.underwriting.ims.web.service.LoginWebServiceImpl;
import com.verisk.underwriting.modules.appbase.status.ServerStatusService;

@Configuration
@ImportResource({"classpath:META-INF/cxf/cxf.xml"})
public class IMSWebServicesConfiguration
{           
    @Bean
    @Autowired
    public EndpointImpl login(Bus bus, LoginWebService loginWebService)
    {       
        EndpointImpl endpointImpl = new EndpointImpl(bus, loginWebService);
        endpointImpl.setAddress("/login");
        endpointImpl.publish();
        return endpointImpl;
    }

    @Bean
    @Autowired
    public LoginWebService loginWebService(TokenService<DefaultTokenInfo> tokenService,     AuthenticationService authenticationService, 
            ServerStatusService<DefaultTokenInfo> serverStatusService)
    {
        return new LoginWebServiceImpl(tokenService, authenticationService,     serverStatusService);
    }
}
LoginWebService实现:

@WebService(endpointInterface="com.verisk.underwriting.ims.web.service.LoginWebService", serviceName="login")
public class LoginWebServiceImpl implements LoginWebService
{ 
...
}
你能否在以下几点上发表意见:

  • 在发出关闭命令之前
  • 在发出关闭命令之后
  • 发出停机命令后60秒,然后
  • 停机命令后120秒 然后,您可以使用和/或将转储发布到公共位置并在此处共享

    基本上,这个想法是找到线程正在做什么,以及哪些线程阻止容器关闭,可能是因为锁

    @WebService(name="login")
    @SOAPBinding(style=Style.RPC, use=Use.LITERAL)
    public interface LoginWebService
    {
    ...
    }
    
    @WebService(endpointInterface="com.verisk.underwriting.ims.web.service.LoginWebService", serviceName="login")
    public class LoginWebServiceImpl implements LoginWebService
    { 
    ...
    }