﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-昊天-随笔分类-JMS</title><link>http://www.blogjava.net/hao446tian/category/51265.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 29 Mar 2012 08:15:44 GMT</lastBuildDate><pubDate>Thu, 29 Mar 2012 08:15:44 GMT</pubDate><ttl>60</ttl><item><title>使用 ActiveMQ 示例</title><link>http://www.blogjava.net/hao446tian/archive/2012/03/29/372991.html</link><dc:creator>昊天</dc:creator><author>昊天</author><pubDate>Thu, 29 Mar 2012 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/hao446tian/archive/2012/03/29/372991.html</guid><wfw:comment>http://www.blogjava.net/hao446tian/comments/372991.html</wfw:comment><comments>http://www.blogjava.net/hao446tian/archive/2012/03/29/372991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hao446tian/comments/commentRss/372991.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hao446tian/services/trackbacks/372991.html</trackback:ping><description><![CDATA[<p>企业中各项目中相互协作的时候可能用得到消息通知机制。比如有东西更新了，可以通知做索引。</p>
<p>在 Java 里有 JMS 的多个实现。其中 apache 下的 ActiveMQ 就是不错的选择。还有一个比较热的是 RabbitMQ （是 erlang 语言实现的）。这里示例下使用 ActiveMQ</p>
<p>用 ActiveMQ 最好还是了解下 JMS</p>
<table border="2">
<tbody>
<tr>
<td><strong>JMS 公共</strong></td>
<td><strong>点对点域</strong></td>
<td><strong>发布/订阅域</strong></td></tr>
<tr>
<td>ConnectionFactory</td>
<td>QueueConnectionFactory</td>
<td>TopicConnectionFactory</td></tr>
<tr>
<td>Connection</td>
<td>QueueConnection</td>
<td>TopicConnection</td></tr>
<tr>
<td>Destination</td>
<td>Queue</td>
<td>Topic</td></tr>
<tr>
<td>Session</td>
<td>QueueSession</td>
<td>TopicSession</td></tr>
<tr>
<td>MessageProducer</td>
<td>QueueSender</td>
<td>TopicPublisher</td></tr>
<tr>
<td>MessageConsumer</td>
<td>QueueReceiver</td>
<td>TopicSubscriber</td></tr></tbody></table>
<p>JMS 定义了两种方式：Quere（点对点）；Topic（发布/订阅）。</p>
<p>ConnectionFactory 是连接工厂，负责创建Connection。</p>
<p>Connection 负责创建 Session。</p>
<p>Session 创建 MessageProducer（用来发消息） 和 MessageConsumer（用来接收消息）。</p>
<p>Destination 是消息的目的地。</p>
<p>详细的可以网上找些 JMS 规范（有中文版）。</p>
<p>下载 apache-activemq-5.3.0。<a href="http://activemq.apache.org/download.html" target="_blank">http://activemq.apache.org/download.html</a>，解压，然后双击 bin/activemq.bat。运行后，可以在 <a href="http://localhost:8161/admin" target="_blank">http://localhost:8161/admin</a> 观察。也有 demo， <a href="http://localhost:8161/demo" target="_blank">http://localhost:8161/demo</a>。把 activemq-all-5.3.0.jar 加入 classpath。</p>
<p>Jms 发送 代码：</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j"><li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ConnectionFactory&nbsp;connectionFactory&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ActiveMQConnectionFactory(); &nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;connection&nbsp;=&nbsp;connectionFactory.createConnection(); &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;connection.start(); &nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;=&nbsp;connection.createSession(Boolean.TRUE,&nbsp;Session.AUTO_ACKNOWLEDGE); &nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Destination&nbsp;destination&nbsp;=&nbsp;session.createQueue(</span><span class="string">"my-queue"</span><span>); &nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;MessageProducer&nbsp;producer&nbsp;=&nbsp;session.createProducer(destination); &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number"><font color="#c00000">0</font></span><span>;&nbsp;i&lt;</span><span class="number"><font color="#c00000">3</font></span><span>;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MapMessage&nbsp;message&nbsp;=&nbsp;session.createMapMessage(); &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setLong(</span><span class="string">"count"</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date().getTime()); &nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span class="number"><font color="#c00000">1000</font></span><span>); &nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//通过消息生产者发出消息 </span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;producer.send(message); &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;session.commit(); &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;session.close(); &nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;connection.close(); &nbsp;&nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre class="java" style="display: none" name="code">public static void main(String[] args) throws Exception {
	ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();

	Connection connection = connectionFactory.createConnection();
	connection.start();

	Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
	Destination destination = session.createQueue("my-queue");

	MessageProducer producer = session.createProducer(destination);
	for(int i=0; i&lt;3; i++) {
		MapMessage message = session.createMapMessage();
		message.setLong("count", new Date().getTime());
		Thread.sleep(1000);
		//通过消息生产者发出消息
		producer.send(message);
	}
	session.commit();
	session.close();
	connection.close();
}
</pre>
<p>Jms 接收代码：</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j"><li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ConnectionFactory&nbsp;connectionFactory&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ActiveMQConnectionFactory(); &nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;connection&nbsp;=&nbsp;connectionFactory.createConnection(); &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;connection.start(); &nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">final</span><span>&nbsp;Session&nbsp;session&nbsp;=&nbsp;connection.createSession(Boolean.TRUE,&nbsp;Session.AUTO_ACKNOWLEDGE); &nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Destination&nbsp;destination&nbsp;=&nbsp;session.createQueue(</span><span class="string">"my-queue"</span><span>); &nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;MessageConsumer&nbsp;consumer&nbsp;=&nbsp;session.createConsumer(destination); &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/*//listener&nbsp;方式 </span>&nbsp;</span></li><li class=""><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;consumer.setMessageListener(new&nbsp;MessageListener()&nbsp;{ </span>&nbsp;</li><li class="alt"><span class="comment"></span>&nbsp;</li><li class=""><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onMessage(Message&nbsp;msg)&nbsp;{ </span>&nbsp;</li><li class="alt"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MapMessage&nbsp;message&nbsp;=&nbsp;(MapMessage)&nbsp;msg; </span>&nbsp;</li><li class=""><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//TODO&nbsp;something.... </span>&nbsp;</li><li class="alt"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("收到消息："&nbsp;+&nbsp;new&nbsp;Date(message.getLong("count"))); </span>&nbsp;</li><li class=""><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.commit(); </span>&nbsp;</li><li class="alt"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </span>&nbsp;</li><li class=""><span class="comment"></span>&nbsp;</li><li class="alt"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;}); </span>&nbsp;</li><li class=""><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(30000); </span>&nbsp;</li><li class="alt"><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number"><font color="#c00000">0</font></span><span>; &nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(i&lt;</span><span class="number"><font color="#c00000">3</font></span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++; &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MapMessage&nbsp;message&nbsp;=&nbsp;(MapMessage)&nbsp;consumer.receive(); &nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.commit(); &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//TODO&nbsp;something.... </span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"收到消息："</span><span>&nbsp;+&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date(message.getLong(</span><span class="string">"count"</span><span>))); &nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;session.close(); &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;connection.close(); &nbsp;&nbsp;</span></li><li class=""><span>}&nbsp;&nbsp;</span></li></ol></div><pre class="java" style="display: none" name="code">public static void main(String[] args) throws Exception {
	ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();

	Connection connection = connectionFactory.createConnection();
	connection.start();

	final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
	Destination destination = session.createQueue("my-queue");

	MessageConsumer consumer = session.createConsumer(destination);
	/*//listener 方式
	consumer.setMessageListener(new MessageListener() {

		public void onMessage(Message msg) {
			MapMessage message = (MapMessage) msg;
			//TODO something....
			System.out.println("收到消息：" + new Date(message.getLong("count")));
			session.commit();
		}

	});
	Thread.sleep(30000);
	*/
	int i=0;
	while(i&lt;3) {
		i++;
		MapMessage message = (MapMessage) consumer.receive();
		session.commit();

		//TODO something....
		System.out.println("收到消息：" + new Date(message.getLong("count")));
	}

	session.close();
	connection.close();
}
</pre>
<p>启动 JmsReceiver 和 JmsSender 可以在看输出三条时间信息。当然 Jms 还指定有其它格式的数据，如 TextMessage </p>
<p>结合 Spring 的 JmsTemplate 方便用：</p>
<p>xml：</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml"><li class="alt"><span><strong><font color="#006699"><span class="tag">&lt;?</span><span class="tag-name">xml</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">version</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"1.0"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">encoding</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"UTF-8"</font></span><span class="tag"><strong><font color="#006699">?&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class=""><span></span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">beans</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">xmlns</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"http://www.springframework.org/schema/beans"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">xmlns:xsi</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"http://www.w3.org/2001/XMLSchema-instance"</font></span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute"><font color="#ff0000">xsi:schemaLocation</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&lt;!--&nbsp;在非&nbsp;web&nbsp;/&nbsp;ejb&nbsp;容器中使用&nbsp;pool&nbsp;时，要手动&nbsp;stop，spring&nbsp;不会为你执行&nbsp;destroy-method&nbsp;的方法 &nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">bean</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">id</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"jmsFactory"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">class</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"org.apache.activemq.pool.PooledConnectionFactory"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">destroy-method</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"stop"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">property</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"connectionFactory"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">bean</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">class</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"org.apache.activemq.ActiveMQConnectionFactory"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">property</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"brokerURL"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"tcp://localhost:61616"</font></span><span>&nbsp;</span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>--</span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">bean</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">id</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"jmsFactory"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">class</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"org.apache.activemq.ActiveMQConnectionFactory"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">property</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"brokerURL"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"tcp://localhost:61616"</font></span><span>&nbsp;</span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">bean</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">id</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"jmsTemplate"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">class</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"org.springframework.jms.core.JmsTemplate"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">property</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"connectionFactory"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">ref</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"jmsFactory"</font></span><span>&nbsp;</span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">property</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"defaultDestination"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">ref</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"destination"</font></span><span>&nbsp;</span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">property</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">name</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"messageConverter"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">bean</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">class</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"org.springframework.jms.support.converter.SimpleMessageConverter"</font></span><span>&nbsp;</span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">property</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">bean</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">id</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"destination"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">class</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"org.apache.activemq.command.ActiveMQQueue"</font></span><span class="tag"><strong><font color="#006699">&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;</span><span class="tag-name">constructor-arg</span></font></strong><span>&nbsp;</span><span class="attribute"><font color="#ff0000">index</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"0"</font></span><span>&nbsp;</span><span class="attribute"><font color="#ff0000">value</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">"my-queue"</font></span><span>&nbsp;</span><span class="tag"><strong><font color="#006699">/&gt;</font></strong></span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">bean</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span></span><strong><font color="#006699"><span class="tag">&lt;/</span><span class="tag-name">beans</span><span class="tag">&gt;</span></font></strong><span>&nbsp;&nbsp;</span></span></li></ol></div><pre class="xml" style="display: none" name="code">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"&gt;

