2013-05-29 5 views
0

У меня проблемы с работой tomcat с кометами и Longpolling.CometD и Tomcat не используют длинный опрос

Я вижу в firebug, что все запросы находятся в области ms, хотя опрос должен оставаться не менее 1 секунды. Сервер не отвечает за ms.

Вот что я получил в поджигатель:

8ms 
    dojo.j...ssed.js (Zeile 11610) 
    POST http://localhost:8080/chatty/cometd/connect 

    200 OK 
       4ms 
      dojo.j...ssed.js (Zeile 11610) 
     POST http://localhost:8080/chatty/cometd/connect 

    200 OK 
    2ms 
    dojo.j...ssed.js (Zeile 11610) 
    POST http://localhost:8080/chatty/cometd/connect 

Мой web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 

<servlet> 
    <servlet-name>cometd</servlet-name> 
    <servlet-class>org.cometd.server.CometdServlet</servlet-class> 
    <init-param> 
     <param-name>transports</param-name> 
     <param-value>org.cometd.websocket.server.JSONTransport</param-value> 
    </init-param> 
    <init-param> 
     <param-name>allowedTransports</param-name> 
     <param-value>org.cometd.server.transport.LongPollingTransport</param-value> 
    </init-param> 
    <init-param> 
     <param-name>services</param-name> 
     <param-value>com.xxxxx.StockPriceService</param-value> 
    </init-param> 
    <init-param> 
     <param-name>timeout</param-name> 
     <param-value>60000</param-value> 
    </init-param> 
    <init-param> 
     <param-name>logLevel</param-name> 
     <param-value>3</param-value> 
    </init-param> 
    <init-param> 
     <param-name>interval</param-name> 
     <param-value>0</param-value> 
    </init-param> 
    <init-param> 
     <param-name>long-polling.multiSessionInterval</param-name> 
     <param-value>2000</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    <async-supported>true</async-supported> 
