- 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/
我一直在读到,如果一个集合“被释放”,它也会释放它的所有对象。另一方面,我还读到,一旦集合被释放,集合就会释放它的对象。 但最后一件事可能并不总是发生,正如苹果所说。系统决定是否取消分配。在大多数情况
我有一个客户端-服务器应用程序,它使用 WCF 进行通信,并使用 NetDataContractSerializer 序列化对象图。 由于服务器和客户端之间传输了大量数据,因此我尝试通过微调数据成员的
我需要有关 JMS 队列和消息处理的帮助。 我有一个场景,需要针对特定属性组同步处理消息,但可以在不同属性组之间同时处理消息。 我了解了特定于每个属性的消息组和队列的一些知识。我的想法是,我想针对
我最近开始使用 C++,并且有一种强烈的冲动 #define print(msg) std::cout void print(T const& msg) { std::cout void
我已经为使用 JGroups 编写了简单的测试。有两个像这样的简单应用程序 import org.jgroups.*; import org.jgroups.conf.ConfiguratorFact
这个问题在这里已经有了答案: Firebase messaging is not supported in your browser how to solve this? (3 个回答) 7 个月前关
在我的 C# 控制台应用程序中,我正在尝试更新 CRM 2016 中的帐户。IsFaulted 不断返回 true。当我向下钻取时它返回的错误消息如下: EntityState must be set
我正在尝试通过 tcp 将以下 json 写入 graylog 服务器: {"facility":"GELF","file":"","full_message":"Test Message Tcp",
我正在使用 Django 的消息框架来指示成功的操作和失败的操作。 如何排除帐户登录和注销消息?目前,登录后登陆页面显示 已成功登录为“用户名”。我不希望显示此消息,但应显示所有其他成功消息。我的尝试
我通过编写禁用qDebug()消息 CONFIG(release, debug|release):DEFINES += QT_NO_DEBUG_OUTPUT 在.pro文件中。这很好。我想知道是否可以
我正在使用 ThrottleRequest 来限制登录尝试。 在 Kendler.php 我有 'throttle' => \Illuminate\Routing\Middleware\Throttl
我有一个脚本,它通过die引发异常。捕获异常时,我想输出不附加位置信息的消息。 该脚本: #! /usr/bin/perl -w use strict; eval { die "My erro
允许的消息类型有哪些(字符串、字节、整数等)? 消息的最大大小是多少? 队列和交换器的最大数量是多少? 最佳答案 理论上任何东西都可以作为消息存储/发送。实际上您不想在队列上存储任何内容。如果队列大部
基本上,我正在尝试创建一个简单的 GUI 来与 Robocopy 一起使用。我正在使用进程打开 Robocopy 并将输出重定向到文本框,如下所示: With MyProcess.StartI
我想将进入 MQ 队列的消息记录到数据库/文件或其他日志队列,并且我无法修改现有代码。是否有任何方法可以实现某种类似于 HTTP 嗅探器的消息记录实用程序?或者也许 MQ 有一些内置的功能来记录消息?
我得到了一个带有 single_selection 数据表和一个命令按钮的页面。命令按钮调用一个 bean 方法来验证是否进行了选择。如果不是,它应该显示一条消息警告用户。如果进行了选择,它将导航到另
我知道 MSVC 可以通过 pragma 消息做到这一点 -> http://support.microsoft.com/kb/155196 gcc 是否有办法打印用户创建的警告或消息? (我找不到谷
当存在大量节点或二进制数据时, native Erlang 消息能否提供合理的性能? 情况 1:有一个大约 50-200 台机器的动态池(erlang 节点)。它在不断变化,每 10 分钟大约添加或删
我想知道如何在用户登录后显示“欢迎用户,您已登录”的问候消息,并且该消息应在 5 秒内消失。 该消息将在用户成功登录后显示一次,但在同一 session 期间连续访问主页时不会再次显示。因为我在 ho
如果我仅使用Welcome消息,我的代码可以正常工作,但是当打印p->client_name指针时,消息不居中。 所以我的问题是如何将消息和客户端名称居中,就像它是一条消息一样。为什么它目前仅将消
我是一名优秀的程序员,十分优秀!