gpt4 book ai didi

tomcat - Apache CXF 在关闭 tomcat 时挂起

转载 作者:行者123 更新时间:2023-11-28 21:50:10 26 4
gpt4 key购买 nike

我将 CXFServlet 连接到我的应用程序,该应用程序已经连接了一个调度程序 servlet。端点工作正常,在我们关闭 tomcat 之前一切似乎都正常。我发现我可以连接 CXFServlet 并且 tomcat 可以毫无问题地关闭,直到我连接总线。之后我看到关机挂起的问题。要关闭 tomcat,我必须终止进程。有什么想法吗?

关闭tomcat后剩下的线程是:

  • 守护线程 [Thread-2]
  • 线程 [Event-1]
  • 线程 [DestroyJavaVM]

使用的库和服务器版本:

  • Apache CXF 3.0.1
  • Spring 4.0.3.RELEASE
  • Spring Security 3.2.0.RELEASE
  • Spring Java-config
  • Apache Tomcat 7.0.47

我的 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>

这是我连接 CXFServlet 的方式:

@Order(3)
public class IMSWebServicesApplicationInitializer implements WebApplicationInitializer
{
@Override
public void onStartup(ServletContext servletContext) throws ServletException
{
ServletRegistration.Dynamic servlet = servletContext.addServlet("CXFServlet", new CXFServlet());
servlet.setLoadOnStartup(1);
servlet.addMapping("/services/*");
}

以下是我连接端点的方式:

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 接口(interface):

@WebService(name="login")
@SOAPBinding(style=Style.RPC, use=Use.LITERAL)
public interface LoginWebService
{
...
}

LoginWebService 实现:

@WebService(endpointInterface="com.verisk.underwriting.ims.web.service.LoginWebService", serviceName="login")
public class LoginWebServiceImpl implements LoginWebService
{
...
}

最佳答案

你能take a thread dump在以下几点:

  1. 紧接在发出关机命令之前。
  2. 在发出关机命令后。
  3. 关机命令发出后60秒
  4. 关机命令后 120 秒。

然后,您可以使用 thread analyser tool和/或在公共(public)场所发布转储并在此处分享。

基本上,这个想法是找出线程正在做什么以及哪些线程正在阻止容器关闭,可能是由于锁定。

关于tomcat - Apache CXF 在关闭 tomcat 时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25040202/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com