天天看點

Spring內建ActiveMQ

準備工作

從下面官網下載下傳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>&lt;</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>/&gt;</code>

<code>&lt;</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>&gt;</code>

<code>    </code><code>&lt;</code><code>constructor-arg</code> <code>name</code><code>=</code><code>"connectionFactory"</code> <code>ref</code><code>=</code><code>"connectionFactory"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"defaultDestinationName"</code> <code>value</code><code>=</code><code>"TestQueue"</code> <code>/&gt;</code>

<code>&lt;/</code><code>bean</code><code>&gt;</code>

<code>&lt;</code><code>context:component-scan</code> <code>base-package</code><code>=</code><code>"com.stevex.demo"</code> <code>/&gt;</code>

連接配接池配置示例:

8

9

10

11

12

13

14

15

16

17

<code>&lt;!-- a pooling based JMS provider --&gt;</code>

<code>  </code><code>&lt;</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>&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"connectionFactory"</code><code>&gt;</code>

<code>      </code><code>&lt;</code><code>bean</code> <code>class</code><code>=</code><code>"org.apache.activemq.ActiveMQConnectionFactory"</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"brokerURL"</code><code>&gt;</code>

<code>          </code><code>&lt;</code><code>value</code><code>&gt;tcp://localhost:61616&lt;/</code><code>value</code><code>&gt;</code>

<code>        </code><code>&lt;/</code><code>property</code><code>&gt;</code>

<code>      </code><code>&lt;/</code><code>bean</code><code>&gt;</code>

<code>    </code><code>&lt;/</code><code>property</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>bean</code><code>&gt;</code>

<code>                                                                                                 </code> 

<code>  </code><code>&lt;!-- Spring JMS Template --&gt;</code>

<code>  </code><code>&lt;</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>&gt;</code>

<code>      </code><code>&lt;</code><code>ref</code> <code>local</code><code>=</code><code>"jmsFactory"</code><code>/&gt;</code>

Queue消息接收者(JMS Message listener) :

Listener : 接收消息

jms:listener-container 簡化了配置工作,destination隻需要給queue/topic名稱,不需要額外定義

<code>&lt;</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>&gt;</code>

<code>    </code><code>&lt;</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>/&gt;</code>

<code>&lt;/</code><code>jms:listener-container</code><code>&gt;</code>

<code>&lt;</code><code>bean</code> <code>id</code><code>=</code><code>"messageListener"</code> <code>class</code><code>=</code><code>"com.stevex.demo.SimpleMessageListener"</code><code>/&gt;</code>

Topic消息發送者(JMS Message Producers) :

JmsTemplate 的pubSubDomain屬性值為true表示destination為Topic類型,預設false表示destination為Queue類型。

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"defaultDestinationName"</code> <code>value</code><code>=</code><code>"TestTopic"</code> <code>/&gt;</code>

<code>    </code><code>&lt;</code><code>property</code> <code>name</code><code>=</code><code>"pubSubDomain"</code> <code>value</code><code>=</code><code>"true"</code> <code>/&gt;</code>

Topic消息接收者(JMS Message listener) :

Topic類型的消息,所有訂閱者都可以接收到,本文Demo定義了兩個接收者。

jms:listener-container 的destination-type屬性預設值為queue,如果是Topic需要顯示指定。

<code>&lt;</code><code>bean</code> <code>id</code><code>=</code><code>"subscriber1"</code> <code>class</code><code>=</code><code>"com.stevex.demo.SimpleMessageListener"</code> <code>/&gt;</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>&gt;</code>

<code>    </code><code>&lt;</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,如需轉載請自行聯系原作者