我记录了一些消息,以查看@ServerEndpoint
的生命周期。 PostConstruct
,onOpen
,onClose
会轮流触发,但永远不会触发@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>
答案 0 :(得分:0)
@OnOpen
和@OnClose
回调由每个WebSocket会话的生命周期触发。
没有指定任何CDI范围,可以与WebSocket端点一起使用。这没关系,因为它有自己的会话。
那么,为什么@PostConstruct
会被触发? WebSocket规范说:
在Java EE平台中运行的Websocket端点必须具有完全依赖注入支持,如CDI规范中所述。
@PostConstruct
API Doc点:
PostConstruct注释用于在完成依赖项注入以执行任何初始化之后需要执行的方法。 ...所有支持依赖注入的类都支持必须。
为什么@PreDestroy
不起作用?我认为,Websocket端点的行为类似于单例,并且在删除实例期间将触发@PreDestroy
,这将在应用程序停止之前发生。您可以通过从GlassFish管理控制台停止应用程序来检查您的环境。