Apache CXF зависает при завершении работы tomcat

Я подключаю CXFServlet к моему приложению, которое уже подключено к сервлету диспетчера. Конечная точка работает просто отлично, и все, кажется, работает, пока мы не выключим tomcat. Я обнаружил, что могу подключить CXFServlet, и tomcat отключится без проблем, пока я не подключим шину. После чего вижу проблему с зависанием выключения. Чтобы выключить tomcat, мне нужно убить процесс. Любые идеи?

Потоки, оставшиеся после выключения tomcat:

  • Поток демона [поток-2]
  • Тема [Событие-1]
  • Тема [DestroyJavaVM]

Используемые версии библиотек и сервера:

  • Апач CXF 3.0.1
  • Весна 4.0.3.РЕЛИЗ
  • Spring Security 3.2.0.РЕЛИЗ
  • Spring Java-конфигурация
  • Апач Томкэт 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:

@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
{ 
...
}

person robo    schedule 30.07.2014    source источник


Ответы (1)


Можете ли вы сделать дамп потока в следующих точках:

  1. Непосредственно перед выдачей команды выключения.
  2. Сразу после подачи команды выключения.
  3. 60 с после подачи команды выключения, а затем
  4. 120 с после команды выключения.

Затем вы можете использовать инструмент для анализа потоков и/или опубликовать дампы в общедоступном месте. и поделиться здесь.

По сути, идея состоит в том, чтобы найти, что делают потоки и что препятствует закрытию контейнера, вероятно, из-за блокировки.

person Anurag Kapur    schedule 17.02.2015