声明队列时,指定了死信交换器,存在死信时交由死信交换器转发消息存储到死信队列
package com.song.songvue.config.rabbitmq;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class RabbitMQConfig {
// 直连交换器
public static final String SONG_EXCHANGE = "song_exchange";
public static final String SONG_QUEUE = "song_queue";
public static final String ROUTING_KEY = "songKey";
// 创建一个队列, 如果存在死信时则交由死信交换器转存到死信队列
@Bean
public Queue queue() {
Map<String, Object> params = new HashMap<>();
params.put("x-message-ttl", 10000);
params.put("x-dead-letter-exchange", DeadQueueConfig.DEAD_MESSAGE_EXCHANGE);
params.put("x-dead-letter-routing-key", DeadQueueConfig.DEAD_MESSAGE_ROUTING_KEY);
return new Queue(SONG_QUEUE, true, false, false, params);
}
// 创建一个直连交换器
@Bean
DirectExchange directExchange() {
return new DirectExchange(SONG_EXCHANGE);
}
// 绑定
@Bean
Binding binding() {
return BindingBuilder.bind(queue()).to(directExchange()).with(ROUTING_KEY);
}
}
死信交换器: (与一般的交换器没什么区别)
package com.song.songvue.config.rabbitmq;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 死信队列
*/
@Configuration
public class DeadQueueConfig {
public static final String DEAD_MESSAGE_EXCHANGE = "dead_message_exchange";
public static final String DEAD_MESSAGE_QUEUE = "dead_message_queue";
public static final String DEAD_MESSAGE_ROUTING_KEY = "dead_message_routing_key";
// 死信交换器
@Bean
DirectExchange deadMessageExchange() {
return new DirectExchange(DEAD_MESSAGE_EXCHANGE);
}
// 死信队列
@Bean
Queue deadQueue() {
return new Queue(DEAD_MESSAGE_QUEUE);
}
@Bean
Binding deadBind() {
return BindingBuilder.bind(deadQueue()).to(deadMessageExchange()).with(DEAD_MESSAGE_ROUTING_KEY);
}
}