Spring集成ActiveMQ



ActiveMQ是一个开源的消息中间件,完美的遵循JMS规范,Spring提供了spring-jms模块来简化jms集成。所以给基于spring的应用添加jms功能是轻松愉快加浪漫的。
ActiveMQ提供了两种消息模式:Queue和topic,这两种消息模式的区别为:
1. Queue模式下,Provider发布的一条消息只能被一个Consumer消费:

    pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>org.demo</groupId>
	<artifactId>productMQ</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>productMQ</name>
	<url>http://maven.apache.org</url>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>4.3.2.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.3.2.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>4.3.2.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-messaging</artifactId>
			<version>4.1.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>4.1.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jms</artifactId>
			<version>4.3.2.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.apache.activemq</groupId>
			<artifactId>activemq-core</artifactId>
			<version>5.7.0</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.7</version>
		</dependency>
		<dependency>
			<groupId>org.apache.activemq</groupId>
			<artifactId>activemq-pool</artifactId>
			<version>5.14.1</version>
		</dependency>
	</dependencies>
</project>
集成spring的配置
<?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:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:ehcache="http://www.springmodules.org/schema/ehcache"
	xsi:schemaLocation="http://www.springframework.org/schema/beans   
           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
           http://www.springframework.org/schema/context  
          http://www.springframework.org/schema/context/spring-context-4.0.xsd  
           http://www.springframework.org/schema/aop   
           http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
           http://www.springframework.org/schema/tx   
           http://www.springframework.org/schema/tx/spring-tx-4.0.xsd  
           http://www.springmodules.org/schema/ehcache  
           http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd">

	<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
		<property name="brokerURL" value="${activemq.broker.url}"></property>
	</bean>

	<bean id="pooledConnectionFactory" class="org.apache.activemq.jms.pool.PooledConnectionFactory">
		<property name="connectionFactory" ref="targetConnectionFactory"></property>
		<property name="maxConnections" value="${activemq.maxConnections}"></property>
	</bean>
	
	<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
	   <property name="targetConnectionFactory" ref="pooledConnectionFactory"></property>
    </bean>
    
    <bean id="destinationQueue" class="org.apache.activemq.command.ActiveMQQueue">
      <constructor-arg index="0">
         <value>msgQueue</value>
      </constructor-arg>
    </bean>
    
     <!-- 
                      在使用Spring JMS的时候,主题(Topic)和队列消息的主要差异体现在JmsTemplate中"pubSubDomain"是否设置为True。如果为True,则是Topic;如果是false或者默认,则是queue。
      -->
     <bean id="JmsTemplate" class="org.springframework.jms.core.JmsTemplate">
       <property name="connectionFactory" ref="connectionFactory"></property>
       <property name="defaultDestination" ref="destinationQueue"></property>
       <property name="pubSubDomain" value="false"></property>
     </bean>
</beans>

package org.demo;

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.Service;

import com.alibaba.fastjson.JSONObject;

@Service
public class MessageProduct {

	@Autowired
	private JmsTemplate jmsTemplate;

	public JmsTemplate getJmsTemplate() {
		return jmsTemplate;
	}

	public void setJmsTemplate(JmsTemplate jmsTemplate) {
		this.jmsTemplate = jmsTemplate;
	}

	public void send(final Object obj) {

		jmsTemplate.send(new MessageCreator() {

			public Message createMessage(Session session) throws JMSException {

				return session.createTextMessage(JSONObject.toJSONString(obj));
			}
		});
	}
}

测试类:

package org.demo.productMQ;

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

/**
 * Unit test for simple App.
 */
@ContextConfiguration(locations = { "classpath:spring-context.xml" })
@RunWith(value = SpringJUnit4ClassRunner.class)
public class AppTest {

	@Autowired
	private MessageProduct messageProduct;

	@Test
	public void send() {

		Email email = new Email();
		email.setFrom("499197612@qq.com");
		email.setTo("499197612@qq.com");
		email.setTopTic("异步发送消息");
		email.setMessage("Hello ActiveMQ");
		messageProduct.send(email);
	}
}


消费者:连接工厂和生产者一致,消费者通过MessageListeren监听对列

<bean id="messageListener" class="org.demo.ReviceMessage"/>
    
    <bean id="defaultMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
      <property name="connectionFactory" ref="connectionFactory"></property>
      <property name="destination" ref="destinationQueue"></property>
      <property name="messageListener" ref="messageListener"></property>
    </bean>
<span style="font-size:18px;">消费者实现类</span>
package org.demo;

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

import org.apache.activemq.command.ActiveMQQueue;

public class ReviceMessage implements MessageListener {

	public void onMessage(Message message) {

		try {

			if (message instanceof TextMessage) {

				TextMessage textMessage = (TextMessage) message;
				ActiveMQQueue queue = (ActiveMQQueue) message.getJMSReplyTo();
				System.out.println(textMessage.getText());
			}

		} catch (Exception e) {

		}
	}
}

topic模式下,Provider发布的一条消息能被多个Consumer消费,主需要修改Destination为:ActiveMQTopic


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值