2013-05-05 37 views
1

我试图在Jetty上运行Camel Websocket组件,但无法摆脱以下异常。我不确定这是Jetty与Camel一起运行的问题,还是版本兼容性问题或者某些问题在我的代码中缺失。在Jetty上运行一个简单的websocket与Camel组件的异常

我已经把这个项目放在Github上,以防有人想要试一试。 https://github.com/soumyasd/jettycamelwebsocket

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

  1. 更新在这个类的src/main/JAVA /演示/ WebSocket的你的Twitter的凭据/

  2. $mvn clean install

  3. $mvn jetty:run

  4. 将Web浏览器(我使用谷歌浏览器)至http://localhost:8080/index.html

java.lang.NullPointerException 
    at org.eclipse.jetty.websocket.WebSocketFactory.upgrade(WebSocketFactory.java:236)[jetty-websocket-8.1.9.v20130131.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.websocket.WebSocketFactory.acceptWebSocket(WebSocketFactory.java:382)[jetty-websocket-8.1.9.v20130131.jar:8.1.9.v20130131] 
    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:848)[javax.servlet-3.0.0.v201112011016.jar:] 
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:598)[jetty-servlet-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:486)[jetty-servlet-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1065)[jetty-server-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:413)[jetty-servlet-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:999)[jetty-server-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)[jetty-server-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)[jetty-server-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.server.Server.handle(Server.java:350)[jetty-server-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:454)[jetty-server-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:890)[jetty-server-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:944)[jetty-server-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630)[jetty-http-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)[jetty-http-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77)[jetty-server-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:606)[jetty-io-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46)[jetty-io-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603)[jetty-util-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538)[jetty-util-8.1.3.v20120416.jar:8.1.9.v20130131] 
    at java.lang.Thread.run(Thread.java:680)[:1.6.0_45] 

这是我的主要骆驼路线。

package demo.websocket; 

import org.apache.camel.Exchange; 
import org.apache.camel.Processor; 
import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.component.twitter.TwitterComponent; 
import org.apache.camel.component.websocket.WebsocketComponent; 

public class TwitterStreamRoute extends RouteBuilder{ 

     //put your twitter keys here to test 
     public final String CONSUMER_KEY = ""; 
     public final String CONSUMER_SECRET = ""; 
     public final String ACCESS_TOKEN = ""; 
     public final String ACCESS_TOKEN_SECRET = ""; 


     @Override 
     public void configure() throws Exception { 




     TwitterComponent tc = getContext().getComponent("twitter", TwitterComponent.class); 
     tc.setAccessToken(ACCESS_TOKEN); 
     tc.setAccessTokenSecret(ACCESS_TOKEN_SECRET); 
     tc.setConsumerKey(CONSUMER_KEY); 
     tc.setConsumerSecret(CONSUMER_SECRET); 

     fromF("twitter://streaming/filter?type=polling&delay=%s&keywords=%s", "5", "pittsburgh") 
       .process(new Processor() { 
           @Override 
           public void process(Exchange exchange) throws Exception { 
             String res = exchange.getIn().getBody().toString(); 
             exchange.getOut().setBody(res); 
           } 
         }) 
     .to("websocket://0.0.0.0:9292/camel-tweet?sendToAll=true"); 
     } 

} 

骆驼的配置如下所示:

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:camel="http://camel.apache.org/schema/spring" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd"> 


    <!-- Here we define Camel, notice the namespace it uses --> 
    <camelContext xmlns="http://camel.apache.org/schema/spring" trace="true"> 
     <routeBuilder ref="twitter-route-id" ></routeBuilder> 
    </camelContext> 

    <bean id="twitter-route-id" class="demo.websocket.TwitterStreamRoute" /> 

</beans> 

我的web.xml看起来像

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns="http://java.sun.com/xml/ns/javaee" 
     xmlns:camel="http://camel.apache.org/schema/spring" 
     xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
       http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
         id="WebApp_ID" version="3.0"> 
          <!-- your web.xml content here --> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      classpath:camel-config.xml 
     </param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <listener> 
     <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
    </listener> 


    <display-name>Archetype Created Web Application</display-name> 
          </web-app> 

我用我的POM以下版本.XML。完整的pom.xml文件是here

<properties> 
      <spring.version>3.2.2.RELEASE</spring.version> 
      <camel.version>2.11.0</camel.version> 
      <jetty.version>8.1.3.v20120416</jetty.version> 
    </properties> 

UPDATE(6月 - 2013,下午3:04 EST)

我更新了pom.xml中使用码头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] 

