ActiveMQ学习

商城项目用到,所以来学习。解决同步索引库问题,添加商品后,得导入索引库。

使用消息队列。MQ是一个消息中间件。

MQ是一个消息中间件,ActiveMQRabbitMQkafka

1.1. 什么是ActiveMQ

ActiveMQ Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

主要特点:

1. 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WSNotification,XMPP,AMQP

2. 完全支持JMS1.1J2EE 1.4规范 (持久化,XA消息,事务)

3. Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性

4. 通过了常见J2EE服务器( Geronimo,JBoss 4,GlassFish,WebLogic)的测试,其中通过JCA 1.5resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上

5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA

6. 支持通过JDBCjournal提供高速的消息持久化

7. 从设计上保证了高性能的集群,客户端-服务器,点对点

8. 支持Ajax

9. 支持与Axis的整合

10. 可以很容易得调用内嵌JMS provider,进行测试

 

1.2. ActiveMQ的消息形式

对于消息的传递有两种类型:

一种是点对点的,即一个生产者和一个消费者一一对应;

另一种是发布/订阅模式,即一个生产者产生消息并进行发送后,可以由多个消费者进行接收。

JMS定义了五种不同的消息正文格式,以及调用的消息类型,允许你发送并接收以一些不同形式的数据,提供现有消息格式的一些级别的兼容性。

  · StreamMessage -- Java原始值的数据流

  · MapMessage--一套名称-值对

  · TextMessage--一个字符串对象

  · ObjectMessage--一个序列化的 Java对象

  · BytesMessage--一个字节的数据流

1.  ActiveMQ的安装



1.1. 安装环境:

1、需要jdk

2、安装Linux系统。生产环境都是Linux系统。

上传。。。。

[root@localhost apache-activemq-5.12.0]#bin/activemq start


端口号:8161

账号:admin 密码admin


Springactivemq整合:

Jar包:

<dependency>

          <groupId>org.springframework</groupId>

          <artifactId>spring-jms</artifactId>

      </dependency>

      <dependency>

          <groupId>org.springframework</groupId>

          <artifactId>spring-context-support</artifactId>

      </dependency>

<dependency>

             <groupId>org.apache.activemq</groupId>

             <artifactId>activemq-all</artifactId>

         </ dependency >



<?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/beanshttp://www.springframework.org/schema/beans/spring-beans-4.2.xsd

   http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.2.xsd

   http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.2.xsd

   http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.2.xsd

   http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util-4.2.xsd">

 

 

   <!-- 真正可以产生ConnectionConnectionFactory,由对应的 JMS服务厂商提供 -->

   <bean id="targetConnectionFactory"class="org.apache.activemq.ActiveMQConnectionFactory">

      <property name="brokerURL"value="tcp://192.168.25.128:61616" />

   </bean>

   <!-- Spring用于管理真正的ConnectionFactoryConnectionFactory -->

   <bean id="connectionFactory"

   class="org.springframework.jms.connection.SingleConnectionFactory">

      <!-- 目标ConnectionFactory对应真实的可以产生JMS ConnectionConnectionFactory -->

      <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="queueDestination"class="org.apache.activemq.command.ActiveMQQueue">

      <constructor-arg>

          <value>spring-queue</value>

      </constructor-arg>

   </bean>

   <!--这个是主题目的地,一对多的 -->

   <bean id="topicDestination"class="org.apache.activemq.command.ActiveMQTopic">

      <constructor-arg value="topic" />

   </bean>

  

</beans>


发消息测试:



package cn.e3mall.activmq;

import java.util.Queue;

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

import org.apache.zookeeper.server.SessionTracker.Session;
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;
import org.springframework.messaging.Message;

public class ActivMqSpring {
	@Test
	public void testSpringActiveMq() throws Exception {
		//初始化spring容器
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-activemq.xml");
		//从spring容器中获得JmsTemplate对象
		JmsTemplate jmsTemplate = applicationContext.getBean(JmsTemplate.class);
		//从spring容器中取Destination对象
		Destination destination = (Destination) applicationContext.getBean("queueDestination");
		//使用JmsTemplate对象发送消息。
		jmsTemplate.send(destination, new MessageCreator() {
			
			@Override
			public javax.jms.Message createMessage(javax.jms.Session session) throws JMSException {
				//创建一个消息对象并返回
				TextMessage textMessage = session.createTextMessage("spring activemq queue message");
				return textMessage;
			}
		}); 
			
		
		
	}


}


取消息内容:


package cn.e3mall.search.message;

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) {
		
		try {
			TextMessage textMessage = (TextMessage) message;
			//取消息内容
			String text = textMessage.getText();
			System.out.println(text);
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

}

配置文件:



<?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/beanshttp://www.springframework.org/schema/beans/spring-beans-4.2.xsd

   http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.2.xsd

   http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.2.xsd

   http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.2.xsd

   http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util-4.2.xsd">

 

 

   <!-- 真正可以产生ConnectionConnectionFactory,由对应的 JMS服务厂商提供 -->

   <bean id="targetConnectionFactory"class="org.apache.activemq.ActiveMQConnectionFactory">

      <property name="brokerURL"value="tcp://192.168.25.128:61616" />

   </bean>

   <!-- Spring用于管理真正的ConnectionFactoryConnectionFactory -->

   <bean id="connectionFactory"

   class="org.springframework.jms.connection.SingleConnectionFactory">

      <!-- 目标ConnectionFactory对应真实的可以产生JMS ConnectionConnectionFactory -->

      <property name="targetConnectionFactory"ref="targetConnectionFactory" />

   </bean>

  

   <!--这个是队列目的地,点对点的 -->

   <bean id="queueDestination"class="org.apache.activemq.command.ActiveMQQueue">

      <constructor-arg>

          <value>spring-queue</value>

      </constructor-arg>

   </bean>

   <!--这个是主题目的地,一对多的 -->

   <bean id="topicDestination"class="org.apache.activemq.command.ActiveMQTopic">

      <constructor-arg value="topic" />

   </bean>

  

   <!-- 接受消息 -->

   <bean id="myMessageListener"class="cn.e3mall.search.message.MyMessageListener"></bean>

   <!-- 消息监听容器 -->

   <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">

      <property name="connectionFactory"ref="connectionFactory" />

      <property name="destination"ref="queueDestination" />

      <property name="messageListener"ref="myMessageListener" />

   </bean>

  

</beans>

消息消费者:



package cn.e3mall.activemq;

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

public class MessageConsumer {

	@Test
	public void testQueueConsumer() throws Exception {
		//初始化spring容器
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-activemq.xml");
		//等待
		System.in.read();
	}

}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值