创建一个交换机 两个队列 ,并设置根据不同的路由key向不同的消息队列发送消息
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
@Configuration
public class DeadLetterMqConfig {
public static final String exchange_dead = "exchange.dead";
public static final String routing_dead_1 = "routing.dead.1";
public static final String routing_dead_2 = "routing.dead.2";
public static final String queue_dead_1 = "queue.dead.1";
public static final String queue_dead_2 = "queue.dead.2";
@Bean
public DirectExchange exchange(){
return new DirectExchange(exchange_dead,true,false);
}
@Bean
public Queue queue1(){
HashMap<String, Object> map = new HashMap<>();
map.put("x-dead-letter-exchange",exchange_dead);
map.put("x-dead-letter-routing-key",routing_dead_2);
map.put("x-message-ttl",10000);
return new Queue(queue_dead_1,true,false,false,map);
}
@Bean
public Binding binding1(){
return BindingBuilder.bind(queue1()).to(exchange()).with(routing_dead_1);
}
@Bean
public Queue queue2(){
return new Queue(queue_dead_2,true,false,false);
}
@Bean
public Binding binding2(){
return BindingBuilder.bind(queue2()).to(exchange()).with(routing_dead_2);
}
一个交换机一个消息队列 一个绑定关系
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
@Configuration
public class DelayedMqConfig {
public static final String exchange_delay = "exchange.delay";
public static final String routing_delay = "routing.delay";
public static final String queue_delay_1 = "queue.delay.1";
@Bean
public CustomExchange delayExchange(){
HashMap<String, Object> map = new HashMap<>();
map.put("x-delayed-type","direct");
return new CustomExchange(exchange_delay,"x-delayed-message",true,false,map);
}
@Bean
public Queue delayQueue(){
return new Queue(queue_delay_1,true,false,false);
}
@Bean
public Binding delayBinding(){
return BindingBuilder.bind(delayQueue()).to(delayExchange()).with(routing_delay).noargs();
}
}
消息监听和消息确认
@Component
public class ConfirmReceiver {
@SneakyThrows
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "queue.confirm",durable = "true",autoDelete = "false"),
exchange = @Exchange(value = "exchange.confirm"),
key = {"routing.confirm"}
))
public void getMsg(String msg, Message message, Channel channel){
System.out.println("接收到的消息:"+msg);
System.out.println("接收到的消息 message.getBody() :"+new String(message.getBody()));
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
}
@SneakyThrows
@RabbitListener(queues = DeadLetterMqConfig.queue_dead_2)
public void queue2(String msg,Message message,Channel channel){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("接收到的消息:\t"+msg);
System.out.println("接收到的时间:\t"+simpleDateFormat.format(new Date()));
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
}
@SneakyThrows
@RabbitListener(queues = DelayedMqConfig.queue_delay_1)
public void queue3(String msg,Message message,Channel channel){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("接收到的消息:\t"+msg);
System.out.println("接收到的时间:\t"+simpleDateFormat.format(new Date()));
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
}
}
消息确认的配置
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class MQProducerAckConfig implements RabbitTemplate.ReturnCallback, RabbitTemplate.ConfirmCallback {
@Autowired
private RabbitTemplate rabbitTemplate;
@PostConstruct
public void init(){
rabbitTemplate.setReturnCallback(this);
rabbitTemplate.setConfirmCallback(this);
}
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
if (ack){
System.out.println("发送成功....");
}else {
System.out.println("发送失败....");
}
}
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
System.out.println("消息主体: " + new String(message.getBody()));
System.out.println("应答码: " + replyCode);
System.out.println("描述:" + replyText);
System.out.println("消息使用的交换器 exchange : " + exchange);
System.out.println("消息使用的路由键 routing : " + routingKey);
}
}
向消息队列发送消息
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class RabbitService {
@Autowired
private RabbitTemplate rabbitTemplate;
public Boolean sendMessage(String exchange, String routingKey, Object message){
this.rabbitTemplate.convertAndSend(exchange,routingKey,message);
return true;
}
}