/**
* 监听者 监听延时消息
*/
@Slf4j
@Component
public class MessageListener {
@Resource
private OrderReturnService returnService;
@RabbitListener(queues = RabbitMqConfig.ORDER_CANCEL_DEAD_QUEUE1)
@Transactional
public void listenerDeadLetter1(String orderId){
returnService.cancelOrderReturn(orderId, 2);
log.info("监听到 =======>>>>> {} 申请7天后商家未处理,则自动同意", orderId);
}
}
/**
* 消息队列相关配置
*/
@Configuration
public class RabbitMqConfig {
//需要改延迟时间 改该参数即可 1000*60为60s延迟 以此类推
private static int ORDER_CANCEL_TIME1 = 1000*60*60*24*7;
public static String ORDER_CANCEL_DELAY_ROUTINGKEY1 = "orderCancelRoutingkey1";
public static String ORDER_CANCEL_DEAD_ROUKEY1 = "orderCancelDeadRoukey1";
public static final String ORDER_CANCEL_DELAY_QUEUE1 = "orderCancelDelayQueue1";
public static final String ORDER_CANCEL_DELAY_EXCHANGE1 = "delayExchange1";
public static final String ORDER_CANCEL_DEAD_QUEUE1 = "deadLetterQueue11";
public static final String ORDER_CANCEL_DEAD_EXCHANGE1 = "orderCancelDeadLetterExchange1";
// 声明延时Exchange
@Bean(ORDER_CANCEL_DELAY_EXCHANGE1)
public DirectExchange delayExchange1(){
return new DirectExchange(ORDER_CANCEL_DELAY_EXCHANGE1);
}
// 声明死信Exchange
@Bean(ORDER_CANCEL_DEAD_EXCHANGE1)
public DirectExchange deadLetterExchange1(){
return new DirectExchange(ORDER_CANCEL_DEAD_EXCHANGE1);
}
// 声明延时队列A 延时7天 1000*60为60s 再*60为一小时 再*24*7为7天
// 并绑定到对应的死信交换机
@Bean(ORDER_CANCEL_DELAY_QUEUE1)
public Queue delayQueue11(){
Map<String, Object> args = new HashMap<>(3);
// x-dead-letter-exchange 这里声明当前队列绑定的死信交换机
args.put("x-dead-letter-exchange", ORDER_CANCEL_DEAD_EXCHANGE1);
// x-dead-letter-routing-key 这里声明当前队列的死信路由key
args.put("x-dead-letter-routing-key", ORDER_CANCEL_DEAD_ROUKEY1);
// x-message-ttl 声明队列的TTL
args.put("x-message-ttl", ORDER_CANCEL_TIME1);
return QueueBuilder.durable(ORDER_CANCEL_DELAY_QUEUE1).withArguments(args).build();
}
// 声明死信队列 用于接收延时60s处理的消息
@Bean(ORDER_CANCEL_DEAD_QUEUE1)
public Queue deadLetterQueueB1(){
return new Queue(ORDER_CANCEL_DEAD_QUEUE1);
}
// 声明延时队列 绑定关系
@Bean
public Binding delayBindingA1(@Qualifier(ORDER_CANCEL_DELAY_QUEUE1) Queue queue,
@Qualifier(ORDER_CANCEL_DELAY_EXCHANGE1) DirectExchange exchange){
return BindingBuilder.bind(queue).to(exchange).with(ORDER_CANCEL_DELAY_ROUTINGKEY1);
}
// 声明死信队列 绑定关系
@Bean
public Binding deadLetterBindingA1(@Qualifier(ORDER_CANCEL_DEAD_QUEUE1) Queue queue,
@Qualifier(ORDER_CANCEL_DEAD_EXCHANGE1) DirectExchange exchange){
return BindingBuilder.bind(queue).to(exchange).with(ORDER_CANCEL_DEAD_ROUKEY1);
}
}
/*
* 代码块 需要执行延迟的消息
*/
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
@RestController
public class TestController{
@Autowired
private RabbitTemplate rabbitTemplate;
@GetMapping(value = "/test/{orderId}")
public void test(@PathVariable("id")String orderId) {
System.out.println("订单"+orderId+"开始进入队列,时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
rabbitTemplate.convertAndSend(RabbitMqConfig.ORDER_CANCEL_DELAY_EXCHANGE1, RabbitMqConfig.ORDER_CANCEL_DELAY_ROUTINGKEY1, id);
}
}
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>2.1.3.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>spring-tx</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-expression</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>