什么是MQ?
MQ是消息队列:Message Queue
类似于服务的注册和发现,消息也可以被提供和被消费。
服务的中间需要一个注册中心,消息的中间需要一个消息总线(消息队列)。
消息队列解决了什么问题?
提高请求响应的速度,节省执行时间
解决高并发(用于秒杀场景、抡购)
只是接收发送消息
如何使用消息队列?
本文以ActiveMQ为例,因为他也是Apache开源的产品。
同类的可代替产品还有:ActiveMQ\RabbitMq\Kafka
1本地安装:
因为我使用的windows,所以就安装windows版本的。
1 2 3 4 5 6 7 8 9 10 11 12 13
| Windows中安装ActiveMq 第一步:安装jdk,需要jdk1.7以上版本
第二步:解压缩activeMQ的压缩包。
第三步:进入bin目录。 双击activemq.bat 文件运行即可
第四步:访问后台管理。 http://ip地址:8161/admin
用户名:admin 密码:admin
|
成功启动如图所示:
本地访问:
2:SpringBoot集成
2.1:导入依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> <dependency> <groupId>org.messaginghub</groupId> <artifactId>pooled-jms</artifactId> </dependency>
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-pool</artifactId> <version>5.15.0</version> </dependency>
<dependency> <groupId>org.messaginghub</groupId> <artifactId>pooled-jms</artifactId> </dependency>
|
2.2:配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.in-memory=false
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=10
spring.activemq.pool.idle-timeout=30000
spring.activemq.packages.trust-all=true
|
2.3 :启动注解
在启动类上贴注解@EnableJms //启动消息队列
2.4.1:消息提供者
注入JmsMessagingTemplate对象发送消息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Controller public class SendMsgController { @Autowired private JmsMessagingTemplate jmsMessagingTemplate; @RequestMapping("/send") @ResponseBody public String sendMsg(String msg){ jmsMessagingTemplate.convertAndSend("k2502",msg); return "ok"; } }
|
2.4.2:消息消费者
(新工程)
1 2 3 4 5 6 7 8 9 10 11
| @Component public class ConsumerService { @JmsListener(destination = "k2502") public void handleMessage(String name) { System.out.println("成功消息是:" + name); } }
|
当同时启动两个工程和消息队列时,此时访问消息提供者工程的接口即可触发发送消息,消息的消费者可以接受到本案例传递的参数String进行消费。
我们访问提供者的接口进行发送消息。
然后我们在消费者控制台查看有没有被消费。