2

私は次の構成を持っています:

Apache mina を使用して Java コンソール アプリケーション (またはその他のタイプのアプリケーション) に接続してデータを取得する Spring MVC アプリケーションを実行する tomcat7 サーバー。

明らかに、サーバーをシャットダウンすると、別のスレッドにまだ開いているセッションがあり、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 停止情報: 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();  

接続を開くときにminが起動する他のスレッドはありますか? Tomcat インスタンスが正しくシャットダウンされない原因は何ですか?

4

1 に答える 1

1

私は同じ問題を抱えており、最終的に解決しました.Tomcatを閉じたいときにunbindとdisposeを呼び出すだけです。

@PreDestroy
public void close() {
    System.out.println("MINAServer.close");
    if (null != socketAcceptor) {
        socketAcceptor.unbind();
        socketAcceptor.dispose(false);
    }
}
于 2015-05-28T13:32:14.617 に答える