ActiveMQ是什么
MQ俗称消息队列,也称为消息中间件,是一种在分布式系统中应用程序借以传递消息的媒介,常用的有ActiveMQ
,RabbitMQ
,kafka
。ActiveMQ
是Apache
下的开源项目,完全支持JMS1.1和J2EE1.4规范的JMS Provider
实现。
MQ的产品种类
1.kafka // 编程语言:scala。大数据领域的主流 MQ。
2.rabbitmq // 编程语言:erlang。基于 erlang 语言,不好修改底层,不要查找问题的原因,不建议选用。
3.rocketmq // 编程语言:java。适用于大型项目。适用于集群。
4.activemq // 编程语言:java。适用于中小型项目。
MQ最主要的作用
1.异步。调用者无需等待。
2.解耦。解决了系统之间耦合调用的问题。
3.消峰。抵御洪峰流量,保护了主业务。
ActiveMQ优点缺点
特点
1、采用异步处理模式
2、应用系统之间解耦合
3、支持多种传输协议:TCP,SSL,NIO,UDP等
4、整体架构
5、高可用性
6、延时发送\定时投递
缺点
1.两个系统之间不能同步调用
2.不能实时回复
3.不能响应某个调用的回复
为什么使用ActiveMQ
为了:1.系统解耦、2. 异步调用、3.流量削峰
解耦
请求与主系统之间没有直接的调用关系,只是通过消息传输,故系统侵入性不强,耦合度低。
削峰
秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。
可以缓解短时间的高流量压垮应用 用户的请求,服务器收到之后,首先写入消息队列,加入消息队列长度超过最大值,则直接抛弃用户请求或跳转到错误页面.
异步
如果采用传统的同步方式处理,系统性能会很慢。
应用消息队列后可以把,发邮件、短信等不是必须的业务逻辑进行异步处理,提高系统效率!
消息形式
1、点对点(queue)
2、一对多(topic)
安装ActiveMQ的两种方式
一、压缩包安装ActiveMQ
ActiveMQ官网:ActiveMQ官网
如图所示:
下载ActiveMQ 5 "Classic"版本
通过解压缩安装步骤
1.创建微服务相关文件夹
mkdir Microservice
2.切换到Microservice文件夹
cd usr/local/Microservice
3.将下载好的ActiveMQ通过FinalShell上传至该文件夹
4.通过tar命令解压缩下载的ActiveMQ
tar -zxvf (ActiveMQ版本)
5.将解压缩后的压缩包删除 将解压出来的文件夹重命名
rm -f 压缩包全名
//重命名文件夹
mv 压缩文件全名 修改的文件名
进入bin文件夹后启动
./activemq start //普通启动
//activemq的默认服务端口是:61616
查看61616端口命令
第一种方式:netstat -anp|grep 61616
第二种方式:lsof -i:61616
./activemq stop //关闭
如下图所示则为启动成功
ActiveMQ控制台
上续启动后查看控制台
访问 activemq 管理页面地址:IP地址:8161/
默认登录用户名密码均为:admin
出现如下图查看成功
activemq命令
//查看 activemq 状态
service activemq status
//关闭 activemq 服务
service activemq stop
二、docker-compose安装
version: '2'
services:
#activemq容器
activemq:
#name: myactivemq
#定义主机名
hostname: myactivemq
#使用的镜像
image: webcenter/activemq
#容器的映射端口
ports:
- 61617:61616
- 8162:8161
restart: always
#定义挂载点
volumes:
- ./data/activemq:/data/activemq
- ./var/log/activemq:/var/log/activemq
执行docker-compose命令
docker-compose up -d
//执行成功出现以下命令
spring-boot整合ActiveMQ
点对点Queue
创建发送消息的控制器
一、导入相应的maven依赖
<!--导入springboot和ActiveMQ依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
二、创建一个发送消息的控制器
@RestController
public class SendController {
@Resource
private JmsMessagingTemplate jmsMessagingTemplate;
@RequestMapping("/send")
public String sendMessage(String message){
//创建队列名称对象
Queue queue=new ActiveMQQueue("测试队列1");
//将消息发送到服务器中
jmsMessagingTemplate.convertAndSend(queue,message);
return "发送成功";
}
点对多放开下面即可
<!--
@RequestMapping("/send2")
public String sendMessage2(String message){
//创建队列名称对象(点对点)
//发布订阅
Topic topic=new ActiveMQTopic("测试队列1");
//将消息发送到服务器中
for(int i=1;i<=10;i++){
jmsMessagingTemplate.convertAndSend(topic,message+i);
}
return "发送成功";
}-->
}
三、修改配置文件后缀为yml
spring:
activemq:
broker-url: tcp://192.168.92.129:61616
in-memory: true
pool:
enabled: false
packages:
trust-all: true
#配置消息中间件的模式 false 队列模式 点对点 true 发布订阅模式 点对多
jms:
pub-sub-domain: true
通过浏览器或者第三方软件发送请求发送成功如下图
通过浏览器ActiveMQ查看消息队列
编写Consumer控制器监听ActiveMQ消息队列
一、导入相应的maven依赖
<!--导入springboot和ActiveMQ依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
二、创建监听消息的控制器
@Component
public class Consumer {
//配置监听的处理方法 destination表示要处理哪个队列中的信息
//接收到的信息会自动存放到方法的参数中
@JmsListener(destination = "测试队列2")
public void getMessage(String message){
System.out.println(message);
}
}
三、修改配置文件后缀为yml
spring:
activemq:
broker-url: tcp://192.168.92.129:61616
in-memory: true
pool:
enabled: false
packages:
trust-all: true
server:
port: 8081
#配置消息中间件的模式 false 队列模式 点对点 true 发布订阅模式 点对多
jms:
pub-sub-domain: true
Consumer启动类加注解
@EnableJms