Spring整合ActiveMQ實踐

jopen 9年前發布 | 43K 次閱讀 ActiveMQ 消息系統

demo下載:testjms.zip

ActiveMQ是一個開源的消息中間件,完美的遵循JMS規范,Spring提供了spring-jms模塊來簡化jms集成。所以給基于spring的應用添加jms功能是輕松愉快加浪漫的。
ActiveMQ提供了兩種消息模式:Queue和topic,這兩種消息模式的區別為:
Queue模式下,Provider發布的一條消息只能被一個Consumer消費。
topic模式下,Provider發布的一條消息能被多個Consumer消費。

開發步驟:

1、搭建ActiveMQ的環境

1)去ActiveMQ的官方下載ActiveMQ服務器,http://activemq.apache.org
2)啟動ActiveMQ服務器,Windows下為:cd ${ActiveMQ-dir}/bin目錄,執行activemq start
3)訪問控制臺,http://localhost:8161/admin,用戶名和密碼為[admin/admin],如果能正常訪問,那么服務器搭建成功

2開發消息的Provider端(附件的testjms-send工程)

1)使用maven的maven-archetype-quickstart向導創建一個maven工程
2)在pom.xml中添加如下的依賴

 
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.1.5.RELEASE</version>
</dependency>

<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.11.1</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency></pre>

</tr> </tbody> </table> </div> </div>

添加log4j是便于spring-jms輸出日志信息。
3)在src/main/resources下新增log4j.properties文件
4)在src/main/resources下新增applicationContext.xml文件
該文件的完整內容如下:



</tr> </tbody> </table> </div> </div>

聲明了三個bean,connectionFactory,queue,jmsTemplate,
connectionFactory類似jdbc的Connection對象,表示要鏈接的服務器的信息。
queue類似jdbc的某張表,表示將消息存在的位置。本例使用的隊列模式
jmsTemplate是spring-jms提供的一個模板類,封裝了jms操作時的一些例行代碼。

5)接下來看看main方法



</tr> </tbody> </table> </div> </div>

main方法很簡單,填充了一個User對象[注意發送端和接收端的對象的包名必須一致,且要實現Serialize接口]。利用applicationContext.xml構造了一個applicationContext對象,ApplicationContext中獲取一個SendService對象,調用send()方法將user對象發送到ActiveMQ服務器中。

6)最后看看SendService的實現

 
@Component
public class SendService {
@Autowired
JmsTemplate jmsTemplate;

public void send(final User user) { jmsTemplate.send("test.queue", new MessageCreator() {

public Message createMessage(Session session) throws JMSException { return session.createObjectMessage(user); } }); } }</pre>



</tr> </tbody> </table> </div> </div>

超級簡單,@Component聲明SendService類能被自動注冊,
注入了JmsTemplate對象,在send()中調用jmsTemplate.send()發送消息,本例發送的是一個ObjectMessage。

7)測試:
執行本demo,訪問http://localhost:8161/admin,如圖:


表示ActiveMQ確實收到了一條消息。

Consumer端實現(testjms-receive工程)

基本的步驟類似于Provider端的實現,下面講講不同點:
1、main()入口
由于DefaultMessageListenerContainer采用的是Deamon實現方式,所以當我們的應用停止的時候我們應該將其shutdown
具體代碼參見main()方法:

 
public static void main( String[] args ) throws Exception
{
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
//阻塞主線程
System.in.read();

DefaultMessageListenerContainer container = (DefaultMessageListenerContainer)context.getBean("jmsContainer"); container.shutdown(); }</pre>



</tr> </tbody> </table> </div> </div>

使用 System.in.read();調用阻塞主線程,當我們通過鍵盤輸入一些字符回車后DefaultMessageListenerContainer被shutdown

2)MessageDriven接收端實現
如果我們調用jms的receive接口方法,如果隊列中沒有可讀的消息,那么當前線程將阻塞直到有消息可用或者超時為止。那能不能等有消息的時候讓ActiveMQ主動的回調Consumer呢,這就是MessageDriven bean的思想啦。
spring-jms對MessageDriven bean的支持相當給力,即提供了DefaultMessageListenerContainer 類,也提供了jms命名空間的<jms:listener-container>指令。直接使用 DefaultMessageListenerContainer類需要你的回調類實現MessageListener接口,如我在demo中 ReceiveService2類的處理邏輯。使用<jms:listener-container>指令,那么你的回調類就是一個POJO 類啦,這就是spring-jms所謂的MessageDriven POJO。具體可以參考我的ReceiveService類的實現以及<jms:listener-container>元素的聲明。

3)測試:
運行Consumer,后,會發現控制臺打印出了如下的信息:
from MessageListener —>username:javacoder.cn|email:javacoder.cn@hotmail.com
當再次訪問http://localhost:8161/admin時發現該消息確實被消費了。

來自:http://www.javacoder.cn/?p=416

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!


  • sesese色