0%

ActiveMQ快速入门

什么是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>
<!--消息队列连接池的依赖 如果是springboot2.0以下用此版本-->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.15.0</version>
</dependency>
<!--如果是springboot2.0+导入以下依赖-->
<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
# tcp://localhost:61616  
spring.activemq.broker-url=tcp://localhost:61616
#指定用户名
spring.activemq.user=admin
#指定密码
spring.activemq.password=admin
#true 表示使用内置的MQ,false则连接服务器
spring.activemq.in-memory=false
#true表示使用连接池;false时,每发送一条数据创建一个连接
spring.activemq.pool.enabled=true
#连接池最大连接数
spring.activemq.pool.max-connections=10
#空闲的连接过期时间,默认为30秒
spring.activemq.pool.idle-timeout=30000
#传递接收对象时需要:ActiveMQ将强制用户配置可序列化的包名
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 {
//注入JmsMessagingTemplate对象即可发送信息
@Autowired //基于连接池
private JmsMessagingTemplate jmsMessagingTemplate;
//接收请求 往消息队列中发送消息
@RequestMapping("/send")
@ResponseBody
public String sendMsg(String msg){
//使用JmsMessagingTemplate发送消息 支持创建队列
// jmsMessagingTemplate.convertAndSend("指定发送队列的名称",发送的消息);
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配置消费者监听的队列,其中name是接收到的消息
//@JmsListener(destination = "监听队列的名称")
@JmsListener(destination = "k2502")
public void handleMessage(String name) {
//方法参数指定的就是接收的消息,如果是发送的字符串消息就行String
System.out.println("成功消息是:" + name);
//处理消息的业务
}
}

当同时启动两个工程和消息队列时,此时访问消息提供者工程的接口即可触发发送消息,消息的消费者可以接受到本案例传递的参数String进行消费。


我们访问提供者的接口进行发送消息。

然后我们在消费者控制台查看有没有被消费。