在Jetty上运行带有Camel组件的简单websocket时出现异常

在Jetty上运行带有Camel组件的简单websocket时出现异常,websocket,jetty,apache-camel,Websocket,Jetty,Apache Camel,我试图在Jetty上运行use Camel Websocket组件,但无法排除以下异常。我不确定这是否是因为Jetty使用Camel运行的问题,或者版本兼容性问题,或者我的代码中缺少了什么 我已经把这个项目放到Github上,以防有人想尝试一下。 以下是运行应用程序的步骤 在此类src/main/java/demo/websocket中更新您的Twitter凭据/ $mvn清洁安装 $mvn码头:运行 指向我使用Google Chrome的web浏览器http://localhost:8080

我试图在Jetty上运行use Camel Websocket组件,但无法排除以下异常。我不确定这是否是因为Jetty使用Camel运行的问题,或者版本兼容性问题,或者我的代码中缺少了什么

我已经把这个项目放到Github上,以防有人想尝试一下。

以下是运行应用程序的步骤

在此类src/main/java/demo/websocket中更新您的Twitter凭据/

$mvn清洁安装

$mvn码头:运行

指向我使用Google Chrome的web浏览器http://localhost:8080/index.html

这是我骑骆驼的主要路线

包demo.websocket; 导入org.apache.camel.Exchange; 导入org.apache.camel.Processor; 导入org.apache.camel.builder.RouteBuilder; 导入org.apache.camel.component.twitter.twitter组件; 导入org.apache.camel.component.websocket.WebsocketComponent; 公共类TwitterStreamRoute扩展了RouteBuilder{ //将您的twitter密钥放在此处进行测试 公共最终字符串CONSUMER_KEY=; 公共最终字符串CONSUMER_SECRET=; 公共最终字符串访问_令牌=; 公共最终字符串访问\令牌\秘密=; @凌驾 公共void配置引发异常{ TwitterComponent tc=getContext.getComponenttwitter,TwitterComponent.class; tc.setAccessTokenACCESS\u令牌; tc.setAccessTokenSecretACCESS\u TOKEN\u SECRET; tc.setConsumerKeyCONSUMER\u键; tc.setConsumerCretConsumer_SECRET; 弗洛姆twitter://streaming/filter?type=polling&delay=%s&keywords=%s,5,匹兹堡 .processnew处理器{ @凌驾 public void processExchange引发异常{ 字符串res=exchange.getIn.getBody.toString; exchange.getOut.setBodyres; } } 到websocket://0.0.0.0:9292/camel-tweet?sendToAll=true; } } 驼峰配置如下所示:

我的web.xml看起来像

上下文配置位置 类路径:camel-config.xml org.springframework.web.context.ContextLoaderListener org.springframework.web.context.request.RequestContextListener Web应用程序创建的原型 ~

我在pom.xml中使用以下版本。完整的pom.xml是

3.2.2.1发布 2.11.0 8.1.3.v20120416 更新日期:2013年5月6日,美国东部时间下午3:04

我按照克劳斯·易卜生的建议,更新了pom.xml以使用Jetty 7.6.x版本。 但我还是犯了同样的错误。同样在这种情况下,stackstrace对于WebSocketFactory和WebSocketServlet具有相同的版本号

java.lang.NullPointerException
    at org.eclipse.jetty.websocket.WebSocketFactory.upgrade(WebSocketFactory.java:236)[jetty-websocket-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.websocket.WebSocketFactory.acceptWebSocket(WebSocketFactory.java:382)[jetty-websocket-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.websocket.WebSocketServlet.service(WebSocketServlet.java:104)[jetty-websocket-7.6.8.v20121106.jar:7.6.8.v20121106]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)[javax.servlet-2.5.0.v201103041518.jar:]
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:652)[jetty-servlet-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:447)[jetty-servlet-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1038)[jetty-server-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:374)[jetty-servlet-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:972)[jetty-server-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)[jetty-server-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)[jetty-server-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.server.Server.handle(Server.java:363)[jetty-server-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:483)[jetty-server-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:920)[jetty-server-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:982)[jetty-server-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:635)[jetty-http-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)[jetty-http-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)[jetty-server-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)[jetty-io-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)[jetty-io-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)[jetty-util-7.6.8.v20121106.jar:7.6.8.v20121106]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)[jetty-util-7.6.8.v20121106.jar:7.6.8.v20121106]
    at java.lang.Thread.run(Thread.java:662)[:1.6.0_32]
更新2-May-2013美国东部时间下午4:06
正如@JoakimErdfelt在评论中所建议的,带有请求-响应信息的Google Chrome文件是

尝试使用Jetty 7.6.x,因为这是我们测试并用于Apache Camel 2.11版本的版本。

尝试使用Jetty 7.6.x,因为这是我们测试并用于Apache Camel 2.11版本的版本。

NPE的出现是因为试图升级而没有通过真正的Jetty HTTP连接

最常见的原因是:

试图在非Jetty的web容器上使用Jetty WebSocket。例如tomcat或jboss 尝试在不使用真实HTTP连接(如通过模拟库)的情况下对websocket servlet进行单元测试 上的NPE是由于尝试升级而未通过真正的Jetty HTTP连接到达

最常见的原因是:

试图在非Jetty的web容器上使用Jetty WebSocket。例如tomcat或jboss 尝试在不使用真实HTTP连接(如通过模拟库)的情况下对websocket servlet进行单元测试
几天前我也遇到了同样的例外。问题是空连接对象。至少对我来说,根本原因是码头设置。确保在jetty start.ini文件中启用了websocket。像这样的-

OPTIONS=Server,jsp,resources,ext,plus,websocket

默认情况下应该启用它,但在我们的情况下没有启用,因为有人错误地自定义了start.ini并删除了websocket支持。重新添加后,websocket在Jetty 7.6.8中表现得非常出色

几天前,我也遇到了同样的例外。问题是空连接对象。至少对我来说,根本原因是码头设置。确保在jetty start.ini文件中启用了websocket。像这样的-

OPTIONS=Server,jsp,resources,ext,plus,websocket
默认情况下应该启用它,但在我们的情况下没有启用,因为有人错误地自定义了start.ini并删除了websocket支持。将其添加回websocket后,它的工作非常有魅力
码头7.6.8

我想我还没有弄清楚这个错误背后的确切原因。但是,我有一个解决方案,它不需要对代码进行重大更改

我认为问题在于Jetty和Jetty maven插件中websocket相关类的类加载。要么我pom.xml中的插件配置不正确,要么我缺少一些条目。在任何情况下,在尝试了将近一天之后,我的替代解决方案如下:

我没有使用Jetty maven插件来部署应用程序,而是使用Jetty Runner来部署应用程序。注意:请在pom.xml中下载与jetty.version匹配的版本

例如:

$java -jar jetty-runner-7.6.8.v20121106.jar target/jettycamelwebsocket.war
在这之后,我可以从index.html访问websocket,没有任何问题

现在,如果有人能解释为什么这不起作用,或者Jetty maven插件缺少什么,那将非常有用

这里有一些我觉得有用的参考资料。尽管它们已经过时,但其中一些给了我一个提示,Jetty Maven插件可能有问题,因此为我指明了正确的方向


我想我还没有弄明白这个错误背后的确切原因。但是,我有一个解决方案,它不需要对代码进行重大更改

我认为问题在于Jetty和Jetty maven插件中websocket相关类的类加载。要么我pom.xml中的插件配置不正确,要么我缺少一些条目。在任何情况下,在尝试了将近一天之后,我的替代解决方案如下:

我没有使用Jetty maven插件来部署应用程序,而是使用Jetty Runner来部署应用程序。注意:请在pom.xml中下载与jetty.version匹配的版本

例如:

$java -jar jetty-runner-7.6.8.v20121106.jar target/jettycamelwebsocket.war
在这之后,我可以从index.html访问websocket,没有任何问题

现在,如果有人能解释为什么这不起作用,或者Jetty maven插件缺少什么,那将非常有用

这里有一些我觉得有用的参考资料。尽管它们已经过时,但其中一些给了我一个提示,Jetty Maven插件可能有问题,因此为我指明了正确的方向



您的stacktrace显示Jetty 8.1.9.v20130131,但您的pom显示Jetty 8.1.3.v20120416。这有点令人困惑。是的,这很奇怪。让我再调试一下。我用一个新的stacktrace更新了原来的问题。包括你使用哪个版本的Google Chrome导致了这个问题。或者更好的是,捕获您的网络流量、HTTP升级请求和HTTP响应并发布。查看内置的Chrome网络检查器或chrome://net-internals 作为技巧。@JoakimErdfelt-谢谢。我会更新谷歌浏览器的版本。我在运行Windows/Linux/OS-X的Google Chrome上遇到了同样的错误。我很确定如果你克隆git repo,你也会遇到同样的错误。我将尝试获取HTTP请求和响应。stacktrace显示Jetty 8.1.9.v20130131,但pom显示Jetty 8.1.3.v20120416。这有点令人困惑。是的,这很奇怪。让我再调试一下。我用一个新的stacktrace更新了原来的问题。包括你使用哪个版本的Google Chrome导致了这个问题。或者更好的是,捕获您的网络流量、HTTP升级请求和HTTP响应并发布。查看内置的Chrome网络检查器或chrome://net-internals 作为技巧。@JoakimErdfelt-谢谢。我会更新谷歌浏览器的版本。我在运行Windows/Linux/OS-X的Google Chrome上遇到了同样的错误。我很确定如果你克隆git repo,你也会遇到同样的错误。我将尝试获取HTTP请求和响应。1。我的web容器是Jetty。2.我使用的是来自see index.html.1的一个真正的HTTP连接。我的web容器是Jetty。2.我使用的是see index.html中的一个真正的HTTP连接,看起来它在Jetty 7.6.x中也不起作用。我还应该尝试其他想法吗?看起来它在Jetty 7.6.x上也不起作用。还有什么其他想法我应该试试吗?你知道如何在Maven Jetty插件中设置它吗?我找不到一种方法来设置使用Maven插件运行时的选项。然而,我们确实使用$mvn-Xjetty:run检查了mvn类路径,它在类路径中有websocket jar。另请参见,选项行只是将适当的JAR添加到服务器类路径中。因为@soumyassimanta的stacktrace中有这些类,可以安全地假设他满足了这个要求。您可以使用$java-jar start.jar-version来查看基于start.ini和选项行的服务器类路径中会出现哪些jar。我必须通过嵌入Jetty来创建一个start.jar。您知道如何在Maven Jetty插件中设置它吗?我找不到设置jar的方法使用Maven插件运行时的选项。然而,我们确实使用$mvn-Xjetty:run检查了mvn类路径,它在类路径中有websocket jar。另请参见,选项行仅添加Approvr
将JAR延迟到服务器类路径。因为@SoumyaSimanta在他的stacktrace中有这些类,所以可以安全地假设他满足了这个要求。您可以使用$java-jar start.jar-version根据start.ini和选项行查看服务器类路径中会出现哪些jar。我必须通过嵌入Jetty来创建start.jar吗?