【问题标题】:Error when trying to use WebSockets on JBOSS with Jetty 8.1.8 & Netty 3.2.7尝试通过 Jetty 8.1.8 和 Netty 3.2.7 在 JBOSS 上使用 WebSocket 时出错
【发布时间】:2013-04-08 08:35:17
【问题描述】:

我尝试使用 Jetty 8.1.8 和 Netty 3.2.7 在 JBOSS 上创建一个 websocket servlet 我正在使用与 Tomcat 配合使用的客户端,所以我认为这不是问题 每当我尝试连接到服务器端 websocket servlet 时,我都会不断收到空指针异常 异常发生在 Jetty 的“WebSocketFactory.java”文件中 在以下行之后: AbstractHttpConnection http AbstractHttpConnection.getCurrentConnection() getCurrentConnection 函数返回 null 并遵循这一行尝试使用其函数之一(显然会引发异常)。

这是我的代码: 包 com.microfocus.entrypoint.servlets;

import java.io.IOException;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.eclipse.jetty.websocket.WebSocket;
import org.eclipse.jetty.websocket.WebSocketConnection;
import org.eclipse.jetty.websocket.WebSocketServlet;


@SuppressWarnings("serial")
public class OWMFAsyncJboss extends WebSocketServlet {


         @SuppressWarnings({ "unchecked", "rawtypes" })
          private final Set<ChatWebSocket> users = new CopyOnWriteArraySet();

          @Override
          public WebSocket doWebSocketConnect(HttpServletRequest arg0, String arg1) {
                    try
                    {
                    return new ChatWebSocket();
                    }
                    catch(Exception e)
                    {
                              System.console().writer().write("error");
                    }
                    return null;
          }

         @Override
          protected void service(HttpServletRequest request,
                              HttpServletResponse response) throws ServletException, IOException {
                    super.service(request, response);
          }

          class ChatWebSocket implements WebSocket.OnTextMessage
          {
                    WebSocketConnection connection;

                    @Override
                    public void onClose(int arg0, String arg1) {
                              users.remove(this);
                    }

                    @Override
                    public void onOpen(Connection arg0) {
                              ChatWebSocket.this.connection= (WebSocketConnection) connection;
                              users.add(this);
                    }

                    public void onMessage(byte frame, byte[] data,int offset, int length)
                    {
                    // binary communication not needed
                    }
                    public void onMessage(byte frame, String data)
                    {

                   }
         }

}

这里是个例外:

17:36:01,728 错误 [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/benAsync].[AsynchServlet]] (http-localhost/127.0.0.1: 8080-7) JBWEB000236:Servlet AsynchServlet 的 Servlet.service() 引发异常:java.lang.NullPointerException 在 org.eclipse.jetty.websocket.WebSocketFactory.upgrade(WebSocketFactory.java:225) [jetty-all-7.6.2.v20120308.jar:7.6.2.v20120308] 在 org.eclipse.jetty.websocket.WebSocketFactory.acceptWebSocket(WebSocketFactory.java:361) [jetty-all-7.6.2.v20120308.jar:7.6.2.v20120308] 在 org.eclipse.jetty.websocket.WebSocketServlet.service(WebSocketServlet.java:107) [jetty-all-7.6.2.v20120308.jar:7.6.2.v20120308] 在 com.benPackage.entrypoint.servlets.OWMFAsyncJboss.service(OWMFAsyncJboss.java:58) [类:] 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.2.Final.jar:1.0.2.Final] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:295) [jbossweb-7.2.0.Final.jar:7.2.0.Final] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214) [jbossweb-7.2.0.Final.jar:7.2.0.Final] 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) [jbossweb-7.2.0.Final.jar:7.2.0.Final] 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:149) [jbossweb-7.2.0.Final.jar:7.2.0.Final] 在 org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:169) [jboss-as-web-7.2.0.Alpha1-redhat-4.jar:7.2.0.Alpha1-redhat-4] 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:145) [jbossweb-7.2.0.Final.jar:7.2.0.Final] 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:97) [jbossweb-7.2.0.Final.jar:7.2.0.Final] 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:102) [jbossweb-7.2.0.Final.jar:7.2.0.Final] 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:336) [jbossweb-7.2.0.Final.jar:7.2.0.Final] 在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856) [jbossweb-7.2.0.Final.jar:7.2.0.Final] 在 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:653) [jbossweb-7.2.0.Final.jar:7.2.0.Final] 在 org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:920) [jbossweb-7.2.0.Final.jar:7.2.0.Final] 在 java.lang.Thread.run(Unknown Source) [rt.jar:1.6.0_33]

任何可能对我有帮助的帮助或指导将不胜感激 谢谢 ! :)

【问题讨论】:

    标签: websocket jetty jboss7.x netty


    【解决方案1】:

    两个问题。

    首先,您在问题中说您使用的是 Jetty 8.1.8,但您的堆栈跟踪显示您使用的是 Jetty 7.6.2.v20120308。

    接下来,jetty-websocket 需要访问 Jetty 内部连接升级机制,以打破 Servlet API 规范规则。在您所描述的这种混合 JBoss + Jetty 环境中是不可能的。

    解决方案可能是在同一台机器上的不同端口上运行 Jetty,并将 UPGRADE 请求代理到另一个 Jetty 实例。但是 JBoss 对 UPGRADE 请求和101 Switching Protocols 响应的支持非常有限。

    【讨论】:

    • 首先谢谢!码头版本是我的错误 - 我从堆栈中复制了错误消息并试图将码头 jar 更改为更高级的 - 但它向我显示了同样的错误,有没有办法将码头放在同一个端口和机器中jboss位于?也许安装一些我不知道的 jboss 插件或模块,因为代理到另一个端口现在不是一个选项,再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多