ActiveMQ的简单使用

转:http://wosyingjun.iteye.com/blog/2314681

ActiveMQ的简单使用

ActiveMQ是一种开源的,实现了JMS规范的,面向消息(MOM)的中间件,为应用程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。

相关文章:
范例项目: http://wosyingjun.iteye.com/blog/2312553 
ActiveMQ集群高可用方案:http://wosyingjun.iteye.com/blog/2314683

 
ActiveMQ组成:

 
ActiveMQ接发送消息流程图:

一. ActiveMQ的安装和配置

1、官网下载Linux版的ActiveMQ(最新版本为5.13.4)
https://activemq.apache.org/download.html
2、解压安装
tar -zxvf apache-activemq-5.13.4-bin.tar.gz
3、配置(这里采用默认配置,无需修改)
vim /usr/lical/activemq-1/conf/activemq.xml
4、启动
cd /usr/local/activemq-1/bin
./activemq start
5、打开管理界面(管理界面可以查看并管理所有队列及消息)
http://192.168.1.100:8161

二. Spring结合ActiveMQ使用

 1、pom文件引入依赖
Xml代码  收藏代码
  1. <!--active mq start-->  
  2. <dependency>  
  3.     <groupId>org.apache.activemq</groupId>  
  4.     <artifactId>activemq-core</artifactId>  
  5.     <version>5.7.0</version>  
  6. </dependency>  
  7. <dependency>  
  8.     <groupId>org.apache.activemq</groupId>  
  9.     <artifactId>activemq-pool</artifactId>  
  10.     <version>5.13.3</version>  
  11. </dependency>  
  12. <!--active mq end-->  
 
