A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

aixin1991131

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© aixin1991131 初级黑马   /  2018-1-20 18:08  /  4906 人查看  /  2 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马与你同在 于 2018-2-8 11:52 编辑

ActiveMq消息队列使用心得
经过18天的bos物流项目学习,虽然时间不长,但是我学会了很多,也懂得了很多。18天的紧张学习,让我对于一个传统项目的基本流程有了了解,对项目的业务逻辑也有了基本的了解。辉哥和宇哥也给了我们很大的帮助,感谢他们!
最后一天的回顾,辉哥提到redis和消息队列是比较重要的,通过辉哥的笔记,我对ActiveMq消息队列做了一些总结,希望对大家有所帮助,如果有不对的地方还希望大家提出来。
一、使用消息队列的优缺点
优点:在访问数据量大时,可以减少不必要的资源浪费
缺点:容易丢失数据,操作还未执行成功就响应给了消费者;解决方法:可以在消费者处记日志。
二、消息队列与同时启用多线程的差别
消息队列:可以有限制;不管数量多少,全部放进队列中,然后按一定的速度进行处理,不受访问数据大小的影响
同时启用多线程:每启动一条线程就会创建一条线程,数据量多时创建太多,数据量少时会造成资源浪费
三、应用场景
1、异步处理
场景说明:用户注册后,需要发注册邮件和注册短信。
图例:
2、应用解耦
场景说明:用户下单后,订单系统需要通知库存系统。
图例:
3、流量消锋
场景说明:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。
图例:
4、消息通讯
消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等
点对点通讯:
客户端A和客户端B使用同一队列,进行消息通讯。
聊天室通讯(发布订阅模式):
客户端A,客户端B,客户端N订阅同一主题,进行消息发布和接收。实现类似聊天室效果。
四、结合Spring来完成activeMQ的使用步骤
1、安装activeMQ
解压即可
访问地址: http://localhost:8161/ 用户名和密码都是 admin  
2、引进activeMQ需要的包
<!-- Spring整合ActiveMq -->
                  <dependency>
                          <groupId>org.springframework</groupId>
                          <artifactId>spring-jms</artifactId>
                          <version> 4.2.8.RELEASE </version>
                  </dependency>
<!-- 消息队列 MQ -->
                  <dependency>
                          <groupId>org.apache.activemq</groupId>
                          <artifactId>activemq-all</artifactId>
                          <version>${activemq.version}</version>
          </dependency>



3、activemq.xml文件的配置
在写配置文件之前我们应该知道JMS传输message的两种方式:①Queue(点对点方式)、②Topic(发布订阅),两种格式的比较如下图所示:
消息生产者端的配置
消息发送者:是由业务层控制的,调用Servlet中的方法。
我们只需要配置对应的JmsTemplate,消息的生产者和接受者就可以了。
<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->
         <bean id="targetConnectionFactory"class="org.apache.activemq.ActiveMQConnectionFactory">
                  <property name="brokerURL"value="tcp://localhost:61616" />
         </bean>
         <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
         <bean id="connectionFactory"
                  class="org.springframework.jms.connection.CachingConnectionFactory">
                  <!-- 目标ConnectionFactory对应真实的可以产生JMSConnection的ConnectionFactory -->
                  <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" />
                  <!-- 进行持久化 -->
                  <property name="deliveryMode"value="2" />
                  <!-- 开启订阅模式 -->
                  <property name="pubSubDomain"value="true" />
         </bean>
         <!--这个是队列目的地,点对点的 -->
         <bean id="queueDestination"class="org.apache.activemq.command.ActiveMQQueue">
                  <constructor-arg>
                          <value>queue</value>
                  </constructor-arg>
         </bean>
         <!--这个是主题目的地,一对多的 -->
         <bean id="topicDestination"class="org.apache.activemq.command.ActiveMQTopic">
                  <constructor-arg value="topic" />
         </bean>

消息消费者的配置文件
消息消费者:get message(监听:Queue、Tipoc),是交给Sprig来处理的。
与生产者配置文件不同的就是我们要在消息接收者的一段配置一个接收消息的监听器。用来监听消息发送者发送的消息。
<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->
         <bean id="targetConnectionFactory"class="org.apache.activemq.ActiveMQConnectionFactory">
                  <property name="brokerURL"value="tcp://localhost:61616" />
         </bean>
         <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
         <bean id="connectionFactory"
                  class="org.springframework.jms.connection.SingleConnectionFactory">
                  <!-- 目标ConnectionFactory对应真实的可以产生JMSConnection的ConnectionFactory -->
                  <property name="targetConnectionFactory"ref="targetConnectionFactory" />
         </bean>
         <!--这个是队列目的地,点对点的 -->
         <bean id="queueDestination"class="org.apache.activemq.command.ActiveMQQueue">
                  <constructor-arg>
                          <value>queue</value>
                  </constructor-arg>
         </bean>
         <!--这个是主题目的地,一对多的 -->
         <bean id="topicDestination"class="org.apache.activemq.command.ActiveMQTopic">
                  <constructor-arg value="topic" />
         </bean>
         <!-- 接收消息 -->
         <!-- 配置监听器 -->
         <bean id="myMessageListener"class="cn.itcast.bos.service.SaveIndex" />
         <!-- 消息监听容器 -->
         <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
                  <property name="connectionFactory"ref="connectionFactory" />
                  <property name="destination"ref="queueDestination" />
                  <property name="messageListener"ref="myMessageListener" />
         </bean>

以上是我的一些总结,希望对大家有一些帮助,如果有不对的地方还请大家指教!!!

2 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马