ActiveMQ消息队列的使用

哈哈哈,开发ActiveMQ的真是厉害,嘿嘿,简单的从几个方面去介绍ActiveMQ的用处
一.ActiveMQ的应用场景:

  1. 用户注册,重点用户信息数据库保存,发短信、发邮件,增加业务处理复杂度,这时候使用 MQ, 将发短信、发邮箱,通知 MQ,由另外服务平台完成

  2. 搜索平台、缓存平台 查询数据,建立缓存、索引 ,不从数据库查询,从缓存或者索引库查询 当增加、修改、删除数据时,发送消息给 MQ,缓存平台、索引平台 从 MQ 获取 到这个信息,更新缓存或者索引

简单的说ActiveMQ主要解决的问题有: 解决服务之间耦合 ,增加系统并发处理量 大大提高程序的效率;
按照我们老师打的一个简单的比喻:
以面馆为例:没使用ActiveMQ时,客人吃面直接跟厨师说,相当于请求,当请求很多时,厨师需要做面还需要将面给对应客户;当使用ActiveMQ时,相当于我们不是厨师了,我们角色变成了传话者,只需要跟厨师说客人需要什么,而我们不用做;
也将整理的笔记贴出来吧:

  1. 消息队列是什么
      1. 异步: 请求的时间过长,业务花费的时间过长
      2. 削峰: 请求量大,将请求的内容压入栈,一个个的处理
      3. 解耦: 服务器的生产者无需关注业务的完成。只需要知道要做什么,不需要知道怎么做
   2. 干什么用的
      1. 响应的速度赶不上请求的速度

2. 消息的类型

   1. queue: 队列。一条消息只能由一个消费者获取,没有被获取的消息,会缓存在消息队列中。
   2. topic: 话题。一条消息可以由当前正在监听的所有消费者获取。消息存在时效性。没有在线的消费者,上线后无法获得消息。

3. 使用消息队列需要注意的问题

   1. 消息的类型
   2. 消息的名称
   3. 生产: 使用哪种消息的对象TextMessage,怎么设置数据。
   4. 消费:实现MessageListener,获取消息对象,根据发送的消息对象,获取消息中的内容

2.spring整合activeMQ的使用
发送消失

 1. spring配置

         1. 原始的activeMQ的连接,注意:如果使用amp的名称空间,启动项目需要联网。

         2. 配置spring管理的连接类org.springframework.jms.connection.CachingConnectionFactory

         3. 配置消息的模板对象。通过属性pubSubDomain来设置消息的类型。

                <!-- 定义JmsTemplate的Queue类型 -->
                <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
                    <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  
                    <constructor-arg ref="connectionFactory" />
                    <!-- 非pub/sub模型(发布/订阅),即队列模式 -->
                    <property name="pubSubDomain" value="false" />
                </bean>

                <!-- 定义JmsTemplate的Topic类型 -->
                <bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
                     <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->  
                    <constructor-arg ref="connectionFactory" />
                    <!-- pub/sub模型(发布/订阅) 即话题模式-->
                    <property name="pubSubDomain" value="true" />
                </bean>
            ​
      2. API

         1. 注入消息的模板

            //哪里需要发消息,就在哪里注入template对象
            @Autowired
            @Qualifier("jmsQueueTemplate")
            private JmsTemplate jmsTemplate;

         2. 调用发送的APi发送消息
            //send的第一个参数是字符串,表示消息的名称
            jmsTemplate.send("myQueue", new MessageCreator() {

                        public Message createMessage(Session session) throws JMSException {
                            return session.createTextMessage("咱们发的queue消息!!");
                        }
                    });
         3. 消息的使用

            1. 文本消息

               session.createTextMessage(text);

               简单的数据,直接用文本表示。对象类型,先转成JSON字符串,再保存。

            2. Map消息

               复杂信息,一次传递多个信息。

               ```java
               MapMessage message = session.createMapMessage();
                    message.setString(name1, value1);
                    message.setString(name2, value2);
               ```

接受消息

  1. 自定义一个消息的监听器,实现MessageListener接口(不区分消息的类型,和接收的消息内容)

         只需要将消息强转成发送时的类型,将消息内容取出

         @Service
         public class QueueConsumer1 implements MessageListener {
            public void onMessage(Message message) {
                 //处理消息
                 //获取文本
                TextMessage textMessage = (TextMessage) message;
                 textMessage.getText();
                 //获取mapMessage
                 MapMessage mapMessage = (MapMessage) message;
                mapMessage.getString(name);  
            }
         }

      2. spring配置

         1. 原始的activeMQ的连接,注意:如果使用amp的名称空间,启动项目需要联网。

         2. 配置spring管理的连接类org.springframework.jms.connection.CachingConnectionFactory

         3. 配置监听器(类型和名称)
                <!-- 定义Queue监听器 -->
                <jms:listener-container destination-type="queue"
                    container-type="default" connection-factory="connectionFactory"
                    acknowledge="auto">
                    <!-- 默认注册bean名称,应该是类名首字母小写 -->
                    <jms:listener destination="spring_queue2" ref="queueConsumer1" />
                    <jms:listener destination="spring_queue2" ref="queueConsumer2" />
                </jms:listener-container>

猜你喜欢

转载自blog.csdn.net/caiyibing1992/article/details/82228465