今天呢心血来潮,也有不少之前的学弟问到我关于消息队列的一些问题,有个刚入门,有的有问题都来问我,那么今天来讲说如何快速入门mq。html
1、首先说下什么是消息队列?前端
1.消息队列是在消息的传输过程当中保存消息的容器。java
2、为何要用到消息队列?mysql
主要缘由是因为在高并发环境下,因为来不及同步处理,请求每每会发生堵塞,好比说,大量的insert,update之类的请求同时到达MySQL,直接致使无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。经过使用消息队列,咱们能够异步处理请求,从而缓解系统的压力。web
3、消息队列都分为哪几种?spring
1. ActiveMQ/ApolloMQ
优势:老牌的消息队列,使用Java语言编写。对JMS支持最好,采用多线程并发,资源消耗比较大。若是你的主语言是Java,能够重点考虑。
缺点:因为历史悠久,历史包袱较多,版本更新很缓慢。集群模式须要依赖Zookeeper实现。最新架构的产品被命名为Apollo,号称下一代ActiveMQ,目前案例较少。sql
2. RocketMQ/Kafkaapache
优势:专为海量消息传递打造,主张使用拉模式,自然的集群、HA、负载均衡支持。话说仍是那句话,适合不适合看你有没有那么大的量。
缺点:所谓鱼和熊掌不可兼得,放弃了一些消息中间件的灵活性,使用的场景较窄,需关注你的业务模式是否契合,不然山寨变相使用很别扭。除此以外,RocketMQ没有.NET下的客户端可用。RocketMQ身出名门,但使用者很少,生态较小,毕竟消息量能达到这种体量的公司很少,你也能够直接去购买阿里云的消息服务。Kafka生态完善,其代码是用Scala语言写成,可靠性比RocketMQ低一些。windows
3. RabbitMQ
优势:生态丰富,使用者众,有不少人在前面踩坑。AMQP协议的领导实现,支持多种场景。淘宝的MySQL集群内部有使用它进行通信,OpenStack开源云平台的通讯组件,最早在金融行业获得运用。
缺点:Erlang代码你Hold得住不? 虽然Erlang是自然集群化的,但RabbitMQ在高可用方面作起来还不是特别驾轻就熟,别相信广告。
springboot
4、咱们今天重要说下如何快速上手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 再见!!