ActiveMQ 使用Ajax 收发消息实战

2023-05-16

  1. 原理简析

ActiveMQ 在版本发布包中包含了web sample的demo,其中就包含js与ActiveMQ交互的库文件amq.js.
以5.8.0版本为例,该文件目录为
apache-activemq-5.8.0\webapps-demo\demo\js\amq.js这个js文件还依赖一些基于公共JavaScript框架的
适配器文件,比如依赖jQuery的适配器为amq_jquery_adapter.js. 因此,使用amq.js时,必须先引入
jquery库文件和适配器库文件amq_jquery_adapter.js,然后在引入amq.js.

amq.js里面提供了sendMessage方法可以发送消息到代理,而addListener和removeListener方法可以给
指定的的消息目的地添加或删除监听器,添加监听器后即可接收消息了.

在web页面使用sendMessage发送消息,其实是向后台的一个servlet发送请求,然后由该servlet发送消息给代理.
这个servlet的类由ActiveMQ提供(后面配置web.xml时介绍)

页面调用addListener注册监听器,其实也是发送请求给servlet,由servlet创建一个目的地的消费者,当该目的地
有消息时,servlet处理消息,并将消息处理响应发送给客户端.因为采用web的CS架构,servlet不能直接将响应发送
给客户端. 这里amq.js中其实是采用了一种页面轮询的方式向服务器请求消息,以便监听代理上指定的目的地.
详细信息参考ActiveMQ文档:http://activemq.apache.org/ajax.html

简而言之就是,
发送消息: amq.js使用sendMessage发送消息给servlet,servlet在将消息发给代理.
接收消息: amq.js使用addListener注册监听器接收并处理消息,其实也是发送请求给servlet,servlet产生消息消费者
消费指定目的地的消息并产生客户端响应,amq.js使用一种特殊的轮询机制不断从服务器获取消息处理的响应.

2.相关配置

本示例使用tomcat 5作为容器,使用Maven管理工程.

首先使用Maven插件建立一个web工程.

涉及到的配置文件有两个 web.xml和pom.xml.

2.1 web.xml配置,主要是配置接收客户端请求的servlet

Xml代码 收藏代码

AjaxServlet
org.apache.activemq.web.AjaxServlet
1

