gpt4 book ai didi

Java EE7 websocket 初始化 - 在第一个 @OnOpen 之前实现逻辑

转载 作者:搜寻专家 更新时间:2023-10-31 20:20:16 28 4
gpt4 key购买 nike

我认为这更像是一个特定于设计的问题,而不是直接的编码问题。

我想实现一个 websocket 服务,该服务将来自外部 http://资源的更新数据集提供给客户端。但我想在第一个客户端连接之前让数据可用,所以 @OnLoad 符号不会做。

HttpServlet的世界里我会

@Override
public void init() 抛出...

仅使用 JSR-356 想不出合适的方法.我尝试使用自定义 ServerEndpointConfig.Configurator,但这似乎无法让我访问类似于 HttpServlet 中的 init() 的方法。

所以我的问题是:

让 websocket 端点类扩展 HttpServlet 让我可以访问 init() 方法,我可以将我的初始逻辑放在那里。这是解决我的问题的合适方法,还是我错过了 JSR-356 中的某些东西,它可以优雅地完成工作并且无需导入大部分未使用的 servlet 包?

非常感谢!

最佳答案

每次通过@OnOpen 创建新连接时,都会实例化一个用@ServerEndpoint("/myEndPoint") 注释的类。它不是 static 类,也不是单例(例如,不像 Spring @Service 那样运行)。

我有一个与你类似的问题,我需要让一个网络套接字成为 Spring 网络服务的观察者(别问,我同意你的看法,这是一个糟糕的架构问题)。为了让它成为一个观察者,我必须将它添加到可观察类中,但是由于缺少网络套接字的初始化,我没有明确的地方添加观察者,将它添加到 @OnOpen 方法会在每个新连接上重复添加它。

我找到的唯一解决方案是变通方法。通常一个 web socket 类有一个 static Set 连接到它的点,你需要类似的东西来初始化。要么使用 static block或构造函数中的 static 标志。就我而言,我解决了:

private static boolean observerFlag = false;
private static Set<Session> peers = Collections.synchronizedSet(new HashSet<Session>());

public MyWebSocket() {
if (!observerFlag) {
observable.addObserver(this);
observerFlag = true;
}
}

并删除观察者:

@OnClose
public void onClose(Session peer) {
peers.remove(peer);
if (peers.isEmpty()) {
observable.deleteObserver(this);
observerFlag = false;
}
}

我再说一遍,这是一种变通方法,我认为还有更优雅的解决方案。

关于Java EE7 websocket 初始化 - 在第一个 @OnOpen 之前实现逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23469904/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com