什么是消息队列
消息队列在当今的Java生态中是一个十分重要的一环,是一种中间件,用于解决Java系统中复杂的一环。
在消息队列中,通常有生产者和消费者两个角色。生产者只负责发送数据到消息队列,谁从消息队列中取出数据处理,他不管。消费者只负责从消息队列中取出数据处理,他不管这是谁发送的数据。这也充分体现了和后台线程是一样的,只关注于过程,不关注结果。
消息队列的特点(面试必问):
- 异步
- 解耦
- 削峰填谷
安装
安装Erlang,并配置环境变量
- 下载
首先进入官网下载相应的安装包。
因为我是基于本地测试用的,所以下载的windows版本,如果基于开发场景用的话,建议在Linux系统中直接用Docker镜像拉取相应的包即可。
下载完傻瓜式安装即可。 - 配置环境变量
打开环境变量,在“path”中配置刚才安装的位置。 - 测试
输入 erl -version
下载rabbitMQ
-
下载
进入官网,下载相应的版本。
一样的,傻瓜式安装就行了。 -
安装管理器
进入刚才安装的目录,进入/sbin,在这个目录下打开cmd
执行rabbitmq-plugins enable rabbitmq_management
-
查看服务启动
以上全部配置成功就代表万完成了安装。
进入http://localhost:15672
账号密码:guest/guest
集成SpringBoot
配置依赖
- pom文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
- 启动类
@EnableRabbit
- application.yml
rabbitmq:
host: 127.0.0.1
port: 5672
virtual-host: /
代码实现
创建交换机、队列及其绑定
@Test
public void creteExchange() {
DirectExchange directExchange = new DirectExchange("hello-change", true, false);
amqpAdmin.declareExchange(directExchange);
log.info("exchange【{}】创建成功!", "hello-change");
}
@Test
public void createQueue() {
Queue queue = new Queue("hello-queue", true, false, false);
amqpAdmin.declareQueue(queue);
log.info("Queue【{}】创建成功!", "hello-queue");
}
@Test
public void createBinding() {
Binding binding = new Binding("hello-queue",
Binding.DestinationType.QUEUE,
"hello-change",
"hello",
null);
amqpAdmin.declareBinding(binding);
log.info("Binding【{}】创建成功!", "hello-binding");
}
进入以下页面就代表绑定成功了。
发送消息
package com.tomalen.gulimall.order.controller;
import com.tomalen.gulimall.order.entity.OrderEntity;
import com.tomalen.gulimall.order.entity.OrderReturnReasonEntity;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@RestController
@Slf4j
public class RabbitController {
@Autowired
RabbitTemplate rabbitTemplate;
@GetMapping("/sendMessage")
public String sendMessage(@RequestParam(value = "num", defaultValue = "10") Integer num) {
for (int i = 0; i < num; i++) {
if (i % 2 == 0) {
OrderReturnReasonEntity reasonEntity = new OrderReturnReasonEntity();
reasonEntity.setId(1L);
reasonEntity.setName("不符合");
reasonEntity.setCreateTime(new Date());
rabbitTemplate.convertAndSend("hello-change", "hello", reasonEntity);
log.info("发送消息【{}】成功!", reasonEntity);
} else {
//发送不同类型的消息
OrderEntity orderEntity = new OrderEntity();
orderEntity.setId(1L);
orderEntity.setBillContent("cTest");
rabbitTemplate.convertAndSend("hello-change", "hello", orderEntity);
log.info("发送消息【{}】成功!", orderEntity);
}
}
return "ok";
}
}
消费消息
因为发送了不同类型的消息,所以要有方法重载为细粒度消费。
@RabbitListener(queues = "hello-queue")
@Slf4j
@Service("orderItemService")
public class OrderItemServiceImpl extends ServiceImpl<OrderItemDao, OrderItemEntity> implements OrderItemService {
/**
* queue:声明要监听的队列
* Message: 原生消息:头+体
* OrderReturnReasonEntity:<T> 发送的消息类型
*
* Channel:当前传输数据的通道
*
* Queues: 很多人可以进行监听,只要收到消息,就删除消息,而且只能有一个收到此消息
* @RabbitListener:用于类+方法上,(监听哪些队列)
* @RabbitHandler:标在方法上(重载类型不同的消息)
*
*/
@RabbitHandler
public void listenMessage(Message message,
OrderReturnReasonEntity content,
Channel channel) {
//封装的是发送消息的信息
byte[] body = message.getBody();
log.info("接收到消息,内容:{}", content);
}
@RabbitHandler
public void listenMessage2(Message message,
OrderEntity content,
Channel channel) {
//封装的是发送消息的信息
byte[] body = message.getBody();
log.info("接收到消息,内容:{}", content);
}
}
测试
控制台输出,可以看出发送的消息都被消费了。
2022-04-30 14:13:27.042 INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController : 发送消息【OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)】成功!
2022-04-30 14:13:27.042 INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController : 发送消息【OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)】成功!
2022-04-30 14:13:27.042 INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController : 发送消息【OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)】成功!
2022-04-30 14:13:27.043 INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController : 发送消息【OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)】成功!
2022-04-30 14:13:27.043 INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController : 发送消息【OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)】成功!
2022-04-30 14:13:27.044 INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController : 发送消息【OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)】成功!
2022-04-30 14:13:27.044 INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl : 接收到消息,内容:OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)
2022-04-30 14:13:27.044 INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController : 发送消息【OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)】成功!
2022-04-30 14:13:27.044 INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController : 发送消息【OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)】成功!
2022-04-30 14:13:27.044 INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl : 接收到消息,内容:OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)
2022-04-30 14:13:27.044 INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController : 发送消息【OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)】成功!
2022-04-30 14:13:27.044 INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl : 接收到消息,内容:OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)
2022-04-30 14:13:27.044 INFO 20180 --- [nio-9010-exec-5] c.t.g.order.controller.RabbitController : 发送消息【OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)】成功!
2022-04-30 14:13:27.045 INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl : 接收到消息,内容:OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)
2022-04-30 14:13:27.045 INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl : 接收到消息,内容:OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)
2022-04-30 14:13:27.045 INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl : 接收到消息,内容:OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)
2022-04-30 14:13:27.046 INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl : 接收到消息,内容:OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)
2022-04-30 14:13:27.046 INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl : 接收到消息,内容:OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)
2022-04-30 14:13:27.047 INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl : 接收到消息,内容:OrderReturnReasonEntity(id=1, name=不符合, sort=null, status=null, createTime=Sat Apr 30 14:13:27 CST 2022)
2022-04-30 14:13:27.047 INFO 20180 --- [ntContainer#0-1] c.t.g.o.s.impl.OrderItemServiceImpl : 接收到消息,内容:OrderEntity(id=1, memberId=null, orderSn=null, couponId=null, createTime=null, memberUsername=null, totalAmount=null, payAmount=null, freightAmount=null, promotionAmount=null, integrationAmount=null, couponAmount=null, discountAmount=null, payType=null, sourceType=null, status=null, deliveryCompany=null, deliverySn=null, autoConfirmDay=null, integration=null, growth=null, billType=null, billHeader=null, billContent=cTest, billReceiverPhone=null, billReceiverEmail=null, receiverName=null, receiverPhone=null, receiverPostCode=null, receiverProvince=null, receiverCity=null, receiverRegion=null, receiverDetailAddress=null, note=null, confirmStatus=null, deleteStatus=null, useIntegration=null, paymentTime=null, deliveryTime=null, receiveTime=null, commentTime=null, modifyTime=null)