- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在我的项目中使用 Cometd,并在 Tomcat 7 服务器上尝试了 Jetty 8 版本。它有效,但消息被发送了两次。
为了检查它是否与项目的其余部分有关,我设置了一个仅具有此功能的独立项目,但我仍然收到两次消息。
我不知道为什么会这样。
项目中有5个文件:
以下是每个文件的代码:
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:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>Sertal Vision</display-name>
<servlet>
<servlet-name>cometd</servlet-name>
<servlet-class>org.cometd.server.CometdServlet</servlet-class>
<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>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>bayeux-init</servlet-name>
<servlet-class>ch.sertal.server.BayeuxInitializer</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cometd</servlet-name>
<url-pattern>/cometd/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>bayeux-init</servlet-name>
<url-pattern>/bayeux/servlet/*</url-pattern>
</servlet-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>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<script type="text/javascript" src="js/dojo/dojo/dojo.js"></script>
<script type="text/javascript">
var subscription = undefined;
dojo.addOnLoad( function () {
dojo.require( "dojox.cometd" );
dojo.require("dojox.timing");
// Disconnect when the page unloads
dojo.addOnUnload( function () {
dojox.cometd.disconnect( true );
} );
var cometURL = "cometd";
dojox.cometd.init( cometURL );
var subscription = dojox.cometd.subscribe( "/sertal/formData", function ( message ) {
dojo.create( "li", {
innerHTML:message.data.count
}, dojo.byId( "message-list" ) );
} );
i = 1;
var t = new dojox.timing.Timer();
t.setInterval( 1000 );
t.onTick = function() {
dojox.cometd.publish( '/sertal/formData', { count: i++ } );
};
t.start();
} );
</script>
</head>
<body>
<div>
<ul id="message-list"/>
</div>
</body>
</html>
BayeuxInitializer.java
package ch.sertal.server;
import org.cometd.bayeux.server.BayeuxServer;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class BayeuxInitializer extends GenericServlet {
private static final long serialVersionUID = -9089442901563633963L;
@Override
public void init() throws ServletException {
BayeuxServer bayeux = ( BayeuxServer ) getServletContext().getAttribute( BayeuxServer.ATTRIBUTE );
// new HelloService( bayeux );
new FormDataService( bayeux, getServletContext() );
}
@Override
public void service( ServletRequest servletRequest, ServletResponse servletResponse ) throws ServletException, IOException {
throw new ServletException( "sorry :-)" );
}
}
FormDataService.java
package ch.sertal.server;
import org.cometd.bayeux.Message;
import org.cometd.bayeux.server.BayeuxServer;
import org.cometd.bayeux.server.ServerSession;
import org.cometd.server.AbstractService;
import javax.servlet.ServletContext;
import java.util.Map;
/**
* Created by IntelliJ IDEA.
* User: micha.roon
* Date: 1/16/12
* Time: 12:25 PM
* To change this template use File | Settings | File Templates.
*/
public class FormDataService extends AbstractService {
private ServletContext context = null;
public FormDataService( BayeuxServer bayeux, ServletContext context ) {
super( bayeux, "hello" );
this.context = context;
addService( "/sertal/formData", "processFormData" );
System.out.println( "New FormDataService" );
}
public void processFormData( final ServerSession remote, Message message ) {
Map<String, Object> input = message.getDataAsMap();
remote.deliver( getServerSession(), "/sertal/formData", input, null );
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>BayeuxTest</groupId>
<artifactId>BayeuxTest</artifactId>
<version>1.0</version>
<build>
<plugins>
<!--compiler plugin-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<username>${tomcat.username}</username>
<password>${tomcat.password}</password>
<url>${tomcat.manager}</url>
<path>${tomcat.context}</path>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<!--for cometd support-->
<dependency>
<groupId>org.cometd.java</groupId>
<artifactId>bayeux-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.cometd.javascript</groupId>
<artifactId>cometd-javascript-jquery</artifactId>
<version>2.3.1</version>
<type>war</type>
</dependency>
<dependency>
<groupId>org.cometd.java</groupId>
<artifactId>cometd-java-server</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlets</artifactId>
<version>8.0.4.v20111024</version>
<exclusions>
<exclusion>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
</project>
最佳答案
当您使用普通 channel (/sertal/formData) 时,所有发布的帖子都将发送到所有订阅的客户端,在您的情况下,即浏览器本身和 Bayeux 服务。因此,您将收到两个答案:一个是您发布的帖子,另一个是您的服务的响应。
解决方案:您不想发布
您的formData,您希望它交付
:
...
t.onTick = function() {
dojox.cometd.deliver( '/sertal/formData', { count: i++ } );
};
...
还有其他解决方案,例如使用服务 channel 而不是普通 channel 。看这个CometD FAQ Entry以获得进一步的解释。
更新:
我保留了在我的机器上进行这项工作所需的另一项更改:需要在 addOnLoad
处理程序之外调用 dojo.require
。
...
dojo.require("dojox.cometd");
dojo.require("dojox.timing");
dojo.addOnLoad(function () {
...
我一直在使用dojo v1.7.1。
关于javascript - cometd 消息发送两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9052510/
我只是 cometd 的初学者,我很感兴趣并想了解什么是 cometd 以及它的用途我用谷歌搜索并找到了一些资源。在以下链接下 1. http://docs.cometd.org/reference/
正如标题所说,我正在开发网络聊天应用程序,我希望其中有很多用户活跃,并且不能使用 ajax 轮询。我基本上想让一个人 2 人聊天,但请原谅我是一个菜鸟,但我真的迷路了。我读过很多关于 cometd 的
我正在开发我目前正在使用的 Spring-MVC 应用程序在 Apache tomcat 7.0.55 上使用 Cometd 实现聊天功能。我有基本的代码在运行,我可以通过 channel 发送消息并
我正在尝试在 Jetty 9.2 上运行我们的 Spring-MVC 应用程序,该应用程序具有 Cometd(3.0.9)。目前它与 Tomcat7 完美配合,但我们正在将 Jetty 作为另一个应用
我可以通过简化版本的示例来最好地描述我正在寻找的内容。 Tornado 的演示之一是一个简单的聊天服务器: https://github.com/facebook/tornado/blob/maste
它的功能就是所谓的“服务器推送”,google wave 似乎也利用了这一点。 有人能解释一下这个概念通过代码片段 它如何在 Web 应用程序中实际工作? 最佳答案 一些伪javascript: /
我在本地主机上使用Orbited作为Comet服务器。它正在监听端口: 9000 for http 61613 for stomp 我的JavaScript调试器报告错误:未在行中定义JSON: va
我在向客户端发回消息时遇到问题。下面是我的代码 JavaScript dojox.cometd.publish('/service/getservice', {
我正在考虑编写一个需要能够将消息推送到浏览器的实时网络应用程序。当我第一次阅读 Comet 时,由于浏览器支持薄弱,人们似乎认为它是一种脆弱且不成熟的方法。今天,它似乎是一种既定又实用的技术。但据我所
对于不需要“实时”但可能延迟(例如 1 分钟)的事件是否值得使用 Comet。这样将是: 推特状态更新 Facebook 更新 我知道 comet 非常适合聊天应用程序(facebook 和 GTal
我对 java 中的 cometd 很陌生。 我对 java 中的 cometd 更感兴趣,但是当我用 google 搜索它时,我几乎找不到一个链接这是 cometd 链接,文档中不清楚。 有人可以发
我开发 Web 应用程序已经有一段时间了,但最近才接触到 Comet 服务器端推送技术,我对这项技术的理解还很不成熟。而链接http://www.zeitoun.net/articles/comet_
我有一个 cometd 应用程序在 jetty 内运行。我想从客户端获取传入的广播,然后进行一些处理(涉及与数据库交互),然后如果没有遇到错误,则通过向所有订阅者广播来完成。 我最初的想法是通过扩展来
是否有基于 .net 的 cometd 引擎?比如 Ajax 推送引擎 那是免费和开源的吗? 最佳答案 轨道式 Orbited是一个 HTTP 守护进程,针对长期 cometd 连接进行了优化。它旨在
我有一些关于 Comet 的信息,但我想知道它如何保持连接打开(从客户端到服务器)。它是如何做到的? 最佳答案 从长远来看,Comet 或长轮询 ajax 不会保持连接打开。 HTTP 是无状态的,它
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试在我的应用程序中实现 Comet,但由于没有使用 JavaScript 的经验,我不确定如何在客户端实现。 当服务器收到一个请求时,它只是保持它打开并在必要时向它写入数据: def rend
我一直在我的网络应用程序的日志文件中看到奇怪的消息。 127.0.0.1 - - [15/Jan/2013:23:00:53 +0000] "POST /cometd/connect HTTP/1.1
嗨,很长一段时间以来,我一直在尝试在 tomcat 中使用 comet 制作聊天应用程序。问题是我已经在云中部署了应用程序,其中开放连接有 30 秒的上限。因此,每当服务器需要超过 30 秒的时间来响
我有一个关于 Comet 实现的问题。我知道它用于处理类似于现在可以通过 Servlet 3.0 异步功能实现的异步请求。然而,我不明白的是如何向调用客户端完成推送。 在网络套接字中,我们通过提供 i
我是一名优秀的程序员,十分优秀!