延迟队列
使用场景


生产者
1.maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit-test</artifactId>
<scope>test</scope>
</dependency>
2.yml配置文件
server:
port: 9004
spring:
rabbitmq:
host: 192.168.56.101
port: 5672
virtual-host: /ems
username: admin
password: admin
3.队列、交换机配置类
/**
* @author xiaozikang
* @date 2020/10/14 20:42
* @Email:xiaozikangwy@163.com
*/
@Configuration
public class RabbitmqConfig {
public static final String TTL_ORDER_EXCHANGE = "ttlOrderExchange";
public static final String DLX_ORDER_EXCHANGE = "dlxOrderExchange";
public static final String TTL_ORDER_QUEUE = "ttlOrderQueue";
public static final String DLX_ORDER_QUEUE = "dlxOrderQueue";
@Bean("ttlOrderExchange")
public Exchange ttlOrderExchange(){
return ExchangeBuilder.topicExchange(TTL_ORDER_EXCHANGE).durable(true).build();
}
@Bean("ttlOrderQueue")
public Queue ttlOrderQueue(){
// 1.正常队列绑定死信交换机
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("x-dead-letter-exchange",DLX_ORDER_EXCHANGE);
// 2.正常队列发送给死信交换机路由key
hashMap.put("x-dead-letter-routing-key","dlx.xiao");
// 3.该队列过期时间
hashMap.put("x-message-ttl",10000);
return QueueBuilder.durable(TTL_ORDER_QUEUE).withArguments(hashMap).build();
}
@Bean("dlxOrderExchange")
public Exchange dlxOrderExchange(){
return ExchangeBuilder.topicExchange(DLX_ORDER_EXCHANGE).durable(true).build();
}
@Bean("dlxOrderQueue")
public Queue dlxOrderQueue(){
return QueueBuilder.durable(DLX_ORDER_QUEUE).build();
}
@Bean("ttlBinding")
public Binding ttlBinding(
@Qualifier("ttlOrderQueue") Queue ttlOrderQueue,
@Qualifier("ttlOrderExchange") Exchange ttlOrderExchange
){
return BindingBuilder.bind(ttlOrderQueue).to(ttlOrderExchange).with("ttl.#").noargs();
}
@Bean("dlxBinding")
public Binding dlxBinding(
@Qualifier("dlxOrderQueue") Queue dlxOrderQueue,
@Qualifier("dlxOrderExchange") Exchange dlxOrderExchange
){
return BindingBuilder.bind(dlxOrderQueue).to(dlxOrderExchange).with("dlx.#").noargs();
}
}
5.发送消息
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootRabbitmqProducerOrderTtlDlxApplicationTests {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void contextLoads() {
rabbitTemplate.convertAndSend(RabbitmqConfig.TTL_ORDER_EXCHANGE,"ttl.xiao","订单编号为1");
}
}
消费者
/**
* @author xiaozikang
* @date 2020/10/14 17:21
* @Email:xiaozikangwy@163.com
*/
@Component
public class Consumer {
// 监听死信队列
@RabbitListener(queues = "dlxOrderQueue")
public void process(String msg, Channel channel, Message message) throws IOException {
long deliveryTag = message.getMessageProperties().getDeliveryTag();
try {
System.out.println("处理业务");
System.out.println("根据订单号查询订单是否支付,如果没有支付回滚库存,否则不处理");
channel.basicAck(deliveryTag,true);
} catch (Exception e) {
channel.basicNack(deliveryTag,true,true);
}
}
}
本文介绍了如何在Spring Boot应用中使用RabbitMQ配置延迟队列和死信交换机。通过配置YAML文件设置RabbitMQ服务器连接,并在代码中创建交换机和队列,将正常队列绑定到死信交换机,设置消息过期时间和死信路由。在测试中发送消息到延迟队列,消费者监听死信队列进行业务处理。
&spm=1001.2101.3001.5002&articleId=109084331&d=1&t=3&u=2dc997374059402f80b91007d7e8fdf4)
569

被折叠的 条评论
为什么被折叠?



