準備工作
從下面官網下載下傳ActiveMQ,本文使用5.7版本,寫博時Maven庫能找到的最高版本為5.7
<a href="http://activemq.apache.org/download-archives.html" target="_blank">http://activemq.apache.org/download-archives.html</a>
解壓縮下載下傳的檔案到你希望安裝的目錄
進入bin目錄運作activemq.bat以啟動ActiveMQ服務,啟動後預設
broker URL : tcp://localhost:61616
Admin URL:http://localhost:8161/admin
打開Admin URL可以檢視Queue、Topic等資訊
關于ActiveMQ相關依賴包就交給Gradle工具,請參看demo配置
JMS架構基本角色和程式設計子產品
JMS Message Producers : 消息生産者,向消息隊列提供消息
JMS Provider(Broker) : JMS提供商,如ActiveMQ,提供JMS Queues/Topics服務
JMS Message listener/Consumer :接收并使用消息
JMS Provider有如資料庫,Producers/Consumers發送/接收消息前需要先連接配接到Provider,與建立資料庫連接配接相似,JMS ConnectionFactory負責建立JMS Connection,JMS Connection建立JMS Session
JMS ConnectionFactory : Producers/Consumers用于建立一個到Provider的連接配接
JMS Connection :封裝一個到Provider的連接配接
JMS Session : 消息發送接收上下文
<a href="http://s3.51cto.com/wyfs02/M00/11/A6/wKiom1LXvQrxVnOnAAD304pI3Qk941.jpg" target="_blank"></a>
在JMS Provider上可以定義多個Queue和Topic,Producers發送消息到哪個Queue/Topic,稱具體的那個Queue/Topic為Destination.
JMS Destination : 一對一的Queue或者一對多的Topic
關于JMS程式設計模型可以參考以下文章:
<a href="http://docs.oracle.com/javaee/6/tutorial/doc/bnceh.html" target="_blank">http://docs.oracle.com/javaee/6/tutorial/doc/bnceh.html</a>
Spring內建配置
Queue消息發送者(JMS Message Producers) :
ConnectionFactory : 用于連接配接Provider,支援連接配接池配置
JmsTemplate : Spring封裝類,可用于創造消息、發送消息、接收消息等
1
2
3
4
5
6
7
<code><</code><code>bean</code> <code>id</code><code>=</code><code>"connectionFactory"</code> <code>class</code><code>=</code><code>"org.apache.activemq.ActiveMQConnectionFactory"</code>
<code> </code><code>p:brokerURL</code><code>=</code><code>"tcp://localhost:61616"</code> <code>/></code>
<code><</code><code>bean</code> <code>id</code><code>=</code><code>"jmsTemplate"</code> <code>class</code><code>=</code><code>"org.springframework.jms.core.JmsTemplate"</code><code>></code>
<code> </code><code><</code><code>constructor-arg</code> <code>name</code><code>=</code><code>"connectionFactory"</code> <code>ref</code><code>=</code><code>"connectionFactory"</code> <code>/></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"defaultDestinationName"</code> <code>value</code><code>=</code><code>"TestQueue"</code> <code>/></code>
<code></</code><code>bean</code><code>></code>
<code><</code><code>context:component-scan</code> <code>base-package</code><code>=</code><code>"com.stevex.demo"</code> <code>/></code>
連接配接池配置示例:
8
9
10
11
12
13
14
15
16
17
<code><!-- a pooling based JMS provider --></code>
<code> </code><code><</code><code>bean</code> <code>id</code><code>=</code><code>"jmsFactory"</code> <code>class</code><code>=</code><code>"org.apache.activemq.pool.PooledConnectionFactory"</code> <code>destroy-method</code><code>=</code><code>"stop"</code><code>></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"connectionFactory"</code><code>></code>
<code> </code><code><</code><code>bean</code> <code>class</code><code>=</code><code>"org.apache.activemq.ActiveMQConnectionFactory"</code><code>></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"brokerURL"</code><code>></code>
<code> </code><code><</code><code>value</code><code>>tcp://localhost:61616</</code><code>value</code><code>></code>
<code> </code><code></</code><code>property</code><code>></code>
<code> </code><code></</code><code>bean</code><code>></code>
<code> </code><code></</code><code>property</code><code>></code>
<code> </code><code></</code><code>bean</code><code>></code>
<code> </code>
<code> </code><code><!-- Spring JMS Template --></code>
<code> </code><code><</code><code>bean</code> <code>id</code><code>=</code><code>"jmsTemplate"</code> <code>class</code><code>=</code><code>"org.springframework.jms.core.JmsTemplate"</code><code>></code>
<code> </code><code><</code><code>ref</code> <code>local</code><code>=</code><code>"jmsFactory"</code><code>/></code>
Queue消息接收者(JMS Message listener) :
Listener : 接收消息
jms:listener-container 簡化了配置工作,destination隻需要給queue/topic名稱,不需要額外定義
<code><</code><code>jms:listener-container</code> <code>container-type</code><code>=</code><code>"default"</code>
<code> </code><code>connection-factory</code><code>=</code><code>"connectionFactory"</code> <code>acknowledge</code><code>=</code><code>"auto"</code><code>></code>
<code> </code><code><</code><code>jms:listener</code> <code>destination</code><code>=</code><code>"TestQueue"</code> <code>ref</code><code>=</code><code>"messageListener"</code>
<code> </code><code>method</code><code>=</code><code>"onMessage"</code> <code>/></code>
<code></</code><code>jms:listener-container</code><code>></code>
<code><</code><code>bean</code> <code>id</code><code>=</code><code>"messageListener"</code> <code>class</code><code>=</code><code>"com.stevex.demo.SimpleMessageListener"</code><code>/></code>
Topic消息發送者(JMS Message Producers) :
JmsTemplate 的pubSubDomain屬性值為true表示destination為Topic類型,預設false表示destination為Queue類型。
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"defaultDestinationName"</code> <code>value</code><code>=</code><code>"TestTopic"</code> <code>/></code>
<code> </code><code><</code><code>property</code> <code>name</code><code>=</code><code>"pubSubDomain"</code> <code>value</code><code>=</code><code>"true"</code> <code>/></code>
Topic消息接收者(JMS Message listener) :
Topic類型的消息,所有訂閱者都可以接收到,本文Demo定義了兩個接收者。
jms:listener-container 的destination-type屬性預設值為queue,如果是Topic需要顯示指定。
<code><</code><code>bean</code> <code>id</code><code>=</code><code>"subscriber1"</code> <code>class</code><code>=</code><code>"com.stevex.demo.SimpleMessageListener"</code> <code>/></code>
<code> </code><code>destination-type</code><code>=</code><code>"topic"</code> <code>connection-factory</code><code>=</code><code>"connectionFactory"</code>
<code> </code><code>acknowledge</code><code>=</code><code>"auto"</code><code>></code>
<code> </code><code><</code><code>jms:listener</code> <code>destination</code><code>=</code><code>"TestTopic"</code> <code>ref</code><code>=</code><code>"subscriber1"</code>
Producer類實作代碼
<code>@Component</code><code>(</code><code>"messageSender"</code><code>)</code>
<code>public</code> <code>class</code> <code>SimpleMessageSender </code><code>implements</code> <code>MessageSender {</code>
<code> </code><code>@Autowired</code>
<code> </code><code>private</code> <code>JmsTemplate jmsTemplate;</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>void</code> <code>sendMessage(</code><code>final</code> <code>String message) {</code>
<code> </code><code>jmsTemplate.send(</code><code>new</code> <code>MessageCreator() {</code>
<code> </code>
<code> </code><code>public</code> <code>Message createMessage(Session session) </code><code>throws</code> <code>JMSException {</code>
<code> </code><code>return</code> <code>session.createTextMessage(message);</code>
<code> </code><code>}</code>
<code> </code><code>});</code>
<code> </code><code>}</code>
<code>}</code>
Listener類實作代碼
<code>@Component</code><code>(</code><code>"messageListener"</code><code>)</code>
<code>public</code> <code>class</code> <code>SimpleMessageListener </code><code>implements</code> <code>MessageListener {</code>
<code> </code><code>private</code> <code>static</code> <code>final</code> <code>Logger logger = LoggerFactory.getLogger(SimpleMessageListener.</code><code>class</code><code>);</code>
<code> </code><code>public</code> <code>void</code> <code>onMessage(Message message) {</code>
<code> </code><code>TextMessage textMessage = (TextMessage) message;</code>
<code> </code>
<code> </code><code>try</code> <code>{</code>
<code> </code><code>logger.info(</code><code>"Message received: "</code> <code>+ textMessage.getText());</code>
<code> </code><code>} </code><code>catch</code> <code>(JMSException ex) {</code>
<code> </code><code>logger.error(</code><code>"JMS error"</code><code>, ex);</code>
<code> </code><code>}</code>
應用跑起來後,ActiveMQ接收到連接配接後,如果請求的Queue/Topic不存在它會自動建立,我們也可以通過ActiveMQ Admin界面給Listener發消息。
<a href="http://down.51cto.com/data/2364002" target="_blank">附件:http://down.51cto.com/data/2364002</a>
本文轉自sarchitect 51CTO部落格,原文連結:http://blog.51cto.com/stevex/1352334,如需轉載請自行聯系原作者