2、spring-mq配置文件
Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xsi:schemaLocation="  
  5.         http://www.springframework.org/schema/beans  
  6.         http://www.springframework.org/schema/beans/spring-beans.xsd">  
  7.   
  8.     <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->  
  9.     <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
  10.         <!-- ActiveMQ服务地址 -->  
  11.         <property name="brokerURL" value="${mq.brokerURL}"/>  
  12.         <property name="userName" value="${mq.userName}"></property>  
  13.         <property name="password" value="${mq.password}"></property>  
  14.         <!-- 这里定义重试策略,注意:只有持久化的才会重试-->  
  15.         <property name="redeliveryPolicyMap" ref="redeliveryPolicyMap"/>  
  16.     </bean>  
  17.   
  18.   
  19.     <!--这里设置各个消息队列的重发机制-->  
  20.     <bean id="redeliveryPolicyMap" class="org.apache.activemq.broker.region.policy.RedeliveryPolicyMap">  
  21.         <property name="redeliveryPolicyEntries">  
  22.             <list>  
  23.                 <ref bean="bizRedeliveryPolicy"/>  
  24.                 <ref bean="mailRedeliveryPolicy"/>  
  25.             </list>  
  26.         </property>  
  27.     </bean>  
  28.     <bean id="bizRedeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">  
  29.         <!--重发次数 延时、延时系数、延时指数开关、目标(重发等待时间1s, 2s, 4s, 8s)-->  
  30.         <property name="maximumRedeliveries" value="3"/>  
  31.         <property name="redeliveryDelay" value="1000"/>  
  32.         <property name="backOffMultiplier" value="2"/>  
  33.         <property name="useExponentialBackOff" value="true"/>  
  34.         <property name="destination" ref="bizQueue"/>  
  35.     </bean>  
  36.     <bean id="mailRedeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">  
  37.         <!--重发次数 延时、延时系数、延时指数开关-->  
  38.         <property name="maximumRedeliveries" value="2"/>  
  39.         <property name="redeliveryDelay" value="5000"/>  
  40.         <property name="destination" ref="mailQueue"/>  
  41.     </bean>  
  42.   
  43.     <!--  
  44.         ActiveMQ为我们提供了一个PooledConnectionFactory,通过往里面注入一个ActiveMQConnectionFactory  
  45.         可以用来将Connection、Session和MessageProducer池化,这样可以大大的减少我们的资源消耗。  
  46.         要依赖于 activemq-pool包  
  47.      -->  
  48.     <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">  
  49.         <property name="connectionFactory" ref="targetConnectionFactory"/>  
  50.         <property name="maxConnections" value="${mq.pool.maxConnections}"/>  
  51.     </bean>  
  52.   
  53.     <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->  
  54.     <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">  
  55.         <!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->  
  56.         <property name="targetConnectionFactory" ref="pooledConnectionFactory"/>  
  57.         <property name="reconnectOnException" value="true"/>  
  58.     </bean>  
  59.   
  60.     <!-- 队列目的地-->  
  61.     <bean id="bizQueue" class="org.apache.activemq.command.ActiveMQQueue">  
  62.         <constructor-arg index="0" value="${biz.queueName}"/>  
  63.     </bean>  
  64.     <bean id="mailQueue" class="org.apache.activemq.command.ActiveMQQueue">  
  65.         <constructor-arg index="0" value="${mail.queueName}"/>  
  66.     </bean>  
  67.   
  68.   
  69.     <!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->  
  70.     <!-- 队列模板 这里配置2个,一个用于分布式业务,一个用于发送邮件-->  
  71.     <bean id="bizMqJmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
  72.         <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  
  73.         <property name="connectionFactory" ref="connectionFactory"/>  
  74.         <property name="defaultDestination" ref="bizQueue"/>  
  75.         <!-- 使 deliveryMode, priority, timeToLive设置生效-->  
  76.         <property name="explicitQosEnabled" value="true" />  
  77.         <!-- 持久化 如果设置为非持久化MQ服务器重启后MQ中的数据会丢失-->  
  78.         <property name="deliveryPersistent" value="true"/>  
  79.         <!--这里注意:如果不开启事务,消息在异常的情况下是不会重试的-->  
  80.         <property name="sessionTransacted" value="false"/>  
  81.     </bean>  
  82.   
  83.     <bean id="mailMqJmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
  84.         <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  
  85.         <property name="connectionFactory" ref="connectionFactory"/>  
  86.         <property name="defaultDestination" ref="mailQueue"/>  
  87.         <!-- 使 deliveryMode, priority, timeToLive设置生效-->  
  88.         <property name="explicitQosEnabled" value="true" />  
  89.         <!-- 持久化 如果设置为非持久化MQ服务器重启后MQ中的数据会丢失-->  
  90.         <property name="deliveryPersistent" value="true"/>  
  91.         <!--这里注意:如果不开启事务,消息在异常的情况下是不会重试的-->  
  92.         <property name="sessionTransacted" value="true"/>  
  93.     </bean>  
  94.   
  95.     <!-- 消息监听实现方法一 -->  
  96.     <bean id="bizListener" class="com.yingjun.ssm.mq.listener.TransactionBizMessageListener"/>  
  97.     <bean id="mailListener" class="com.yingjun.ssm.mq.listener.MailMessageListener"/>  
  98.   
  99.   
  100.     <!-- 消息接收监听器用于异步接收消息-->  
  101.     <bean id="bizContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
  102.         <property name="connectionFactory" ref="connectionFactory"/>  
  103.         <property name="destination" ref="bizQueue"/>  
  104.         <property name="messageListener" ref="bizListener"/>  
  105.         <!--这里注意:如果不开启事务,消息在异常的情况下是不会重试的-->  
  106.         <property name="sessionTransacted" value="true"/>  
  107.         <property name="concurrentConsumers" value="1"/>  
  108.     </bean>  
  109.   
  110.     <bean id="mailContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
  111.         <property name="connectionFactory" ref="connectionFactory"/>  
  112.         <property name="destination" ref="mailQueue"/>  
  113.         <property name="messageListener" ref="mailListener"/>  
  114.         <!--这里注意:如果不开启事务,消息在异常的情况下是不会重试的-->  
  115.         <property name="sessionTransacted" value="true"/>  
  116.         <property name="concurrentConsumers" value="1"/>  
  117.     </bean>  
  118.   
  119. </beans>  
 
3、重试机制以及死信的配置
Xml代码  收藏代码
  1. <!--这里设置各个消息队列的重发机制-->  
  2.     <bean id="redeliveryPolicyMap" class="org.apache.activemq.broker.region.policy.RedeliveryPolicyMap">  
  3.         <property name="redeliveryPolicyEntries">  
  4.             <list>  
  5.                 <ref bean="bizRedeliveryPolicy"/>  
  6.                 <ref bean="mailRedeliveryPolicy"/>  
  7.             </list>  
  8.         </property>  
  9.     </bean>  
  10.     <bean id="bizRedeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">  
  11.         <!--重发次数 延时、延时系数、延时指数开关、目标(重发等待时间1s, 2s, 4s, 8s)-->  
  12.         <property name="maximumRedeliveries" value="3"/>  
  13.         <property name="redeliveryDelay" value="1000"/>  
  14.         <property name="backOffMultiplier" value="2"/>  
  15.         <property name="useExponentialBackOff" value="true"/>  
  16.         <property name="destination" ref="bizQueue"/>  
  17.     </bean>  
  18.     <bean id="mailRedeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">  
  19.         <!--重发次数 延时、延时系数、延时指数开关-->  
  20.         <property name="maximumRedeliveries" value="2"/>  
  21.         <property name="redeliveryDelay" value="5000"/>  
  22.         <property name="destination" ref="mailQueue"/>  
  23.     </bean>  
 