</servlet> 
<servlet-mapping> 
    <servlet-name>cometd</servlet-name> 
    <url-pattern>/cometd/*</url-pattern> 
</servlet-mapping> 

<servlet> 
    <servlet-name>initializer</servlet-name> 
    <servlet-class>com.xxxxx.Initializer</servlet-class> 
    <load-on-startup>2</load-on-startup> 
</servlet> 

<filter> 
    <filter-name>cross-origin</filter-name> 
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>cross-origin</filter-name> 
    <url-pattern>/cometd/*</url-pattern> 
</filter-mapping> 

<filter> 
    <filter-name>continuation</filter-name> 
    <filter-class>org.eclipse.jetty.continuation.ContinuationFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>continuation</filter-name> 
    <url-pattern>/cometd/*</url-pattern> 
</filter-mapping> 

мой ПОМ: установить Maven-боевой плагин org.cometd.javascript cometd-Javascript-додзё org.mortbay.jetty причал-Maven-плагин /

<dependencies> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>servlet-api</artifactId> 
     <version>2.5</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.cometd.java</groupId> 
     <artifactId>bayeux-api</artifactId> 
     <version>${cometd-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.cometd.javascript</groupId> 
     <artifactId>cometd-javascript-dojo</artifactId> 
     <version>${cometd-version}</version> 
     <type>war</type> 
    </dependency> 
    <dependency> 
     <groupId>org.cometd.java</groupId> 
     <artifactId>cometd-java-server</artifactId> 
     <version>${cometd-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.cometd.java</groupId> 
     <artifactId>cometd-java-annotations</artifactId> 
     <version>${cometd-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.cometd.java</groupId> 
     <artifactId>cometd-java-client</artifactId> 
     <version>${cometd-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.cometd.java</groupId> 
     <artifactId>cometd-websocket-jetty</artifactId> 
     <version>${cometd-version}</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.cometd.java</groupId> 
       <artifactId>cometd-java-client</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-util</artifactId> 
     <version>${jetty-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-jmx</artifactId> 
     <version>${jetty-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-continuation</artifactId> 
     <version>${jetty-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-websocket</artifactId> 
     <version>${jetty-version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-servlets</artifactId> 
     <version>${jetty-version}</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.eclipse.jetty</groupId> 
       <artifactId>jetty-client</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-log4j12</artifactId> 
     <version>${slf4j-version}</version> 
    </dependency> 
</dependencies> 

Я что-то пропустил для конфигурации longpoll?

+0

Возможно, кто-то может сделать длинный пример опроса с помощью этого кода: https://github.com/cometd/cometd-tutorials/tree/master/client-hello – Androidewbie

ответ

0

Фильтры в web.xml должны быть помечены как истинный Для примера org.eclipse.jetty.continuation.ContinuationFilter

2

Ваш web.xml действительно ошибается.

Прежде всего, вам не нужно указать transports < Init-параметров >, если вы просто хотите использовать long-polling транспорт. Этот параметр предназначен для дополнительных транспортных средств, таких как websocket. Это объясняется here.

Параметр allowedTransports указывает транспорт фамилии, а не полные квалифицированные имена классов. Об этом сообщается here.

Параметр services только по AnnotationCometdServlet, как объяснено here (см. Раздел 6.4.2.3.4).

Посмотрите на primer, чтобы настроить исходное веб-приложение и следуйте по tutorials.

+0

Вы правы. Я исправил класс сервлета. Пример, как работает в причале. Проблема заключается в том, чтобы заставить ее работать с tomcat и websockets. – Androidewbie

0

Я не знаю, если вы решили вашу проблему. У меня была такая же проблема с использованием клиента Faye Browser (JS). В моем случае начал работать, когда я добавил новый класс транспорта в свой проект, и я включил его в свой web.xml.

Смотрите ниже:

package org.foo.bar.http.transports; 

import java.util.Enumeration; 

import java.io.IOException; 
import java.text.ParseException; 
import javax.servlet.ServletOutputStream; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.cometd.bayeux.server.ServerMessage; 
import org.cometd.server.BayeuxServerImpl; 
import org.cometd.server.ServerSessionImpl; 
import org.cometd.server.transport.LongPollingTransport; 


public class CrossOriginLongPollingTransport extends LongPollingTransport 
{ 
    public final static String PREFIX = "long-polling-cross-origin.json"; 
    public final static String NAME = "cross-origin-long-polling"; 
    public final static String MIME_TYPE_OPTION = "mimeType"; 

    private boolean _jsonDebug = false; 
    private String _mimeType = "application/json;charset=UTF-8"; 

    public CrossOriginLongPollingTransport(BayeuxServerImpl bayeux) 
    { 
     super(bayeux, NAME); 
     setOptionPrefix(PREFIX); 
    } 

    @Override 
    protected boolean isAlwaysFlushingAfterHandle() 
    { 
     return false; 
    } 

    @Override 
    protected void init() 
    { 
     super.init(); 
     _jsonDebug = getOption(JSON_DEBUG_OPTION, _jsonDebug); 
     _mimeType = getOption(MIME_TYPE_OPTION, _mimeType); 
    } 

    @Override 
    public boolean accept(HttpServletRequest request) 
    { 
     return "POST".equals(request.getMethod()); 
    } 

    @Override 
    protected ServerMessage.Mutable[] parseMessages(HttpServletRequest request) throws IOException, ParseException 
    { 
     String charset = request.getCharacterEncoding(); 
     if (charset == null) 
      request.setCharacterEncoding("UTF-8"); 
     String contentType = request.getContentType(); 
     if (contentType == null || contentType.startsWith("application/json")) 
      return parseMessages(request.getReader(), _jsonDebug); 
     else if (contentType.startsWith("application/x-www-form-urlencoded")) { 
      return parseMessages(request.getParameterValues(MESSAGE_PARAM)); 
     } else 
      throw new IOException("Invalid Content-Type " + contentType); 
    } 

    @Override 
    protected ServletOutputStream beginWrite(HttpServletRequest request, HttpServletResponse response, ServerSessionImpl session) throws IOException 
    { 
     response.setContentType(_mimeType); 
     ServletOutputStream output = response.getOutputStream(); 
     output.write('['); 
     return output; 
    } 

    @Override 
    protected void endWrite(ServletOutputStream output, ServerSessionImpl session) throws IOException 
    { 
     output.write(']'); 
     output.close(); 
    } 
} 

после, включить в сеть.xml:

<init-param> 
     <param-name>transports</param-name> 
     <param-value>org.cometd.websocket.server.WebSocketTransport,org.foo.bar.http.transports.CrossOriginLongPollingTransport</param-value> 
    </init-param> 
    <init-param> 
     <param-name>allowedTransports</param-name> 
     <param-value>cross-origin-long-polling,long-polling,callback-polling,websocket</param-value> 
    </init-param> 

Это сработало для меня, надеюсь, вы тоже могли бы помочь.

Лучший.