<servlet-mapping>  
  <servlet-name>AjaxServlet</servlet-name>  
  <url-pattern>/amq/*</url-pattern>  
</servlet-mapping>  


注意这里的<url-pattern>/amq/*</url-pattern>,配置会在amq.js发送消息时请求的servlet的rul,
在amq.js初始化时要做响应的配置.

上面<load-on-startup>1</load-on-startup>表示这个servlet在tomcat启动时就实例化,由前面远离
简析可知,这个servlet是要连接到实际的代理的,所以web.xml还提供了一个参数,用来配置这个servlet
要连接代理的URI,配置如下,表示启动时servlet将连接tcp://127.0.0.1:61616.
这里使用tcp://127.0.0.1:61616时,假如中途代理关闭了是不能自动重连的,可以使用
failover协议,在代理从失败中恢复时可以重连(URI使用failover://(tcp://127.0.0.1:61616)?randomize=false)

Xml代码 收藏代码

org.apache.activemq.brokerURL
tcp://127.0.0.1:61616
The URL of the Message Broker to connect to

下面的配置表明 不需要启用一个嵌入式代理

Xml代码 收藏代码

org.apache.activemq.embeddedBroker
false
Whether we should include an embedded broker or not

下面的配置是因为,
因为ajax+activemq需要servlet3.0的支持,而servlet3.0又只有在tomcat7中得到支持,
所有加上jetty此包,就能在tomcat5,tomcat6运行了。
(参考: http://blog.csdn.net/gongminrui8987/article/details/9446275
另,http://blog.csdn.net/goodbaby728/article/details/8853072)
注意,这里使用tomcat5必须要有下面的配置,否则不能接收消息,服务器报500错误.

Xml代码 收藏代码

session
org.eclipse.jetty.continuation.ContinuationFilter


session
/*

2.2 pom.xml配置

这个文件注意是配置依赖到的jar包.

注意配置下面两个即可:

Xml代码 收藏代码

org.apache.activemq
activemq-all
5.8.0


org.apache.activemq
activemq-web
5.8.0

  1. amq.js的使用

在index.jsp里面点击send按钮发送消息给主题:topic://TEST,并注册这个主题的监听器.
需要注意的地方:’
(1) 需要引入三个js

Js代码 收藏代码


(2)amq.js需要初始化

Js代码 收藏代码

$(document).ready( function() { org.activemq.Amq.init( { uri: 'amq', logging: true, timeout: 1, clientId:(new Date()).getTime().toString() } ); });
上面的url就是web.xml中配置的请求URL.其他的参数含有,可以看amq.js代码中的注释.
clientId是为了在一个浏览器的多个页面中使用ActiveMQ Ajax.
详情参考 http://activemq.apache.org/ajax.html 
页面的Using AMQ Ajax in Multiple Browser Windows 部分

(3) 发送消息
首先,消息的格式是格式良好的xml格式

Js代码 收藏代码
var msg = “”
+ “msg1”
+ “This is test content”
+ ““;

调用发送消息方法,点击按钮时,发送消息

Js代码 收藏代码
$(“#send”).click(
function()
{
amq.sendMessage(“topic://TEST”, msg);
});

(4) 接收消息
首先,定义消息处理器:

Js代码 收藏代码
var myHandler =
{
rcvMessage: function(message)
{
alert(message.getAttribute(‘type’));
//console.log(message);
}
};

然后注册消息处理器:
amq.addListener(“testHandlerId”,”topic://TEST”,myHandler.rcvMessage);
上面的第一个参数是处理器id,可以通过将这个ID传递给removeListener来取消注册.

注意,消息处理器中的message参数貌似是一个xml文档格式.
使用message.getAttribute(‘type’)这样可以获取属性值.
详细方法可以参考 ActiveMQ 版本中的chat例子.

  1. 扩展

    (1)使用ActiveMQ的Ajax特性可以作为一种实现服务器推送消息到客户端的处理方式.

    (2)采用两个消息目的地 Destination_Request和Destination_Response 可以实现请求 应答程序

    代理Broker_A 和 Broker_B互联,servlet 连接到 Broker_A,
    页面发送消息给Destination_Request,页面监听Destination_Response.

    同时有另一个系统,连接到Broker_B监听Destination_Request,收到消息后处理消息,将消息处理
    结果发送给Destination_Response.

  2. 遗留问题

    本例在Chrome 版本 32.0.1700.76 m 运行,发送消息时,控制台报错:
    Refused to set unsafe header “Connection” amq_jquery_adapter.js:77
    request.beforeSend amq_jquery_adapter.js:77
    c.extend.ajax jquery-1.4.2.min.js:128
    org.activemq.AmqAdapter.ajax amq_jquery_adapter.js:82
    sendJmsMessage amq.js:183
    sendMessage amq.js:276
    (anonymous function) (index):67
    c.event.handle jquery-1.4.2.min.js:55
    j.handle.o

因为这个错,不影响功能实现,这里选择忽略.

注:附件工程中org.apache.activemq.web.AjaxServlet
和org.apache.activemq.web.MessageListenerServlet
来自ActiveMQ-web包,拷贝到这里便于跟代码调试.

Maven版本及教程参考: http://jackyin5918.iteye.com/blog/1945203
myeclipse安装Maven插件参考: http://jackyin5918.iteye.com/blog/1945929

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ActiveMQ 使用Ajax 收发消息实战 的相关文章

  • 使用 FormData 上传 JavaScript Blob

    我在将 javascript 创建的 blob 上传到我的服务器时遇到问题 基本思想是用户上传图像 在 javascript 中我对图像进行居中裁剪并在传输之前对其进行下采样 图像处理工作正常 但上传本身无法正常工作 这是执行从 canva
  • AJAX 进度条 - 轮询、Comet?

    我想要一些关于如何实施以下内容的建议 我想让我的用户通过 AJAX 了解在我的服务器上运行的任务的进度 我的服务器运行一个 PHP 脚本 该脚本使用 popen 函数通过 shell 命令下载文件 它定期回显 打印正在发生的事情 我想使用
  • AJAX(原型/java)在执行期间获取部分状态更新

    这部分模仿了AJAX 原型 php 在脚本执行期间获取部分状态更新 https stackoverflow com questions 800997 ajax prototype php getting partial status upd
  • Vue.JS 可以与 AJAX http 调用一起使用吗?

    我正在尝试从 HTML 中执行以下操作 var vm new Vue el loginContent data main message Login isLoggedIn false loginError loginButton Login
  • 使用什么事件来在选择文本框中的值时显示警报消息

    我正在使用 jquery 的自动完成 api 来从数据库中获取名称 但是我想在从显示的文本框中选择名称时显示一条警报消息 我将显示一个图像以便更好地理解 当我输入 S 时 它将显示所有包含 S 的记录 所以问题是 如果我选择例如 Spars
  • 通过ajax执行后期操作时如何克服CORS重定向问题?

    我可以通过外部登录表单中的 post 方法类型提交表单来登录 roundcube 实例 托管在另一台服务器上 我收到此错误 通过 ajax 签名时 XMLHttpRequest 无法加载https 192 168 0 7 mail http
  • AngularJS:如何获取 $http 结果作为函数的返回值?

    在我的控制器中 我需要一个接受参数并从服务器返回 URL 的函数 像这样的东西 scope getPoster function title return http get http www omdbapi com t title y pl
  • 建议文本字段,如 - 谷歌建议 - 使用 AJAX/Jquery

    当我在文本字段中输入字母时 如果它在数据库中有匹配项 它应该显示所有匹配的单词 当我在 Travelfrom 文本字段中输入一些文本 例如 A 时 我应该获取以 A 开头的所有记录 当我输入 Travelfrom 文本字段 时 它会自动完成
  • Ajax 调用后使用 Django 模板呈现 JSON 对象

    我一直在尝试了解什么是最佳方法Ajax http en wikipedia org wiki Ajax 28programming 29 in Django http en wikipedia org wiki Django 28web f
  • 加载 angularjs 路由后运行 javascript 代码

    我需要在 angularjs 加载路线后显示警报 显示警报的代码位于 angularjs 异步加载的视图中 视图加载后 我希望它能够运行 但它没有 我知道我可以广播并告诉它稍后运行等 但我需要一个更通用的解决方案 假设您正在谈论基于以下内容
  • phonegap:基于 cookie 的身份验证 (PHP) 不起作用 [webview]

    我正在开发一个移动网络应用程序 使用 sencha touch HTML5 和 Phonegap 作为包装器 我正在使用 PHP 身份验证 Cookie 和 ajax 请求 在 safari 或 chrome 上一切正常 但在使用phone
  • 使用 MVC5、Ajax、C# 和 MSSQL Server 级联 DropdownList

    我对来自 Windows 窗体和三层架构的 MVC 非常陌生 我试图找出使用从数据库填充的级联下拉列表 DDL 我使用 MS SQL Server 2012 VS 2013 目前我正在研究用户调查问卷 用户可以从 DDL 的多个答案中进行选
  • Primefaces 对话框打开后更新

    我想在打开 primefaces 对话框后更新内容 是否可以 我的示例代码如下
  • 使用 Firefox 插件发出跨域 ajax 请求

    我对如何在 Firefox 插件中发出跨域 ajax 请求感到有点困惑 LastPass 和 Xmarks 等插件建议你可以做到这一点 但是当我尝试用 google 搜索你是如何做到这一点时 每个人似乎都说你不能 除非用户在 Firefox
  • 使用 AJAX 获取特定 DOM 元素(使用 Javascript,而不是 jQuery)

    如何使用 AJAX 用简单的 JavaScript 语言 NOTjQuery 获取页面 同一域 并仅显示特定的 DOM 元素 比如id为 bodyContent 标记的DOM元素 我正在使用 MediaWiki 1 18 所以我的方法必须稍
  • 数据表在按钮单击后初始化表(ajax,jquery)

    我在加载数据表对象时遇到问题 当我在页面加载时初始化并填充表时 它可以正常工作 下面的代码在页面重新加载时完美运行
  • 使用 AJAX 来回发送信息

    使用 post 你可以向服务器发送信息 但是当你需要从服务器接收信息时怎么办呢 信息如何从可以由 php 变量保存的方式变为可以由 javascript 变量保存的方式 反之亦然 这与您的问题更相关 http docs jquery com
  • 删除datagridview中的一行

    我想删除更新面板中 Gridview 中的一行 但我没有使用命令按钮 而是使用了链接按钮来获取确认消息 现在 如果我按 确定 则应删除该记录 从 db 和 frm girdview 中删除 我知道如何从数据库中删除 但不知道如何按下链接按钮
  • 将结果从 pdo 发送到 ajax 时遇到问题

    我想做的是 如果用户成功注册 pdo 将提供信息并将其发送到 ajax 如果用户注册与否 ajax 将发送消息 在我将这个条件放入我的 pdo 中后 它工作正常 现在它不会再插入 并且 ajax 告诉 注册用户时出错 每时每刻 script
  • jQuery 不断 ping 以获得 Ajax 响应

    如何使用 jQuery 不断运行 PHP 脚本并每秒获取响应 并将鼠标上的少量数据发送到同一脚本 我真的需要添加一些随机扩展才能让这样一个简单的计时器工作吗 迭代是人类的 递归是神圣的 L 彼得 多伊奇 http www devtopics

随机推荐

  • 服务器使用windows server 2008修改密码步骤教程

    1 进入服务器后右击计算机 xff0c 点击管理 xff0c 进入服务器管理器 2 在服务器管理器里面双击配置 xff08 打开下一列 xff09 双击本地用户和组 xff08 打开下一列 xff09 点击用户 3 右击Administra
  • yarn结构-2.9.0

    YARN最基本的想法就是把资源管理和任务调度 监听功能分成独立的守护进程 这个想法就是有一个全局的ResourceManager xff08 RM xff09 和每个应用独自的ApplicationMaster xff08 AM xff09
  • spark集群模式概览

    本文简短概述下spark如何在集群上运行 xff0c 使得更简单地理解涉及到的组件 可以通过读 应用提交指南 来学习在一个集群上加载应用 组件 spark应用作为独立的进程集运行在集群上 xff0c 在主应用 xff08 称为驱动程序 xf
  • SPARK RDD编程指南

    在高层次面上 xff0c 每个spark应用有一个驱动程序组成 xff0c 驱动程序运行用户的主函数 xff0c 在集群上执行很多并行操作 Spark提供的主要抽象是RDD xff0c 可以进行并行操作的跨节点分散的元素集 RDDs可以由H
  • Spark SQL,DataFrames and Datasets Guide

    概览 Spark SQL是Spark的一个结构化数据处理模块 不像基本的Spark RDD API xff0c Spark SQL提供的接口提供更多关于数据和执行的操作的结构信息 从内部看 xff0c Spark SQL使用额外的信息来执行
  • Structured Streaming Programming Guide-2.3.0

    概览 结构化流是一个可伸缩和容错的流处理引擎 xff0c 内置在Spark SQL 引擎中 你可以以对静态数据表达批处理计算的方式表达你的流计算 Spark SQL引擎会注意逐渐 持续第运行 xff0c 并随着流数据不断到来而更新最终的结果
  • 数据结构abc

    数据结构是指数据组织 xff08 逻辑 物理 xff09 的方式 xff0c 相应的操作 xff08 比如新增 查询 删除 修改 xff09 规则称为算法 xff0c 数据结构和算法构成数据管理方案 数据结构和算法相互影响 xff0c 同时
  • python之web.py

    安装 安装web py 请先下载 xff1a http webpy org static web py 0 37 tar gz 或者获取最新的开发版 xff1a https github com webpy webpy tarball ma
  • try-catch 报错

    try catch的意义 xff1a 1 报错处理 xff0c 输出日志 2 不影响代码块之外的代码执行 xff0c 即发生发生错误后之后的代码仍然后继续执行 try catch代码块与 throws Exception方法块区别 1 tr
  • DSP RTB SSP

    作者 xff1a 炸乌鸦面 链接 xff1a https www zhihu com question 23458646 answer 130631448 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非
  • eclipse常见问题

    1 设置js文件编辑器编码 2 设置项目部署位置 xff0c 是Tomcat安装目录还是workspace位置 3 设置Java源文件编译后class文件输出位置 4 Java类文件等修改后没有重新编译 如果还不行 xff0c 就将JRE库
  • Windows系统和Linux系统服务器该如何远程连接

    程序架设离不开服务器 xff0c 而服务器跟我们家用电脑类似 xff0c 也都有操作系统 xff0c 目前市场广泛使用的服务器操作系统有Windows系统和Linux系统 那么我们改如果远程连接上去操作嗯 xff0c 接下来就给大家分享下常
  • HTML5集锦

    1 js获取当前域名 Url 相对路径和参数以及指定参数 https www cnblogs com wangdahai p 6221399 html 2
  • web on servlet stack-5.0.4

    翻译自https docs spring io spring docs 5 0 4 RELEASE spring framework reference web html 这部分文档涵盖Servlet Stack的支持 基于Servlet
  • flume1.8.0用户指南

    以下内容翻译自http flume apache org FlumeUserGuide html 一 引入 1 概览 Apache Flume是一个分布式 可靠的 可用的系统 xff0c 高效地从不同的源收集 聚集和移动大量的日志数据到一个
  • easyui框架combotree和combobox多选模式取值样例

    combotree html lt div class 61 34 conditions staff ue clear 34 br style 61 34 overflow visible float left line height 30
  • SVM-support vector machine

    classification Algorithms SVM nearest neighbors random forest regression Algorithms SVR ridge regression Lasso cluster A
  • cmd端口进程管理

    根据端口号查找进程 gt netstat aon findstr 8080 TCP 0 0 0 0 8080 0 0 0 0 0 LISTENING 10064 TCP 8080 0 LISTENING 10064 根据进程好查找进程 gt
  • javaweb相对路径和绝对路径

    绝对路径 xff1a 相对磁盘位置 示例 xff1a E workspace git metadata plugins org eclipse wst server core tmp2 wtpwebapps project app uplo
  • ActiveMQ 使用Ajax 收发消息实战

    原理简析 ActiveMQ 在版本发布包中包含了web sample的demo 其中就包含js与ActiveMQ交互的库文件amq js 以5 8 0版本为例 该文件目录为 apache activemq 5 8 0 webapps dem