网上写的乱起八糟的,懒张受不了简单版本:
这里提一嘴需要插件 https://blog.csdn.net/weixin_49390750/article/details/124377789 往期有写
1、导包
<!--消息队列-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
2、配置
spring:
cloud:
stream:
binders:
yshop-rabbit-binder:
type: rabbit
environment:
spring:
rabbitmq:
host: rabbitmq
port: 5672
username: guest
password: guest
virtual-host: /
function:
definition: myDelayed #如果有多个定义的话就需要用;隔开
bindings:
# 延迟消息
myDelayed-in-0: # 消费者绑定名称,myDelayed是自定义的绑定名称,in代表消费者,0是固定写法
destination: my-delayed-topic # 对应的真实的 RabbitMQ Exchange
# binder: yshop-rabbit-binder 指定用什么去发送spring:cloud:stream:binders:yshop-rabbit-binder:
myDelayed-out-0: # 生产者绑定名称,myDelayed是自定义的绑定名称,out代表生产者,0是固定写法
destination: my-delayed-topic # 对应的真实的 RabbitMQ Exchange
# binder: yshop-rabbit-binder 指定用什么去发送spring:cloud:stream:binders:yshop-rabbit-binder:
rabbit:
bindings:
myDelayed-in-0:
consumer:
delayedExchange: true # 开启延迟功能
myDelayed-out-0:
producer:
delayedExchange: true # 开启延迟功能
3、发送
package com.zhk.consumer.test;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/")
@Slf4j
public class TestController {
@Resource
private StreamBridge streamBridge;
@RequestMapping("/")
public String test1(){
String tt = "延迟队列的消息内容";
streamBridge.send("myDelayed-out-0", MessageBuilder.withPayload(tt)
.setHeader("x-delay", 8 * 1000)
.build());
log.info("发送延迟消息成功");
return "成功";
}
}
3、监听
package com.zhk.consumer.test;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.function.Consumer;
@Configuration
@Slf4j
@EnableRabbit
public class MessageListenerConfig {
// 消费延迟消息
@Bean
public Consumer<String> myDelayed() { // 方法名必须与生产消息时自定义的绑定名称一致
return tt -> {
log.info("接收延迟消息:{}", tt);
};
}
}