Spring與ActiveMQ的整合

1.首先我們需將所需要的依賴寫入pom.xml

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>

		<!-- spring基礎 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</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.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>4.1.6.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>4.1.6.RELEASE</version>
		</dependency>

		<!-- aspectj的依賴 -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.8.9</version>
			<scope>runtime</scope>
		</dependency>

		<dependency>
			<groupId>javax.annotation</groupId>
			<artifactId>jsr250-api</artifactId>
			<version>1.0</version>
		</dependency>

		<dependency>
			<groupId>org.apache.activemq</groupId>
			<artifactId>activemq-all</artifactId>
			<version>5.9.0</version>
		</dependency>


2.在web.xml配置spring容器生成

  	<!-- spring容器生成配製 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<!-- spring配製文件所在的位置, *表示任何長度的任意字符 -->
		<param-value>classpath:spring*.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>


3.在配置spring.xml的同時編寫對應的代碼,便於理解其結構

配置連接工廠

	<!-- 配置ConnectionFactory,這裏的只是spring用於管理ConnectionFactory的,真正產生到JMS服務器連接的工廠是由JMS服務廠商提供的-->
	<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
		<property name="brokerURL" value="tcp://localhost:61616" />
	</bean>

	<!-- 真正可以產生Connection的ConnectionFactory,由對應的 JMS服務廠商提供 -->
	<bean id="connectionFactory"
		class="org.springframework.jms.connection.SingleConnectionFactory">
		<property name="targetConnectionFactory" ref="targetConnectionFactory" />
	</bean>

配置消息目的地,即Destination

	<!--這個是隊列目的地,點對點的 queue -->
	<bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
		<constructor-arg>
			<value>queue</value>
		</constructor-arg>
	</bean>

	<!--這個是主題目的地,一對多的 topic -->
	<bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">
		<constructor-arg value="topic" />
	</bean>

配置JmsTemplate

	<!-- Spring提供的JMS工具類,它可以進行消息發送、接收等   生產者角色-->
	<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
		<!-- 這個connectionFactory對應的是我們定義的Spring提供的那個ConnectionFactory對象 -->
		<property name="connectionFactory" ref="connectionFactory" />
	</bean>

編寫Producer生產者類

package com.yc.services.impl;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;

import com.yc.services.ProducerService;

@Component("producerService")
public class ProducerServiceImpl{
	@Autowired
	private JmsTemplate jmsTemplate;
	//發送消息
	public void sendMessage(Destination destination, final String message) {
		System.out.println("生產者發了一個消息:" + message); 
        jmsTemplate.send(destination, new MessageCreator(){
            public Message createMessage(Session session) throws JMSException {  
                return session.createTextMessage(message);  
            }
        });
	}
}
到這裏我們的生產者其實已經配置完畢,那麼完成一個消息的流程我們還需要消費者的存在,接下來我們來實現消費者的代碼,這裏只是寫了接收信息的方法,即是消息監聽器,消費者的實現我們依舊交給spring來完成

package com.yc.services.impl;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

public class ConsumerImpl implements MessageListener{
	public void onMessage(Message message) {
		TextMessage content=(TextMessage) message;
		try {
			System.out.println("接收到的消息爲:"+content.getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}
}

轉到spring.xml,配置消息監聽器

	<!-- 消息監聽器 -->
	<bean id="consumerMessageListener" class="com.yc.services.impl.ConsumerImpl" />

配置消息監聽容器,即消費者,所必須給的參數有三個,連接工廠,目的地以及處理消息的監聽

	<!-- 消息監聽容器,消費者 -->
	<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
		<!-- 連接工廠 -->
		<property name="connectionFactory" ref="connectionFactory" />
		<!-- 消息目的地,這裏是queue -->
		<property name="destination" ref="queueDestination" />
		<!-- 消息監聽,消費者 -->
		<property name="messageListener" ref="consumerMessageListener" />
	</bean>

 

4.OK,至此我們的配置已經可以完成ActiveMQ的基本操作了,我們來用junit測試一下所寫的代碼

package com.yc.test;

import javax.jms.Destination;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.yc.services.ProducerService;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring.xml")
public class ProducerServiceImplTest {

    @Autowired
    private ProducerServiceImpl producerService;
    
    @Autowired  
    @Qualifier("queueDestination")  //使得自動注入從bytype變爲byname
    private Destination destination;  
      
    @Test
    public void testSend() { 
    	for (int i = 0; i < 2; i++) {
    		producerService.sendMessage(destination, "你好,ActiveMQ" );  
		}
    }  
}
junit testSend()方法



成功大笑

發佈了36 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章