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
相关产品推荐
相关产品推荐

