最簡單的Spring整合JMS學習
阿新 • • 發佈:2018-12-09
上一張我們已經學習了關於JMS的一些基礎知識,當時我們已經提到,在實際開發中,我們一般都是過過spring去整合jms的方式把jms應用到我們的專案中.那麼接下來我們就來探討一下spring整合jms相關的內容!
spring整合jms後對於開發者來說要開發一個jms相關的中介軟體那就非常簡單啦!學習過spring全家桶的小夥伴們都知道,被spring整合過的大多數技術,spring都會給我們提供一個模板類去使用封裝後的技術.
另外我要說的是,由於在實際開發中,生產者和消費者肯定不是一個工程(如果是那也沒必要用啦),所以接下來我們將會建立兩個工程來進行測試.首先我們先來看看
點對點模式
建立訊息生產者
建立工程springjms_producer ,在POM檔案中引入SpringJms 、activeMQ以及單元測試相關依賴
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.9</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-client</artifactId> <version>5.13.4</version> </dependency> </dependencies>
在src/main/resources建立spring配置檔案applicationContext-jms-producer.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:amq="http://activemq.apache.org/schema/core" xmlns:jms="http://www.springframework.org/schema/jms" 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"> <context:component-scan base-package="com.springjms"></context:component-scan> <!-- 真正可以產生Connection的ConnectionFactory,由對應的 JMS服務廠商提供--> <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://192.168.218.128:61616"/> </bean> <!-- Spring用於管理真正的ConnectionFactory的ConnectionFactory --> <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory"> <!-- 目標ConnectionFactory對應真實的可以產生JMS Connection的ConnectionFactory --> <property name="targetConnectionFactory" ref="targetConnectionFactory"/> </bean> <!-- Spring提供的JMS工具類,它可以進行訊息傳送、接收等 --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <!-- 這個connectionFactory對應的是我們定義的Spring提供的那個ConnectionFactory物件 --> <property name="connectionFactory" ref="connectionFactory"/> </bean> <!--這個是佇列目的地,點對點的 文字資訊--> <bean id="queueTextDestination" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg value="queue_text"/> </bean> <!--這個是訂閱模式 文字資訊--> <bean id="topicTextDestination" class="org.apache.activemq.command.ActiveMQTopic"> <constructor-arg value="topic_text"/> </bean> </beans>
建立訊息生產者類QueueProducer
/**
* springjs點對點方式的生產者類
*/
@Component
public class QueueProducer {
//注入模板
@Autowired
private JmsTemplate jmsTemplate;
//注入點對點文字訊息物件,我們使用他的父介面
@Autowired
private Destination queueTextDestination;
//傳送訊息的方法
public void sendTextMessage(String text){
//使用模板傳送訊息,我們只需要queueTextDestination給模板,其他的框架會幫我們搞定啦
jmsTemplate.send(queueTextDestination, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
//建立返回訊息
return session.createTextMessage(text);
}
});
}
}
建立測試類
/**
* springjms點對點生產者測試類
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext-jms-producer.xml")
public class QueueProducerTest {
@Autowired
private QueueProducer queueProducer;
@Test
public void sendTextMessage(){
queueProducer.sendTextMessage("我的第一個點對點springjms小程式測試成功啦!");
}
}
檢視activeMQ管理客服端
現在我們建立一個訊息消費者來使用我們剛剛釋出的訊息,在POM檔案中引入依賴 (同上一個工程)
建立配置檔案 applicationContext-jms-consumer-queue.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jms="http://www.springframework.org/schema/jms"
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">
<!-- 真正可以產生Connection的ConnectionFactory,由對應的 JMS服務廠商提供-->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://192.168.218.128:61616"/>
</bean>
<!-- Spring用於管理真正的ConnectionFactory的ConnectionFactory -->
<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
<!-- 目標ConnectionFactory對應真實的可以產生JMS Connection的ConnectionFactory -->
<property name="targetConnectionFactory" ref="targetConnectionFactory"/>
</bean>
<!--這個是佇列目的地,點對點的 文字資訊-->
<bean id="queueTextDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="queue_text"/>
</bean>
<!-- 我的監聽類 -->
<bean id="CustomMessageListener" class="com.springjms.CustomMessageListener"></bean>
<!-- 訊息監聽容器 -->
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="queueTextDestination" />
<property name="messageListener" ref="CustomMessageListener" />
</bean>
</beans>
編寫監聽類
/**
* springjms點對點訊息消費者類
*/
public class CustomMessageListener implements MessageListener {
@Override
public void onMessage(Message message) {
//我們知道我們傳送的訊息型別,強轉成我們的型別即可
TextMessage textMessage= (TextMessage) message;
try {
System.out.println("接收到訊息:"+textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
編寫測試類
/**
* springjms點對點消費者測試類
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:applicationContext-jms-consumer.xml")
public class TestQueue {
@Test
public void testQueue() throws IOException {
System.in.read();
}
}
控制檯輸出資訊
active客服端資訊