【问题标题】:CometD and Tomcat is not Using Long-PollingCometD 和 Tomcat 未使用长轮询
【发布时间】:2014-07-18 03:03:59
【问题描述】:

我无法让 tomcat 与 cometD 和 Longpolling 一起工作。

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

我的 pom: 安装 Maven 战争插件 org.cometd.javascript cometd-javascript-道场 org.mortbay.jetty 码头Maven插件 10 /

<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 配置的一些内容?

【问题讨论】:

标签: json long-polling cometd jsonpath


【解决方案1】:

你的web.xml真的错了。

首先,如果您只想使用long-polling 传输,则不需要指定transports 。此参数用于附加传输,例如websocket。这是解释here

参数allowedTransports 指定传输名称,而不是完全限定的类名。 这是解释here

services 参数只能由 AnnotationCometdServlet 读取,如 here 所述(参见第 6.4.2.3.4 节)。

查看primer 以设置您的初始Web 应用程序,然后按照tutorials 操作。

【讨论】:

  • 你是对的。我修复了 servlet 类。该示例原样适用于码头。我遇到的问题是让它与 tomcat 和 websockets 一起运行。
【解决方案2】:

web.xml 中的过滤器必须标记为 true 例如 org.eclipse.jetty.continuation.ContinuationFilter

【讨论】:

    【解决方案3】:

    我不知道你是否解决了你的问题。我在使用 Faye 浏览器客户端 (JS) 时遇到了同样的问题。在我的案例中,当我在我的项目中添加一个新的 Transport 类并将它包含在我的 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();
        }
    }
    

    之后,将其包含在您的 web.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>
    

    它对我有用,我希望它对你也有帮助。

    最好的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      • 2021-06-23
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2014-04-30
      相关资源
      最近更新 更多