&lt;!-- 在非 web / ejb 容器中使用 pool 时，要手动 stop，spring 不会为你执行 destroy-method 的方法
	&lt;bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop"&gt;
		&lt;property name="connectionFactory"&gt;
			&lt;bean class="org.apache.activemq.ActiveMQConnectionFactory"&gt;
				&lt;property name="brokerURL" value="tcp://localhost:61616" /&gt;
			&lt;/bean&gt;
		&lt;/property&gt;
	&lt;/bean&gt;
--&gt;
	&lt;bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory"&gt;
		&lt;property name="brokerURL" value="tcp://localhost:61616" /&gt;
	&lt;/bean&gt;
	&lt;bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"&gt;
		&lt;property name="connectionFactory" ref="jmsFactory" /&gt;
		&lt;property name="defaultDestination" ref="destination" /&gt;
		&lt;property name="messageConverter"&gt;
			&lt;bean class="org.springframework.jms.support.converter.SimpleMessageConverter" /&gt;
		&lt;/property&gt;
	&lt;/bean&gt;

	&lt;bean id="destination" class="org.apache.activemq.command.ActiveMQQueue"&gt;
		&lt;constructor-arg index="0" value="my-queue" /&gt;
	&lt;/bean&gt;

&lt;/beans&gt;
</pre>
<p>sender：</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j"><li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;ctx&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;FileSystemXmlApplicationContext(</span><span class="string">"classpath:app*.xml"</span><span>); &nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;JmsTemplate&nbsp;jmsTemplate&nbsp;=&nbsp;(JmsTemplate)&nbsp;ctx.getBean(</span><span class="string">"jmsTemplate"</span><span>); &nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;jmsTemplate.send(</span><span class="keyword">new</span><span>&nbsp;MessageCreator()&nbsp;{ &nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Message&nbsp;createMessage(Session&nbsp;session)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;JMSException&nbsp;{ &nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MapMessage&nbsp;mm&nbsp;=&nbsp;session.createMapMessage(); &nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mm.setLong(</span><span class="string">"count"</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date().getTime()); &nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;mm; &nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre class="java" style="display: none" name="code">public static void main(String[] args) {
	ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:app*.xml");

	JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("jmsTemplate");

	jmsTemplate.send(new MessageCreator() {

		public Message createMessage(Session session) throws JMSException {
			MapMessage mm = session.createMapMessage();
			mm.setLong("count", new Date().getTime());
			return mm;
		}

	});
}
</pre>
<p>receiver：</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j"><li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;ctx&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;FileSystemXmlApplicationContext(</span><span class="string">"classpath:app*.xml"</span><span>); &nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;JmsTemplate&nbsp;jmsTemplate&nbsp;=&nbsp;(JmsTemplate)&nbsp;ctx.getBean(</span><span class="string">"jmsTemplate"</span><span>); &nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(</span><span class="keyword">true</span><span>)&nbsp;{ &nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;String,&nbsp;Object&gt;&nbsp;mm&nbsp;=&nbsp;&nbsp;(Map&lt;String,&nbsp;Object&gt;)&nbsp;jmsTemplate.receiveAndConvert(); &nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">"收到消息："</span><span>&nbsp;+&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date((Long)mm.get(</span><span class="string">"count"</span><span>))); &nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol></div><pre class="java" style="display: none" name="code">public static void main(String[] args) {
	ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:app*.xml");

	JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("jmsTemplate");
	while(true) {
		Map&lt;String, Object&gt; mm =  (Map&lt;String, Object&gt;) jmsTemplate.receiveAndConvert();
		System.out.println("收到消息：" + new Date((Long)mm.get("count")));
	}
}
</pre>
<p>注意：直接用 Jms 接口时接收了消息后要提交一下，否则下次启动接收者时还可以收到旧数据。有了 JmsTemplate 就不用自己提交 session.commit() 了。如果使用了 PooledConnectionFactory 要把 apache-activemq-5.3.0\lib\optional\activemq-pool-5.3.0.jar 加到 classpath</p> <img src ="http://www.blogjava.net/hao446tian/aggbug/372991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hao446tian/" target="_blank">昊天</a> 2012-03-29 15:43 <a href="http://www.blogjava.net/hao446tian/archive/2012/03/29/372991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>