Tomcat 上的 Websockets:如何干净地关闭服务器?

Posted

技术标签:

【中文标题】Tomcat 上的 Websockets:如何干净地关闭服务器?【英文标题】:Websockets on Tomcat: how to shutdown the server cleanly? 【发布时间】:2015-08-07 08:35:37 【问题描述】:

如何拦截服务器上运行的端点的关闭事件(例如 servlet 的销毁方法)以用于日志记录或其他目的?

【问题讨论】:

你找到答案了吗? 【参考方案1】:

Spring 4 Java 配置:

实现 SmartLifecycle(使用基于 Java 的配置时,或将 Java 代码转换为 XML):

@Configuration
public class CycleBean implements SmartLifecycle 

    public CycleBean() 
    

    @Override
    public boolean isRunning() 
        return true;
    

    @Override
    public void start() 
    

    @Override
    public void stop() 
        //when stopped call 
    

    @Override
    public int getPhase() 
        return 0;
    

    @Override
    public boolean isAutoStartup() 
        return true;
    

    @Override
    public void stop(Runnable arg0) 
        //
    

见http://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html第4.6段自定义bean的性质,如:

<bean id="lifecycleProcessor" class="org.springframework.context.support.DefaultLifecycleProcessor">
  <!-- timeout value in milliseconds -->
  <property name="timeoutPerShutdownPhase" value="10000"/>
</bean>

【讨论】:

感谢您的快速回复。但是我的上下文没有 spring 框架,只有一个在 Tomcat webapp 中运行的 EndPoint。 不好意思,我没听说过EndPoint 所以没把它当成环境 顺便说一句,我拼错了:我应该写 Endpoint http://docs.oracle.com/javaee/7/api/javax/websocket/Endpoint.html 但是...我会说覆盖onClose(Session session, EndpointConfig config) 方法。首先(如果可能)调用super.onClose(session, closeReason),然后调用日志记录方法 谢谢丹尼尔森。但是,onClose(Session session, CloseReason reason) 方法是为每个关闭的会话触发的,而不是在端点实例关闭时触发。而且我找不到方法onClose(Session session, EndpointConfig config) 来覆盖...它应该属于哪个类?

以上是关于Tomcat 上的 Websockets:如何干净地关闭服务器?的主要内容,如果未能解决你的问题,请参考以下文章

在 Tomcat 7 中运行 Java EE 7 WebSockets

我如何确定不会错过 WebSockets 上的“打开”事件? [复制]

使用 Safari 错误在 websockets 和 Tomcat 上强制使用 SSL

本地主机上的 Apache Tomcat websockets 实现

在我的 Tomcat Servlet 中实现 Websockets?

Websockets - Tomcat+Spring+ActiveMQ vs ActiveMQ