1. 程式人生 > >最簡單的Spring整合JMS學習

最簡單的Spring整合JMS學習

      上一張我們已經學習了關於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客服端資訊