• Springboot整合activemq 小毛毛


    今天呢心血来潮,也有很多以前的学弟问到我关于消息队列的一些问题,有个刚入门,有的有问题都来问我,那么今天来说说如何快速入门mq。

    一、首先说下什么是消息队列?

    1.消息队列是在消息的传输过程中保存消息的容器。

    二、为什么要用到消息队列?

    主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达MySQL,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。

    三、消息队列都分为哪几种?

    1. ActiveMQ/ApolloMQ
      优点:老牌的消息队列,使用Java语言编写。对JMS支持最好,采用多线程并发,资源消耗比较大。如果你的主语言是Java,可以重点考虑。
      缺点:由于历史悠久,历史包袱较多,版本更新很缓慢。集群模式需要依赖Zookeeper实现。最新架构的产品被命名为Apollo,号称下一代ActiveMQ,目前案例较少。

    2. RocketMQ/Kafka

      优点:专为海量消息传递打造,主张使用拉模式,天然的集群、HA、负载均衡支持。话说还是那句话,适合不适合看你有没有那么大的量。
      缺点:所谓鱼和熊掌不可兼得,放弃了一些消息中间件的灵活性,使用的场景较窄,需关注你的业务模式是否契合,否则山寨变相使用很别扭。除此之外,RocketMQ没有.NET下的客户端可用。RocketMQ身出名门,但使用者不多,生态较小,毕竟消息量能达到这种体量的公司不多,你也可以直接去购买阿里云的消息服务。Kafka生态完善,其代码是用Scala语言写成,可靠性比RocketMQ低一些。

    3. RabbitMQ
      优点:生态丰富,使用者众,有很多人在前面踩坑。AMQP协议的领导实现,支持多种场景。淘宝的MySQL集群内部有使用它进行通讯,OpenStack开源云平台的通信组件,最先在金融行业得到运用。
      缺点:Erlang代码你Hold得住不? 虽然Erlang是天然集群化的,但RabbitMQ在高可用方面做起来还不是特别得心应手,别相信广告。

    四、我们今天重要说下如何快速上手activemq,也是在mq中最容易上手的一种

    1.首先我们先下载activemq  链接 http://activemq.apache.org/download.html

    2.

    3.下载对应的版本

    4.启动activemq(我这里是mac环境,windows可双击运行)

    出现这个说明mq已经启动我可可以通过active默认的端口号运行https://http://localhost:8161/

    这里看到他会alert一个登陆窗口 默认账号密码都为admin

    点击Queues查看队列是的消息,这样我们activemq就算运行了

    那么现在我将它整合在springboot里,也十分简单 首先看下项目结构

    5.加入依赖 本次用的gradle

     compile('org.springframework.boot:spring-boot-starter-activemq:2.1.1.RELEASE')
    

    6.yml配置

    spring:
      activemq:
        broker-url: tcp://localhost:61616
        user: admin
        password: admin

    这里注意了配置的端口号和启动端口号不是一直的,默认为61616,在conf的jetty.xml下课进行查看也可以修改

    咱们直接上代码

    7.Controller

    package com.gd.acticemqtest.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jms.core.JmsTemplate;
    import org.springframework.jms.core.MessageCreator;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.Session;
    import javax.jms.TextMessage;
    
    /**
     * @DATA 2019-01-09 22:42
     * @Author 张国伟  WeChat:17630376104
     * @Description TODO
     */
    @RestController
    public class controllerDemo {
    
        @Autowired
        private JmsTemplate jmsTemplate;
    
        @RequestMapping("/sendMsg")
        public void sendMsg(String msg) {
            jmsTemplate.send("q2", new MessageCreator() {
                @Override
                public Message createMessage(Session session) throws JMSException {
    
                    TextMessage textMessage = session.createTextMessage();
                    textMessage.setText(msg);
                    return textMessage;
                }
            });
        }
    这里一定要注意的是JmsTemplate到底引用的那个包
    jmsTemplate.send是向队列里发送消息,并且为队列起一个名字
    package com.gd.acticemqtest.serive;
    
    import org.springframework.jms.annotation.JmsListener;
    import org.springframework.stereotype.Service;
    
    /**
     * @DATA 2019-01-09 22:54
     * @Author 张国伟  WeChat:17630376104
     * @Description TODO
     */
    @Service
    public class ActiveMsgListener {
    
       @JmsListener(destination = "q2")
        public void rctiveMsg(String message){
        System.out.println("------监听到activemq的数据"+message);
        }
    
    }

    jmsListener是spring的针对消息的监听器,当mq里有数据后第一时间把消息监听到,我们跑一把试试

    当敲下enter那一刻,控制台已经把刚刚存进去的消息给打印了出来

    那这个时候我们再来看下activemq的服务中是否有消息

     可以看到这时候队列里已经有了q2这个消息。

    随后会出如何在前端接受消息,运用到websocket 再见!!
     
  • 相关阅读:
    [Heoi2013]Alo
    10.24 考试
    第八周作业
    第七周作业
    第六周作业
    第五周作业
    第四周作业
    求最大值及其下标
    查找整数
    抓老鼠啊~亏了还是赚了?
  • 原文地址:https://www.cnblogs.com/zgwjava/p/10283908.html
Copyright © 2020-2023  润新知