在运行时映射 websockets 端点

Posted

技术标签:

【中文标题】在运行时映射 websockets 端点【英文标题】:Mapping websockets endpoints at runtime 【发布时间】:2015-10-16 21:27:04 【问题描述】:

我知道从 servlet api 3.0 开始我们可以在运行时映射一个 servlet,可以如下实现:

@Override
public void contextInitialized( ServletContextEvent sce ) 
    ServletContext sc = sce.getServletContext();

    String servletMapping = "/yourURL";
    ServletRegistration sr = sc.addServlet( servletMapping, "org.yourdomain.yourclass" );
    sr.setInitParameter( "key", "value" );
    sr.addMapping( servletMapping );

是否有类似的方式使用 websockets(使用 javax.websockets.api)?

【问题讨论】:

【参考方案1】:

ServletContainerInitializer 的 Websocket 等效项是 ServerApplicationConfig。它只是不需要服务文件,Websocket API 将主动扫描 WAR 和 WAR 中的 JAR 以查找任何实现 ServerApplicationConfig 接口的类并使用它们。您可以在getEndpointConfigs() 中使用ServerEndpointConfig.Builder 以编程方式构建Websocket 端点并返回它。

这是一个启动示例,假设 YourEndpoint.class 表示您希望以编程方式添加的 Websocket 端点,并且您希望忽略任何扫描的类。

public class YourServerApplicationConfig implements ServerApplicationConfig 

    @Override
    public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> scannedClasses) 
        Set<ServerEndpointConfig> configs = new HashSet<>();
        configs.add(ServerEndpointConfig.Builder.create(YourEndpoint.class, "/yourPath").build());
        return configs;
    

    @Override
    public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scannedClasses) 
        return Collections.emptySet();
    


【讨论】:

是的,我知道,但我真正追求的是一种在运行时更改端点的方法,对于 servlet,我保留对 servlet 上下文的引用,并且可以在运行时随时添加 servlet。 ServerAppllicationConfig 方法只在启动时被调用,对吗? 在上下文初始化后不允许添加/删除 servlet。它会抛出 ISE。所以,没有什么不同。 哎呀...我指望在初始化后能够更改映射。你是对的,它不起作用。谢谢。

以上是关于在运行时映射 websockets 端点的主要内容,如果未能解决你的问题,请参考以下文章

Websocket 在 localhost 但不是 Heroku

当 Jersey ServletContainer 位于“/*”时,websocket 端点上的 404

在春天运行 javax.websocket 端点?

Webflux,使用Websocket如何防止订阅两次反应式redis消息操作

在 Struts 2 中使用 WebSocket API

web-socket.js 和 WebSocket