Apache mina връзката не позволява Tomcat да се изключи

Имам следната конфигурация:

Сървър tomcat7, изпълняващ Spring MVC приложение, което използва Apache mina, за да се свърже с Java-Console приложение (или всеки друг тип приложение за този въпрос), за да извлече някои данни.

Сега очевидно, когато затворя сървъра си, все още има отворена сесия в отделна тема, която пречи на Tomcat7 да се изключи. така че това, което правя, е следното:

package at.dauzinger.tcpservice;

import javax.servlet.ServletContextEvent;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.*;

public class ServerContextListener implements javax.servlet.ServletContextListener
{
    PriceDao priceDao;

    public void contextDestroyed(ServletContextEvent event)
    {   
        WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
        priceDao = (PriceDao)context.getBean("priceDao");
        priceDao.closeConnection();
    }

    public void contextInitialized(ServletContextEvent arg0) {
        //Method Stub
    }
}

И вътре в web.xml

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
   <listener-class>at.dauzinger.tcpservice.ServerContextListener</listener-class>
</listener>

ContextListener работи и дори моето конзолно приложение (от страната на сървъра на моята сокет връзка) ми казва, че сесията е прекратена. Но когато се опитвам да спра tomcat чрез GUI на eclipse, той не успява да се изключи и eclipse ми казва, че не реагира, и ми предлага да прекратя принудително сървъра.

Последният вход от сървъра е:

19 декември 2012 г. 16:39:17 org.apache.coyote.AbstractProtocolHandler stop ИНФОРМАЦИЯ: Спиране на ProtocolHandler ["ajp-bio-8009"]

Моят код, работещ в tomcat-servlet:

connector = new NioSocketConnector();
connector.getSessionConfig().setUseReadOperation(true);
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
session = connector.connect( new InetSocketAddress(PORT)).awaitUninterruptibly().getSession();

session.write(request);
String resp = (String) session.read().awaitUninterruptibly().getMessage();  

Има ли друга нишка, която се стартира при отваряне на връзка? Какво пречи на екземпляра tomcat да се изключи правилно?


person David Auzinger    schedule 19.12.2012    source източник
comment
здравей, успя ли да намериш корена на проблема? Имам същия проблем.   -  person Martin Asenov    schedule 29.09.2014
comment
Здравейте, да, но за съжаление, докато работех като стажант. Това означава, че вече нямам достъп до кода, сори :( Ще видя дали мога да намеря нещо.   -  person David Auzinger    schedule 30.09.2014
comment
В момента се опитвам да пресъздам настройката, която използвах, с кода, който все още имам, ще се свържа с вас утре или вдругиден.   -  person David Auzinger    schedule 30.09.2014
comment
Може да не разбирам напълно какво правите, но използването на awaitUninterruptiblib() вероятно е в основата на вашия проблем.   -  person Paul Gregoire    schedule 19.01.2015


Отговори (1)


Имам същия проблем и най-накрая го реших, просто трябва да извикате unbind и dispose, когато искате да затворите tomcat.

@PreDestroy
public void close() {
    System.out.println("MINAServer.close");
    if (null != socketAcceptor) {
        socketAcceptor.unbind();
        socketAcceptor.dispose(false);
    }
}
person Jolking    schedule 28.05.2015