REST和AJAX

REST
通过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=&#39;TEST&#39;" } );

多窗口浏览器
对于多窗口浏览器而言,他们的session是共享的,而ajax方式是基于session模式的,因此需要为每个标签页指定唯一id

org.activemq.Amq.init({
  uri: &#39;amq&#39;,
  logging: true,
  timeout: 45,
  clientId:(new Date()).getTime().toString() //id
});

由于会启用一个保持连接的方式等待消息到来,对于支持异步servlet的servlet3.0服务器,会具有更好的性能。

activemq使用 Jetty 6 Continuations ,来完成servlet3.0 的异步功能。

猜你喜欢

转载自liyixing1.iteye.com/blog/2155076