2013-05-05 1 views
1

Я пытаюсь запустить компонент Camel Websocket на Jetty, но не могу избавиться от следующего исключения. Я не уверен, что проблема с Jetty, работающая с Camel, или проблемы с совместимостью версий или чего-то не хватает в моем коде.Исключение запуска простого веб-узла с компонентом Camel на Jetty

Я поставил проект на Github на случай, если кто-то захочет попробовать. https://github.com/soumyasd/jettycamelwebsocket

Ниже приведены шаги для запуска приложения.

  1. Обновить учетные данные Twitter в этом классе SRC/главная/Java/демо/WebSocket/

  2. $mvn clean install

  3. $mvn jetty:run

  4. Укажите ваш веб-браузер (я использовал 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] 

Вот мой главный маршрут верблюда.

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> 

~

Я использую следующие версии в моем ПОМ .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-May-2013, 3:04 вечера EST)

Я обновил 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] 

UPDATE 2 (6-May-2013 4:06 вечера EST) Как было предложено @JoakimErdfelt в комментариях файл Google Chrome с информацией ответа на запрос является here.

+0

Ваш StackTrace говорит Jetty 8.1.9.v20130131, но ваш ПОМ говорит Jetty 8.1.3.v20120416. Это немного запутанно. –

+0

Да, это странно. Позвольте мне отладить его немного больше. –

+0

Я обновил исходный вопрос с помощью новой stacktrace. –

ответ

3

Не думаю, что я выяснил точную причину этой ошибки. Однако у меня есть решение, которое работает без серьезных изменений кода.

Я считаю, что проблема связана с классной загрузкой для классов, связанных с веб-сокетами, в Jetty и Jetty-maven-plugin. Либо мой плагин в моем pom.xml не настроен должным образом, либо мне не хватает некоторых записей. В любом случае, пробовав это почти в течение дня, мое альтернативное решение выглядит следующим образом:

Вместо того, чтобы использовать Jetty-maven-плагин для развертывания приложения, я использовал Jetty Runner (http://wiki.eclipse.org/Jetty/Howto/Using_Jetty_Runner) для развертывания приложения. ПРИМЕЧАНИЕ. Загрузите версию, которая соответствует вашей версии jetty.version в вашем pom.xml.

Например:

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

После этого я был в состоянии получить доступ к WebSocket из моей index.html без каких-либо проблем.

Теперь, если кто-то может объяснить, почему это не работает (или чего не хватает) из Jetty-maven-plugin, это было бы действительно полезно.

Вот несколько ссылок, которые я нашел полезными. Хотя они датированы, некоторые из них дали мне намек на то, что, возможно, что-то не так с плагином 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. Любые другие идеи, которые я должен попробовать? –

1

NPE на WebSocketFactory:236 произошел из-за попытки обновления без прибытия через реальное соединение HTTP Jetty.

Наиболее распространенные причины для этого:

  • Попытка использовать Jetty WebSockets на веб-контейнер, который не мола.(Например, кот или JBoss)
  • Попытки блока протестировать WebSocket (сервлет) без использования подключения в режиме реального HTTP (например, с помощью насмешливой библиотеки)
+0

1. Мой веб-контейнер - Jetty. 2.И я использую настоящее HTTP-соединение (см. Index.html). –

2

я столкнулся с тем же исключениями пары дней назад. Проблема: null Connection объект. По крайней мере, для меня основной причиной были настройки причала. Удостоверьтесь, что у вас есть websocket включен в файле запуска start.ini. Нечто подобное -

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

Она должна быть включена по умолчанию, но это не было в нашем случае, так как кто-то настроен наш start.ini и убрали поддержку WebSocket по ошибке. После добавления обратно websocket работал как шарм с Jetty 7.6.8.

+0

Знаете ли вы, как установить это в Maven Jetty Plugin? –

+0

Я не мог найти способ установить параметры при работе с плагином Maven. Однако проверял путь mvn classpath с помощью $ mvn -X jetty: run и он имеет банки websocket в пути к классам. Также см. Http://dev.eclipse.org/mhonarc/lists/jetty-users/msg02544.html и http://paulfeaviour.wordpress.com/2010/04/01/running-websocket-example-with-jetty- mavenplugin –

+0

строка 'OPTIONS' просто добавляет соответствующие банки в путь класса сервера. Поскольку у @SoumyaSimanta есть те классы, которые присутствуют в его stacktrace, можно с уверенностью предположить, что он удовлетворил это требование. –

Смежные вопросы