spring整合jms
借鑒別人(http://shmilyaw-hotmail-com.iteye.com/blog/2208966),結合自己所用的體會寫的,本人用的是servicemix搭的activemq
一.依賴
為了運行示例,我們需要有一個activemq的服務器。activemq的下載地址如下:http://activemq.apache.org/download.html 下載到本地解壓到某個目錄。然後進入到bin目錄下
看你電腦是32,還是64,打開相應的文件夾,如下
這樣activemq服務器就運行起來了。這個時候,服務器的默認brokerURL是: tcp://localhost:61616。在服務器運行起來之後,如果我們想要了解它的詳細情況,可以通過一個web console來查看。在瀏覽器裏輸入如下地址: http://localhost:8161/admin 輸入默認用戶名admin和密碼admin
提示:本人是用serviceMix整的,底下的依賴jar可能有所不同,訪問地址http://localhost:8181/activemqweb 默認用戶名:smx 密碼:smx 頁面都是一樣,只是訪問路徑不同。
下面正式開始
二.項目所需jar(maven)
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.1.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>4.1.6.RELEASE</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.11.1</version> </dependency> <dependency> <groupId>org.apache.servicemix.bundles</groupId> <artifactId>org.apache.servicemix.bundles.spring-core</artifactId> <version>4.2.6.RELEASE_1</version> </dependency>
三.發送消息
對於spring來說,它收發消息的核心就是jmsTemplate,以下是基本配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jms="http://www.springframework.org/schema/jms" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.0.xsd"> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jms.properties"/> </bean> <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="${jms.brokerURL}"/> <property name="userName" value="${jms.userName}"/> <property name="password" value="${jms.password}"/> </bean> <bean id="queueName" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg index="0" value="${jms.messageTopic}" /> </bean> <bean id="topicName" class="org.apache.activemq.command.ActiveMQTopic"> <constructor-arg index="0" value="${jms.messageTopic}" /> </bean> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="connectionFactory"/> <!--此處訂閱queue就ref="queueName" 訂閱topic就ref="topicName"--> <property name="defaultDestination" ref="queueName"/> </bean> <bean id="messageSender" class="test.ActivemqMessageSender"> <constructor-arg index="0" ref="jmsTemplate"/> </bean> <!--topic的監聽器--> <jms:listener-container container-type="default" destination-type="topic" connection-factory="connectionFactory" acknowledge="auto" concurrency="10"> <jms:listener destination="${jms.messageTopic}" ref="messageListener" method="onMessage"/> </jms:listener-container> <!--queue的監聽器--> <jms:listener-container container-type="default" destination-type="queue" connection-factory="connectionFactory" acknowledge="auto" concurrency="10"> <jms:listener destination="${jms.messageTopic}" ref="messageListener" method="onMessage"/> </jms:listener-container> <bean id="messageListener" class="test.ActivemqMessageListener"/> </beans>
我們針對前面的內容做一個解釋。首先我們需要建立一個類型為org.apache.activemq.ActiveMQConnectionFactory的connectionFactory。這裏它定義了我們需要訪問的activemq服務器的url以及訪問它需要的用戶名和密碼。
接著我們定義了兩個bean, 一個是org.apache.activemq.command.ActiveMQQueue的destination。它表示對應的一個點對點通信的queue。而後面定義的destinationTopic對應的是采用廣播方式通信的topic。我們知道,在jms通信的規範裏有兩種發送消息的方式,一種是基於點對點的queue的方式,主要用於一個發送者發消息給一個接收者的情況。另外一種則是基於廣播的topic的方式,主要用於一個發送者發消息給若幹個接收者。
接著就是我們要用到的關鍵部分,spring裏面預先定義好了的jmsTemplate,它的類型是org.springframework.jms.core.JmsTemplate。它需要配置的兩個主要屬性分別就是connectionFactory和destination。這樣,通過這個模板就已經解決了往哪個服務器的哪個地方發的問題了。剩下的就是我們定義的一個bean,它封裝了jmsTemplate來發送消息。
有了這些配置,我們實際上使用它們的代碼則非常簡單。我們定義的ActivemqMessageSender的實現代碼如下:
import org.springframework.jms.core.JmsTemplate; import org.springframework.stereotype.Component; @Component public class ActivemqMessageSender implements MessageSender { private JmsTemplate jmsTemplate; public ActivemqMessageSender(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } @Override public void sendMessage(String message) { jmsTemplate.convertAndSend(message); } }
在上述的代碼裏,實際上jmsTemplate發送消息的方法有若幹個,具體可以看我那jms入門,裏面會有詳細說明, 我們可以參照文檔針對發送的不同類型消息來處理。在示例裏我們僅僅是發送一個簡單的字符串。
這裏為了保證一定程度的松耦合,專門定義了一個接口MessageSender:
public interface MessageSender { void sendMessage(String message); }
接下來,我們嘗試發送一個簡單的消息出去:
import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestJms { public static void main( String[] args ) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); MessageSender sender = ctx.getBean(MessageSender.class); sender.sendMessage("Hello 1612"); ctx.close(); } }
此時看頁面
Properties代碼
四.異步接收消息
配置文件都在spring.xml裏面有說明
我們定義一個ActivemqMessageListener 類
import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; public class ActivemqMessageListener implements MessageListener { @Override public void onMessage(Message msg) { TextMessage textMsg = (TextMessage)msg; try { String message = textMsg.getText(); System.out.println("message:"+message); } catch (JMSException e) { e.printStackTrace(); } } }
執行上面TestJms這裏就會收到消息
說明:這裏還有一種同步接收消息,就不寫了
spring整合jms