yml配置类
# 应用名称
spring:
application:
name: springboot-rabbitmq-demo
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
config 配置类
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class TtlDealQueueConfig {
//正常的延迟交换机
private static final String TTL_NORMAL_EXCHANGE = "ttl_test_exchange";
//routingKey
private static final String TTL_TEST_ROUTING_KEY = "ttl_test_routing_key";
// 死信队列交换机
private static final String DEAD_TEST_EXCHANGE = "dead_test_exchange";
// //routingKey
private static final String DEAD_TEST_ROUTING_KEY = "dead_test_routing_key";
//延迟队列名称
private static final String TTL_TEST_QUEUE = "ttl_test_queue";
//死信队列名称
private static final String DEAD_TEST_QUEUE = "dead_test_queue";
@Bean("ttlTestExchange")
public DirectExchange ttlTestExchange() {
return new DirectExchange(TTL_NORMAL_EXCHANGE);
}
@Bean("deadTestExchange")
public DirectExchange deadTestExchange() {
return new DirectExchange(DEAD_TEST_EXCHANGE);
}
@Bean("ttlTestQueue")
public Queue ttlTestQueue() {
Map<String, Object> map = new HashMap<>();
map.put("x-dead-letter-exchange", DEAD_TEST_EXCHANGE);
map.put("x-dead-letter-routing-key", DEAD_TEST_ROUTING_KEY);
return QueueBuilder.durable(TTL_TEST_QUEUE).withArguments(map).build();
}
@Bean("deadTestQueue")
public Queue deadTestQueue() {
return QueueBuilder.durable(DEAD_TEST_QUEUE).build();
}
//绑定队列交换机
@Bean
public Binding queueBindingTtl(@Qualifier("ttlTestQueue") Queue ttlTestQueue,
@Qualifier("ttlTestExchange") DirectExchange ttlTestExchange) {
return BindingBuilder.bind(ttlTestQueue).to(ttlTestExchange).with(TTL_TEST_ROUTING_KEY);
}
@Bean
public Binding queueBindingDead(@Qualifier("deadTestQueue") Queue deadTestQueue,
@Qualifier("deadTestExchange") DirectExchange deadTestExchange) {
return BindingBuilder.bind(deadTestQueue).to(deadTestExchange).with(DEAD_TEST_ROUTING_KEY);
}
}
生产者
import java.lang.annotation.Target;
import java.util.Date;
@Slf4j
@RestController
@RequestMapping("/ttl")
public class ProducerContrller {
@Autowired
private RabbitTemplate rabbitTemplate;
@GetMapping("/sendMsg/{message}/{ttlTime}")
public void sendMsg(@PathVariable String message,@PathVariable String ttlTime){
log.info("当前时间:{},发送一条消息给ttl队列:{},ttl时长:{}ms", new Date().toInstant(), message,ttlTime);
rabbitTemplate.convertAndSend("ttl_test_exchange", "ttl_test_routing_key", message, msg -> {
msg.getMessageProperties().setExpiration(ttlTime);
return msg;
});
};
}
消费者
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.util.Date;
@Slf4j
@Component
public class DeadConsumer {
@RabbitListener(queues = "dead_test_queue")
public void receiveDeadMsg(Message message, Channel channel) throws Exception {
String msg = message.getBody().toString();
log.info("当前时间:{},收到的死信消息",new Date().toInstant() ,msg);
}
}