消息队列是一种用于程序间异步通信的数据结构,可以在多线程,分布式系统中进行消息传递。实现消息队列超时关闭的方式可以采用“TTL(Time-To-Live)”,即设定消息的存活时间。对于每个消息,都设置一个生命周期,在此周期过后,消息将会自动从队列中移除。这样可以避免因处理速度慢或错误导致的消息累积。另一种方法是使用延迟队列,即将消息设定在特定延迟后才能被消费。若达到设定的最大等待时间,则关闭消息。这两种方法能有效实现消息队列的超时关闭。使用依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
<version>3.0.3.RELEASE</version>
</dependency>
配置生产者、消费者
public interface MQConfig {
/**
* 1. 发送超时通知
*/
String ORDER_TIMEOUT = "orderTimeout";
@Output(ORDER_TIMEOUT)
MessageChannel orderTimeout();
/**
* 2. 进入死性队列,进行消费
*/
String ORDER_TIMEOUT_DLQ_IN = "orderTimeout_dlq_in";
@Input(ORDER_TIMEOUT_DLQ_IN)
SubscribableChannel orderTimeoutDlqIn();
/**
* 3. 转发到超市关闭消费队列
*/
String ORDER_CLOSE_OUT = "order_close_out";
@Output(ORDER_CLOSE_OUT)
MessageChannel orderCloseOut();
/**
* 4. 消费关闭消息
*/
String ORDER_CLOSE_IN = "order_close_in";
@Input(ORDER_CLOSE_IN)
SubscribableChannel orderTimeoutClose();
}
配置路由器
@Slf4j
@Component
public class MQListener {
@StreamListener(MQConfig.ORDER_TIMEOUT_DLQ_IN)
@SendTo(MQConfig.ORDER_CLOSE_OUT)
public String timeoutDelayHour(String orderMsg) {
log.info("触发订单关闭 {}", orderMsg);
return orderMsg;
}
@StreamListener(MQConfig.ORDER_CLOSE_IN)
public void orderTimeoutClose(@Payload String orderNo) {
log.info("订单超时关闭:{}", orderNo);
}
}