一、安装MQ

官网下载activeMQ的Linux 包,这里使用的是apache-activemq-5.12.0-bin.tar.gz,安装过程很简单,包复制到指定目录下并解压即可,不许其他配置;

解压后的文件

activemq官方镜像运行命令 activemq demo_java

进入解压后的文件夹

activemq官方镜像运行命令 activemq demo_xml_02

启动MQ:进入bin文件夹,运行activemq就行

activemq官方镜像运行命令 activemq demo_java_03

如何检查是否测试成功呢,访问http://192.168.25.128:8161/admin/,账号密码都是admin,若能打开activeMq管理后台,说明就是启动成功的;ip是你安装mq机器的IP;

 

activemq官方镜像运行命令 activemq demo_xml_04

注意:这里有的会出现可以访问MQ管理后台页面,但是点击页面内头部菜单QUEUES时。会提示503错误,那就是linux机器的设置问题了,需要将你的linux用户名和127.0.0.1做一下映射:然后重启MQ;

activemq官方镜像运行命令 activemq demo_xml_05

二、编写项目测试代码

创建maven项目,引入MQjar包;这里的版本号使用5.11.2,5.12.0版本的jar包会出现spring的jar冲突;

<!-- activemq的jar包 -->
		<dependency>
			<groupId>org.apache.activemq</groupId>
			<artifactId>activemq-all</artifactId>
            <version>5.11.2</version>
		</dependency>

编写测试代码,包括了queue,topic两种方式的测试

package com.taotao.fastdfs;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.Test;
import org.springframework.jca.cci.connection.ConnectionFactoryUtils;

public class ActiveMqTest {
	
