当前位置: 首页 > 知识库问答 >
问题:

Apache mina 连接可防止 Tomcat 关闭

金晗日
2023-03-14

我有以下配置:

运行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 INFO: 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();  

打开一个连接时,mina会启动其他线程吗?是什么阻止了tomcat实例正常关闭?

共有1个答案

廉高邈
2023-03-14

我也有同样的问题,我终于解决了,只是当你想关闭tomcat的时候需要调用unbind和dispose。

@PreDestroy
public void close() {
    System.out.println("MINAServer.close");
    if (null != socketAcceptor) {
        socketAcceptor.unbind();
        socketAcceptor.dispose(false);
    }
}
 类似资料:
  • 我正在使用Knex.js来处理与数据库的连接。我正在尝试防止连接池破坏空闲的连接。 我的配置是这样的 然而,我仍然不断得到 在一段时间不活动后。 据我所知,当足够的时间过去时,应该将连接从池中丢弃。因此,如果连接有一段时间没有使用(这就是我的情况),池中将没有连接,我尝试的第一次调用将失败,并出现给定错误。随后的调用顺利进行(直到新的超时) 我的问题是——如何防止这种情况? 编辑 在我的应用空闲一

  • 我想使用连接到我的网络服务,发布一个XML并得到一个结果。我使用的是以下代码: 问题是,当我调用方法时,它失败了,说我“已经连接”。显然,实际上打开了与URL的连接(在我的调试器中,我可以看到布尔设置为)。但是根据Oracle的留档,它不应该这样做。Android文档对此并不清楚。 如何防止连接,以便设置额外属性? 更新它看起来好像在某个池中,没有断开连接,甚至在调用之后也没有断开连接,甚至没有杀

  • 我正在为我的应用程序开发简单的聊天模块,使用Spring WebFlux,后端为ReactiveMongoRepository,前面为Angular 4。我能够通过WebSocket会话接收数据,但从数据库流式传输所有消息后,我想保持连接,以便我可以更新消息列表。谁能告诉我如何实现这一目标,或者也许我在遵循错误的假设? Java后端负责WebSocket,我的订户只记录当前状态,与此无关: Web

  • 我在Centos5.8上安装了Tomcat7。然后我执行了。/startup.sh和。/shutdown.sh,它工作得很好。

  • 问题内容: 尝试部署Java应用程序时遇到问题。 要么 在 pom.xml中, 我有这个: 在 tomcat-users.xml中, 我有以下内容: 同样在 Maven / conf / settings.xml中, 我有: 当我试图去 并输入用户名和密码(管理员admin)我有错误: 但是我输入了 tomcat-users.xml ,该用户admin具有manager-gui角色。我正在使用To

  • 我正在开发Grails应用程序,目标是Grails Mongo插件。当我使用run-app命令在本地运行应用程序时,一切正常,应用程序打开了2个到Mongo实例的连接。 但是当我将应用程序打包到war文件并将其部署到远程Tomcat服务器时,启动应用程序的行为变得非常奇怪。 以下是启动日志: 所以,在启动过程中,应用程序尝试在单独的Java线程中获取MongoConnection,但失败了,但没有