为什么@PreDestory不能处理websocket @ServerEndpoint?

时间:2015-12-16 10:08:05

标签: 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>

1 个答案:

答案 0 :(得分:0)

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

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

那么,为什么@PostConstruct会被触发? WebSocket规范说:

  

在Java EE平台中运行的Websocket端点必须具有完全依赖注入支持,如CDI规范中所述。

@PostConstruct API Doc点:

  

PostConstruct注释用于在完成依赖项注入以执行任何初始化之后需要执行的方法。 ...所有支持依赖注入的类都支持必须

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