	@Test
	public void mqProduce(){
		//创建链接工厂
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");
		//使用工厂创建链接对象
		try {
			Connection connection = connectionFactory.createConnection();
			//开启链接
			connection.start();
			//连接对象创建session
			Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
			//创建目的地对象,设置queue ,topic消费方式
			Queue queue = session.createQueue("test-queue");
			//使用session创建生产者对象
			MessageProducer messageProducer = session.createProducer(queue);
			//创建消息对象
			TextMessage message = session.createTextMessage("hello world 这是我发送的第3个消息!不要回答!不要回答!不要回答!");
			//生成这发送消息
			messageProducer.send(message);
			//发送成功后关闭资源
			messageProducer.close();
			session.close();
			connection.close();
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	@Test
	public void queueConsumer(){
		//创建链接工厂
				ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");
				//使用工厂创建链接对象
				try {
					Connection connection = connectionFactory.createConnection();
					//开启链接
					connection.start();
					//连接对象创建session
					Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
					//创建目的地对象,目的地名称必须和生产者保持一致
					Queue queue = session.createQueue("test-queue");
					//创建消费者
					MessageConsumer messageConsumer = session.createConsumer(queue);
					//消费者对象设置消息监听,用来接收消息
					messageConsumer.setMessageListener(new MessageListener() {
						
						@Override
						public void onMessage(Message message) {
							// TODO Auto-generated method stub
							//这里用来获取消息
							if(message instanceof TextMessage){
								TextMessage textMessage = (TextMessage)message;
								try {
									String msg = textMessage.getText();
									System.out.println(msg);
								} catch (JMSException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
							}
						}
					});
					//键盘输入就关闭资源
					System.in.read();
					//发送成功后关闭资源
					messageConsumer.close();
					session.close();
					connection.close();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				
	}
	
	@Test
	public void topicProduce(){
		//创建链接工厂
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");
		//使用工厂创建链接对象
		try {
			Connection connection = connectionFactory.createConnection();
			//开启链接
			connection.start();
			//连接对象创建session
			Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
			//创建目的地对象,设置queue ,topic消费方式
			Topic queue = session.createTopic("test-topic");
			//使用session创建生产者对象
			MessageProducer messageProducer = session.createProducer(queue);
			//创建消息对象
			TextMessage message = session.createTextMessage("hello world 这是我发送的第2个消息!不要回答!不要回答!不要回答!");
			//生成这发送消息
			messageProducer.send(message);
			//发送成功后关闭资源
			messageProducer.close();
			session.close();
			connection.close();
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	@Test
	public void topicConsumer(){
		//创建链接工厂
				ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");
				//使用工厂创建链接对象
				try {
					Connection connection = connectionFactory.createConnection();
					//开启链接
					connection.start();
					//连接对象创建session
					Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
					//创建目的地对象,目的地名称必须和生产者保持一致
					Topic queue = session.createTopic("test-topic");
					//创建消费者
					MessageConsumer messageConsumer = session.createConsumer(queue);
					//消费者对象设置消息监听,用来接收消息
					messageConsumer.setMessageListener(new MessageListener() {
						
						@Override
						public void onMessage(Message message) {
							// TODO Auto-generated method stub
							//这里用来获取消息
							if(message instanceof TextMessage){
								TextMessage textMessage = (TextMessage)message;
								try {
									String msg = textMessage.getText();
									System.out.println(msg);
								} catch (JMSException e) {
									// TODO Auto-generated catch block
									e.printStackTrace();
								}
							}
						}
					});
					System.out.println("我是一号监听员03");
					//键盘输入就关闭资源
					System.in.read();
					//发送成功后关闭资源
					messageConsumer.close();
					session.close();
					connection.close();
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				
	}
}

三、spring整合MQ

生产者配置文件:applicationContext-activemq.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:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
	<!-- JMS服务厂商提供的connectfactory -->
	<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
		<constructor-arg name="brokerURL" value="tcp://192.168.25.128:61616"></constructor-arg>
	</bean>	
	<!-- spring对connectfactory封装 -->
	<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
		<property name="targetConnectionFactory" ref="targetConnectionFactory"></property>
	</bean>
	<!-- 配置JMSTemplate -->
	<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
		<property name="connectionFactory" ref="connectionFactory"/>
	</bean>
	<!-- 配置消息的destination -->
	<!-- queue队列 -->
	<bean id="test-queue" class="org.apache.activemq.command.ActiveMQQueue">
		<constructor-arg name="name" value="test-queue"></constructor-arg>
	</bean>
	<!-- topic订阅 -->
	<bean id="test-topic" class="org.apache.activemq.command.ActiveMQTopic">
		<constructor-arg name="name" value="test-topic"></constructor-arg>
	</bean>
</beans>

测试方法:

package com.taotao.fastdfs;

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

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;

public class SpringMQDemo {
	@Test
	public void MQprovider(){
		//初始化Spring容器
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-activemq.xml");
		//容器中获取JMStemplate对象
		JmsTemplate jmsTemplate = applicationContext.getBean(JmsTemplate.class);
		//从容器中获取destination
		Destination destination = (Destination) applicationContext.getBean("test-queue");
		//发送消息
		jmsTemplate.send(destination, new MessageCreator() {
			
			@Override
			public Message createMessage(Session session) throws JMSException {
				// TODO Auto-generated method stub
				TextMessage text = session.createTextMessage("这是三体世界发送的第2个消息!不要回答!不要回答!不要回答!");
				return text;
			}
		});
	}
}

消费者配置文件:applicationContext-activemq.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:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
	<!-- JMS服务厂商提供的connectfactory -->
	<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
		<constructor-arg name="brokerURL" value="tcp://192.168.25.128:61616"></constructor-arg>
	</bean>	
	<!-- spring对connectfactory封装 -->
	<bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
		<property name="targetConnectionFactory" ref="targetConnectionFactory"></property>
	</bean>
	<!-- 配置JMSTemplate -->
	<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
		<property name="connectionFactory" ref="connectionFactory"/>
	</bean>
	<!-- 配置消息的destination -->
	<!-- queue队列 -->
	<bean id="test-queue" class="org.apache.activemq.command.ActiveMQQueue">
		<constructor-arg name="name" value="test-queue"></constructor-arg>
	</bean>
	<!-- topic订阅 -->
	<bean id="test-topic" class="org.apache.activemq.command.ActiveMQTopic">
		<constructor-arg name="name" value="test-topic"></constructor-arg>
	</bean>
	<!-- 配置消息消费者 -->
	<bean id="myMessageListener" class="com.taotao.portal.MyMessageListener"></bean>
	<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
		<property name="connectionFactory" ref="connectionFactory"></property>
		<property name="destination" ref="test-queue"></property>
		<property name="messageListener" ref="myMessageListener"></property>
	</bean>
</beans>

自定义消息监听类:

package com.taotao.portal;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

public class MyMessageListener implements MessageListener{

	@Override
	public void onMessage(Message message) {
		// TODO Auto-generated method stub
		TextMessage textMessage = (TextMessage) message;
		try {
			String text = textMessage.getText();
			System.out.println(text);
                    //此处以后增加业务代码
		} catch (JMSException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

消费者测试方法:

import java.io.IOException;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


public class ConsumertMq {
	@Test
	public void test() {
			ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-activemq.xml");
			//等待
			try {
				System.in.read();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}
}

测试了连续运行4次生产者,消费者效果如图:

activemq官方镜像运行命令 activemq demo_xml_06