通过activemq提供的servlet
<servlet> <servlet-name>MessageServlet</servlet-name> <servlet-class>org.apache.activemq.web.MessageServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>MessageServlet</servlet-name> <url-pattern>/message/*</url-pattern> </servlet-mapping>
通过这样的配置,代理的消息目的地就通过下面的RUI路径暴露出来.比如,STOCKS.JAVA消息主题就被映射到
下面的URI上:http://localhost:8161/demo/message/STOCKS/JAVA?type=topic
Ajax API
首先需要使用ajax servlet
<servlet> <servlet-name>AjaxServlet</servlet-name> <servlet-class>org.apache.activemq.web.AjaxServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AjaxServlet</servlet-name> <url-pattern>/amq/*</url-pattern> </servlet-mapping> <context-param> <param-name>org.apache.activemq.brokerURL</param-name> <param-value>tcp://localhost:61616</param-value> <description>The URL of the Message Broker to connect to</description> </context-param>
在页面引用js文件
<script type="text/javascript" src="amq/amq.js"></script>
<script type="text/javascript">
//指定url地址
amq.uri='/amq';
</script>
发送消息
amq.sendMessage("topic://TEST", "message");
如果你打算订阅某个特定的消息目的地(或多个消息目的地),你需要注册一个回调函数,当接收到一个
新消息时,会调用这个函数
通过 amq对象的addListener() 注册回调函数,该函数除了接受一个 回
调函数作为参数外,同时还接受一个订阅的消息目的和一个ID作为参数,使用该ID参数使得进一步处
理这个监听器成为可能.
var priceHandler = { _price: function(message) { if (message != null) { var price = parseFloat(message.getAttribute('bid')) var symbol = message.getAttribute('stock') var movement = message.getAttribute('movement') if (movement == null) { movement = 'up' } var row = document.getElementById(symbol) if (row) { // perform portfolio calculations var value = asFloat(find(row, 'amount')) * price var pl = value - asFloat(find(row, 'cost')) // now let’s update the HTML DOM find(row, 'price').innerHTML = fixedDigits(price, 2) find(row, 'value').innerHTML = fixedDigits(value, 2) find(row, 'pl').innerHTML = fixedDigits(pl, 2) find(row, 'price').className = movement find(row, 'pl').className = pl >= 0 ? 'up' : 'down' } } } }; function portfolioPoll(first) { if (first) { amq.addListener('stocks', 'topic://STOCKS.*', priceHandler._price); } } amq.addPollHandler(portfolioPoll);
对于新版本而言,整个js api已经发生了变化,使用了适配器的概念,如果想让它对jquery环境下运行,需要添加jquery适配器
其中主题是topic://MY.NAME
队列是channel://MY.NAME
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> <script type="text/javascript" src="js/jquery-1.11.1.min.js"></script> <script type="text/javascript" src="js/amq_jquery_adapter.js"></script> <script type="text/javascript" src="js/amq.js"></script> <script type="text/javascript"> var amq = org.activemq.Amq; amq.init({ uri : 'amq.do', logging : true, timeout : 200 }); </script> </head> <body> <div id="show">------------------------------------------------------------------------------------------------------------------</div> <script type="text/javascript"> function send() { //"topic://MY.NAME"(主题) or "channel://MY.NAME"(队列) or queue://队列 amq.sendMessage('topic://liyixing11', $('#value').val()); } </script> <div> <input type='button' value='send' onclick='send()' /> <input type='text' id='value' value='send' /> </div> </body> </html> <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> <script type="text/javascript" src="js/jquery-1.11.1.min.js"></script> <script type="text/javascript" src="js/amq_jquery_adapter.js"></script> <script type="text/javascript" src="js/amq.js"></script> <script type="text/javascript"> var amq = org.activemq.Amq; amq.init({ uri : 'amq.do', logging : true, timeout : 200 }); </script> </head> <body> <div id="show">------------------------------------------------------------------------------------------------------------------</div> <script type="text/javascript"> var id = new Date().getTime() + 'x'; var myHandler = { rcvMessage : function(message) { var show = $('#show'); show.html(show.html() + '<br>' + message); } }; $(function() { var show = $('#show'); show.html(show.html() + '<br>' + id); //第一个参数是ID //当使用完毕后,可以使用amq.removeHandler(myId)来移除监听 //"topic://MY.NAME"(主题) or "channel://MY.NAME"(队列) or queue://队列 amq.addListener(id, 'topic://liyixing11', myHandler.rcvMessage); }); </script> </body> </html>
api
//过滤器
amq.addListener( myId, myDestination, myHandler.rcvMessage, { selector:"identifier='TEST'" } );
多窗口浏览器
对于多窗口浏览器而言,他们的session是共享的,而ajax方式是基于session模式的,因此需要为每个标签页指定唯一id
org.activemq.Amq.init({
uri: 'amq',
logging: true,
timeout: 45,
clientId:(new Date()).getTime().toString() //id
});
由于会启用一个保持连接的方式等待消息到来,对于支持异步servlet的servlet3.0服务器,会具有更好的性能。
activemq使用 Jetty 6 Continuations ,来完成servlet3.0 的异步功能。