4、发送端代码
Java代码  收藏代码
  1. package com.yingjun.ssm.biz;  
  2.   
  3. import com.alibaba.fastjson.JSONObject;  
  4. import com.yingjun.ssm.common.model.BizOperator;  
  5. import org.junit.Test;  
  6. import org.junit.runner.RunWith;  
  7. import org.slf4j.Logger;  
  8. import org.slf4j.LoggerFactory;  
  9. import org.springframework.beans.factory.annotation.Autowired;  
  10. import org.springframework.jms.core.JmsTemplate;  
  11. import org.springframework.jms.core.MessageCreator;  
  12. import org.springframework.test.context.ContextConfiguration;  
  13. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;  
  14.   
  15. import javax.jms.JMSException;  
  16. import javax.jms.Message;  
  17. import javax.jms.Session;  
  18.   
  19. /** 
  20.  * @author yingjun 
  21.  */  
  22. @RunWith(SpringJUnit4ClassRunner.class)  
  23. @ContextConfiguration("classpath:application.xml")  
  24. public class Application {  
  25.   
  26.     private final Logger log = LoggerFactory.getLogger(Application.class);  
  27.   
  28.     @Autowired  
  29.     private JmsTemplate bizMqJmsTemplate;  
  30.   
  31.     @Test  
  32.     public void mailSend() throws Exception {  
  33.         bizMqJmsTemplate.setSessionTransacted(true);  
  34.         for (int i = 0; i < 1; i++) {  
  35.             log.info("==>send message" + i);  
  36.             bizMqJmsTemplate.send(new MessageCreator() {  
  37.                 @Override  
  38.                 public Message createMessage(Session session) throws JMSException {  
  39.                     log.info("getTransacted:" + session.getTransacted());  
  40.                     BizOperator operator = new BizOperator("testDistributedTransaction"1001);  
  41.                     return session.createTextMessage(JSONObject.toJSONString(operator));  
  42.                 }  
  43.             });  
  44.             log.info("==>finish send message"+ i);  
  45.         }  
  46.         while (true) {  
  47.   
  48.         }  
  49.     }  
  50. }  
 
5、接受端代码
Java代码  收藏代码
  1. package com.yingjun.ssm.mq.listener;  
  2.   
  3. import com.alibaba.fastjson.JSONObject;  
  4. import com.yingjun.ssm.common.model.BizOperator;  
  5. import com.yingjun.ssm.mq.biz.TransactionBizService;  
  6. import org.apache.activemq.command.ActiveMQTextMessage;  
  7. import org.slf4j.Logger;  
  8. import org.slf4j.LoggerFactory;  
  9. import org.springframework.beans.factory.annotation.Autowired;  
  10. import org.springframework.jms.listener.SessionAwareMessageListener;  
  11. import org.springframework.stereotype.Component;  
  12.   
  13. import javax.jms.JMSException;  
  14. import javax.jms.Message;  
  15. import javax.jms.Session;  
  16.   
  17. /** 
  18.  *  
  19.  * @author yingjun 
  20.  */  
  21. @Component  
  22. public class TransactionBizMessageListener implements SessionAwareMessageListener<Message> {  
  23.   
  24.     private static final Logger log = LoggerFactory.getLogger(TransactionBizMessageListener.class);  
  25.     private final String transactionBiz = "testDistributedTransaction";  
  26.   
  27.     @Autowired  
  28.     private TransactionBizService transactionBizService;  
  29.   
  30.     /** 
  31.      * @param message 
  32.      * @param session 
  33.      */  
  34.     public void onMessage(Message message, Session session) throws JMSException{  
  35.         //这里建议不要try catch,让异常抛出,通过redeliveryPolicy去重试,达到重试次数进入死信DLQ(Dead Letter Queue)  
  36.         ActiveMQTextMessage msg = (ActiveMQTextMessage) message;  
  37.         String ms = ms = msg.getText();  
  38.         log.info("==>receive message:" + ms);  
  39.         // 转换成相应的对象  
  40.         BizOperator operator = JSONObject.parseObject(ms, BizOperator.class);  
  41.         if (operator != null && transactionBiz.equals(operator.getOperator())) {  
  42.             transactionBizService.addScoreBySyn(100);  
  43.             //throw new RuntimeException("test redeliveryPolicy");  
  44.         } else {  
  45.             log.info("==>message:" + ms + " no about operator!");  
  46.         }  
  47.     }  

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