提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
RabbitMQ 中文官方文档 (RabbitMQ 中文官方文档)
本文使用RabbitMQ作为使用案例,实际业务中为了实现未支付订单自动失效。
提示:以下是本篇文章正文内容,下面案例可供参考
一、版本依赖
RabbitMQ使用的是3.9,安装了死信插件。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
<version>$4.0.0</version>
</dependency>
二、使用步骤
实体类:
package com.iterative.learning.rabbitmq;
public class RabbitMQ {
private String name;
private long sendTime;
public RabbitMQ() {
}
public RabbitMQ(String name, long sendTime) {
this.name = name;
this.sendTime = sendTime;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getSendTime() {
return sendTime;
}
public void setSendTime(long sendTime) {
this.sendTime = sendTime;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sendTime=" + sendTime +
'}';
}
}
1.生产者
代码如下(示例):
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.Message;
@RestController
public class SystemLogController extends BaseController {
@Resource
private StreamBridge streamBridge;
// 发送分组消息
@PostMapping("/group")
public String sendGroupMessage() {
// 生产消息
streamBridge.send("myGroup-out-0", JSONUtil.toJsonStr(new RabbitMQ("myGroup-out-0", System.currentTimeMillis())));
return "SUCCESS";
}
//发送延时消息
@PostMapping("/deadLetter")
public String deadLetter() {
Message<RabbitMQ> message = MessageBuilder.withPayload(new RabbitMQ("DEV_MESSAGE_TOPIC", System.currentTimeMillis()))
//.setExpirationDate(5000L) yml也可以配置取最大值
.build();
streamBridge.send("deadLetter-out-0", message);
System.out.println("/deadLetter:发送时间" + DateTimeUtils.getDataStr());
return "SUCCESS";
}
}
1.1生产者yml配置
spring:
rabbitmq:
host: localhost
port: 5673
username: rabbitmq
password: 123456
cloud:
stream:
bindings:
#广播分组-集群多台MQ解决重复消费
myGroup-out-0:
destination: my-group-topic
binder: rabbit
deadLetter-out-0:
destination: DEV_MESSAGE_TOPIC
#content-type: application/json #默认为json
binder: rabbit
group: DEAD
producer:
required-groups:
- deadLetter-group
rabbit:
bindings:
deadLetter-out-0:
producer:
#延时队列的延时时间,设置了这个属性[setExpirationDate(11000L)]ttl就会失效
ttl: 10000
#开启死信队列
auto-bind-dlq: true
#死信交换机,原名_DLX
dead-letter-exchange: DEV_MESSAGE_TOPIC_DLX
#死信队列名称
dead-letter-queueName: DEV_MESSAGE_TOPIC_DLX.DEAD
1.1.1生产者yml配置说明
2.消费者
代码如下(示例):
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.Message;
@Configuration
public class MessageConsumers {
private static final Logger log = LoggerFactory.getLogger(MessageConsumers.class);
// 消费分组消息
@Bean
public Consumer<RabbitMQ> myGroup() {
return message -> {
log.info("myGroup接收分组消息:{}", message);
};
}
//延时消息
@Bean
public Consumer<Message<RabbitMQ>> handleTaskDelayed() {
return message -> {
RabbitMQ payload = message.getPayload();
long time = (System.currentTimeMillis() - payload.getSendTime()) / 1000;
System.out.println(payload + ",handleTaskDelayed耗时:" + time);
};
}
}
2.1消费者yml配置
spring:
rabbitmq:
host: localhost
port: 5673
username: rabbitmq
password: 123456
cloud:
function:
definition: handleTaskDelayed;myGroup
stream:
bindings:
#消费方的分组-集群多台MQ解决重复消费
myGroup-in-0:
binder: rabbit
destination: my-group-topic
group: ${spring.application.name}
#处理延迟任务
handleTaskDelayed-in-0:
destination: DEV_MESSAGE_TOPIC_DLX
binder: rabbit
#发送方的分组,要一致否则无法消费
group: DEAD
rabbit:
bindings:
handleTaskDelayed-in-0:
consumer:
exchange-type: direct
2.2.2消费者配置配置说明
3.RabbitMQ客户端以及代码运行实例
图1RabbitMQ交换机
图2MQ队列(是配置的10秒下去被消费,懒得再去截图了)
图3生产者打印
图4消费者打印
总结
以上就是今天要讲的内容,本文仅仅简单介绍了RabbitMQ的使用,近期在学习4.0,国内基本上找不到yml配置的,自己踩了两天坑分享出来,希望对你有所帮助。