UPDATE 2(6可能 - 2013下午4点06 EST) 作为评价与请求响应信息中的谷歌浏览器文件是here建议通过@JoakimErdfelt。

+0

你的堆栈跟踪说码头8.1.9.v20130131,但你的POM说码头8.1.3.v20120416。这有点令人困惑。 – 2013-05-06 16:15:32

+0

是的,这很奇怪。让我再调试一下。 – 2013-05-06 16:34:43

+0

我用新的堆栈跟踪更新了原始问题。 – 2013-05-06 19:08:13

回答

3

我不认为我已经想通了这个错误背后的确切原因。但是,我有一个解决方案,不需要对代码进行重大更改即可使用。

我相信问题是与类加载在码头WebSocket的相关类和码头,Maven的插件。我的pom.xml中的插件没有正确配置,或者我缺少一些条目。在任何情况下,尝试了这一点几乎一天后,我的替代解决方案如下:

而不是使用码头 - Maven的插件来部署我用码头亚军(http://wiki.eclipse.org/Jetty/Howto/Using_Jetty_Runner)部署应用程序的应用。注意:请在您的pom.xml中下载与您的jetty.version相匹配的版本。

例如:

$java -jar jetty-runner-7.6.8.v20121106.jar target/jettycamelwebsocket.war 

在此之后,我能够从我的index.html访问的WebSocket没有任何问题。

现在,如果有人能从解释为什么这不工作(或缺少什么)码头 - Maven的插件,这将是非常有用的。

这里有一些参考文献,我发现非常有用。虽然他们约会了一些他们给了我一个提示,可能有问题的Jetty Maven插件,因此指出我正确的方向。

http://dev.eclipse.org/mhonarc/lists/jetty-users/msg00263.html

0

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

+0

看起来它不适用于Jetty 7.6 .x以及。我应该尝试的其他想法? – 2013-05-06 19:08:41

1

WebSocketFactory:236上的NPE是由于尝试升级而未通过真正的Jetty HTTP连接到达。

造成这种情况的最常见的原因:

  • 尝试使用的WebSockets码头上的Web容器,是不是码头。(如Tomcat或JBoss的)
  • 试图单位不使用真正的HTTP连接(如通过嘲弄库)测试你的WebSocket(servlet的)
+0

1.我的web容器是Jetty。 2。我正在使用一个真正的HTTP连接(请参阅index.html)。 – 2013-05-06 16:33:29

2

我面临同样的异常几天回来。该问题为空Connection对象。至少我的根本原因是码头设置。确保你的jetty start.ini文件中启用了websocket。事情是这样的 -

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

应该是默认启用,但它不是我们的情况,因为有人定制我们的start.ini和失误移除WebSocket的支持。在将它添加回来之后,websocket像Jetty 7.6.8一样工作。

+0

你知道如何在Maven Jetty插件中设置它吗? – 2013-05-06 20:34:04

+0

我找不到使用Maven插件运行时设置选项的方法。然而,使用$ mvn -X jetty:run检查了mvn类路径,它在类路径中包含了websocket jar。另请参阅http://dev.eclipse.org/mhonarc/lists/jetty-users/msg02544.html和http://paulfeaviour.wordpress.com/2010/04/01/running-websocket-example-with-jetty- mavenplugin – 2013-05-06 20:54:14

+0

'OPTIONS'行只是简单地将适当的jar添加到服务器类路径中。由于@SoumyaSimanta在他的堆栈跟踪中存在这些类,因此可以肯定地认为他满足了这个要求。 – 2013-05-06 21:09:49