1

Jetty で Camel Websocket コンポーネントを使用しようとしていますが、次の例外を取り除くことができません。これが Camel で実行されている Jetty の問題なのか、バージョンの互換性の問題なのか、コードに何かが欠けているのかはわかりません。

誰かが試してみたい場合に備えて、プロジェクトを Github に置きました。 https://github.com/soumyasd/jettycamelwebsocket

アプリケーションを実行する手順は次のとおりです。

  1. このクラス src/main/java/demo/websocket/ で Twitter 資格情報を更新します。

  2. $mvn clean install

  3. $mvn jetty:run

  4. Web ブラウザ (私は Google Chrome を使用しました) を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]

これが私のメインの Camel ルートです。

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");
        }   

}

Camel の構成は次のようになります。

<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 はこちらです。

    <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>

更新 (2013 年 5 月 6 日、東部標準時午後 3 時 4 分)

Claus Ibsen の提案に従って、Jetty 7.6.x リリースを使用するように pom.xml を更新しました。しかし、私はまだ同じエラーが発生しています。また、この場合、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 (2013 年 5 月 6 日午後 4 時 6 分 EST) @JoakimErdfelt のコメントで提案されているように、リクエスト応答情報を含む Google Chrome ファイルはこちらです。

4

4 に答える 4

3

このエラーの背後にある正確な理由を理解していないと思います。ただし、コードに大きな変更を加えることなく機能するソリューションがあります。

問題は、Jetty と Jetty-maven-plugin の websocket 関連クラスのクラスローディングにあると思います。pom.xml のプラグインが正しく構成されていないか、いくつかのエントリがありません。いずれにせよ、これをほぼ1日試した後、私の代替ソリューションは次のとおりです。

Jetty-maven-plugin を使用してアプリケーションをデプロイする代わりに、Jetty Runner ( 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 にアクセスできました。

誰かが Jetty-maven-plugin からこれが機能しない理由 (または何が欠けているか) を説明できれば、それは本当に役に立ちます。

私が役に立ったと思った参考書をいくつか紹介します。それらのいくつかは日付が付けられていますが、Jetty Maven プラグインに問題がある可能性があるというヒントを与えてくれたので、正しい方向性を示してくれました。

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

于 2013-05-07T03:37:35.830 に答える
2

数日前に同じ例外に直面しました。問題は nullConnectionオブジェクトです。少なくとも私にとって根本的な原因は桟橋の設定でした。jetty start.ini ファイルで Websocket が有効になっていることを確認してください。このようなもの -

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

これはデフォルトで有効になっているはずですが、誰かが私たちの start.ini をカスタマイズして、websocket サポートを誤って削除したため、私たちの場合はそうではありませんでした。それを追加した後、websocket は Jetty 7.6.8 で魅力的に機能しました。

于 2013-05-06T20:15:40.440 に答える