java - 为什么 @PreDestory 不能在 websocket @ServerEndpoint 上工作?

标签 java websocket cdi

我记录了一些消息来查看@ServerEndpoint的生​​命周期。 PostConstructonOpenonClose 会依次触发,但 @PreDestroy 不会被触发。我错过了什么吗?

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.websocket.OnClose;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/")
public class ServerWebSocket {
    @PostConstruct
    public void initialize() {
        System.out.println("PostConstruct");
    }
    @OnOpen
    public void open(Session session) {
        System.out.println("OnOpen");

    }
    @OnClose
    public void close(Session session) {
        System.out.println("OnClose");
    }
    @PreDestroy
    public void destroy() {
        System.out.println("PreDestroy");
    }
}

我在 WEB-INF 中使用 GlassFish4 和 bean.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                           http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
    version="1.1" bean-discovery-mode="all">
</beans>

最佳答案

@OnOpen@OnClose 回调由每个 WebSocket session 的生命周期触发。

没有指定任何可以与 WebSocket 端点一起使用的 CDI 范围。这没关系,因为它有自己的 session 。

那么,为什么会触发@PostConstruct? WebSocket 规范指出:

Websocket endpoints running in the Java EE platform must have full dependency injection support as described in the CDI specification.

@PostConstruct API 文档要点:

The PostConstruct annotation is used on a method that needs to be executed after dependency injection is done to perform any initialization. ... This annotation MUST be supported on all classes that support dependency injection.

为什么@PreDestroy不起作用?我认为,Websocket 端点的行为类似于单例,并且 @PreDestroy 将在删除实例期间被触发,这将在应用程序停止之前发生。您可以通过从 GlassFish 管理控制台停止应用程序来在您的环境中检查它。

关于java - 为什么 @PreDestory 不能在 websocket @ServerEndpoint 上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34309085/

相关文章:

java - Selenium 测试保存截图

java下降矩阵代码(就像电影一样)

java - 在java中将多个内容输入到一个数组中

jakarta-ee - 参数拦截器在 Java EE 中不起作用

jsf-2 - CDI @ConversationScoped 与 AJAX

java - 如何使用带参数的自定义注释查找 CDI bean?

java - 读取用Struts上传的文件

java - 如何将二进制消息作为输入流进行处理?

java - PocketSocket 无法处理传入消息

ruby-on-rails - 如何在 Ruby 中创建 Web 套接字客户端?