You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetty 10中WebSocketServerFactory的替代方案及升级适配咨询

Jetty 10 替代 WebSocketServerFactory 的实现方案

核心变化说明

Jetty 10 移除了 WebSocketServerFactory,改用 Jakarta WebSocket API + Jetty 自身的 JettyWebSocketServletFactory/WebSocketServerContainer 实现WebSocket服务端的配置与实例创建。原代码的核心需求(自定义WebSocket实例、配置线程池/缓冲区池、WebSocketPolicy)可通过以下方案适配。

替代实现方案

方案1:保持原工厂结构的兼容实现

该方案保留原类的构造方法与核心方法签名,适配原有调用逻辑,同时替换底层依赖:

import org.eclipse.jetty.websocket.server.ServletUpgradeRequest;
import org.eclipse.jetty.websocket.server.ServletUpgradeResponse;
import org.eclipse.jetty.websocket.server.JettyWebSocketServletFactory;
import org.eclipse.jetty.websocket.core.WebSocketPolicy;
import org.eclipse.jetty.util.thread.Executor;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.ArrayByteBufferPool;

public class UpgradeSocketServerFactory {
    private static final Executor executor = CustomExecutors.newFabricCachedThreadPool(10, "jetty-threads");
    private static final ByteBufferPool bufferPool = new ArrayByteBufferPool(0, 0, 64*1024);
    private final JettyWebSocketServletFactory factory;

    // 保留原构造方法签名,兼容原有调用
    public UpgradeSocketServerFactory(WebSocketPolicy policy) {
        this.factory = new JettyWebSocketServletFactory(policy);
        // 配置自定义线程池与缓冲区池
        factory.setExecutor(executor);
        factory.setByteBufferPool(bufferPool);
        // 绑定WebSocket实例创建逻辑
        factory.setCreator(this::createWebSocket);
    }

    // 保留原createWebSocket方法逻辑
    public Object createWebSocket(ServletUpgradeRequest req, ServletUpgradeResponse resp) {
        // 返回你的自定义WebSocket实例(替换为实际业务类)
        return new CustomWebSocketEndpoint();
    }

    // 对外提供Jetty原生工厂实例,供其他组件调用
    public JettyWebSocketServletFactory getWebSocketServletFactory() {
        return factory;
    }
}

方案2:Servlet环境下的集成实现

如果原工厂用于Servlet环境的WebSocket升级处理,可直接继承Jetty提供的JettyWebSocketServlet封装配置:

import org.eclipse.jetty.websocket.server.JettyWebSocketServlet;
import org.eclipse.jetty.websocket.server.JettyWebSocketServletFactory;
import org.eclipse.jetty.websocket.core.WebSocketPolicy;
import org.eclipse.jetty.util.thread.Executor;
import org.eclipse.jetty.io.ByteBufferPool;
import org.eclipse.jetty.io.ArrayByteBufferPool;

public class CustomWebSocketServlet extends JettyWebSocketServlet {
    private static final Executor executor = CustomExecutors.newFabricCachedThreadPool(10, "jetty-threads");
    private static final ByteBufferPool bufferPool = new ArrayByteBufferPool(0, 0, 64*1024);
    private final WebSocketPolicy policy;

    public CustomWebSocketServlet(WebSocketPolicy policy) {
        this.policy = policy;
    }

    @Override
    public void configure(JettyWebSocketServletFactory factory) {
        // 复用原配置逻辑
        factory.setPolicy(policy);
        factory.setExecutor(executor);
        factory.setByteBufferPool(bufferPool);
        // 绑定自定义WebSocket实例创建逻辑
        factory.setCreator((req, resp) -> new CustomWebSocketEndpoint());
    }
}

自定义WebSocket端点类示例

原代码中的sendCustomObject需替换为符合Jakarta WebSocket规范的端点类,示例如下:

import jakarta.websocket.Endpoint;
import jakarta.websocket.Session;
import jakarta.websocket.EndpointConfig;

public class CustomWebSocketEndpoint extends Endpoint {
    @Override
    public void onOpen(Session session, EndpointConfig config) {
        // 处理连接打开逻辑,例如注册消息处理器
        session.addMessageHandler(String.class, message -> {
            // 业务消息处理逻辑
            System.out.println("收到消息:" + message);
        });
    }

    @Override
    public void onClose(Session session, jakarta.websocket.CloseReason closeReason) {
        // 连接关闭清理逻辑
    }

    @Override
    public void onError(Session session, Throwable throwable) {
        // 错误处理逻辑
    }
}

注意事项

  • Jetty 10 中 WebSocketPolicy 的包路径变更为 org.eclipse.jetty.websocket.core(原Jetty 9在org.eclipse.jetty.websocket.api)
  • 确保依赖替换为Jetty 10版本的jetty-websocket-server与jakarta.websocket-api
  • 原有调用UpgradeSocketServerFactory构造方法的代码无需修改,若需注册到Servlet容器,需调整为使用新工厂提供的JettyWebSocketServletFactory或直接使用CustomWebSocketServlet

内容的提问来源于stack exchange,提问作者NAZIBUR RAHMAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:05:23