Apache mina连接阻止Tomcat关闭

时间:2012-12-19 15:56:07

标签: multithreading tomcat7 mina

我有以下配置:

运行Spring MVC应用程序的tomcat7服务器,它使用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工作,甚至我的控制台应用程序(我的套接字连接的服务器端)告诉我会话已终止。 但是,当我试图通过eclipse GUI停止tomcat时,它无法关闭,eclipse告诉我它没有反应并且让我强行终止服务器。

服务器的最后一个方法是:

  

Dez 19,2012 4:39:17 PM org.apache.coyote.AbstractProtocolHandler stop   信息:停止ProtocolHandler [&#34; ajp-bio-8009&#34;]

我的代码在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();  

打开连接时是否还有其他线程mina启动?是什么阻止了tomcat实例正常关闭?

1 个答案:

答案 0 :(得分:0)

我有同样的问题,最后我解决了, 当你想要关闭tomcat时,只需要调用unbind和dispose。

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