订阅逻辑简述
- 服务首先要绑定交换机,交换机绑定队列
- 这里使用主题模式,交换机绑定2个队列,生产者把消息发送给交换机,交换机根据路由key,确定将消息发送给那个队列
- 消费者订阅交换机,并绑定队列,即可接收到生产者的消息
队列结构图
发送和回信逻辑图
代码逻辑
将消息发送给交换机1
@Component
public class Producer {
@Autowired
RabbitTemplate rabbitTemplate;
public void sendMqHua(Object msg){
rabbitTemplate.convertAndSend(Def.EXCHANGE, Def.ROUTE_KEY_HUA, msg);
}
}
收到消息回信给交换机2
@Component
public class ConsumerHua {
@Autowired
RabbitTemplate rabbitTemplate;
/**
* 接收到消息,回信到ROUTE_KEY_HUA
* @param message
*/
@RabbitHandler
@RabbitListener(bindings = {
@QueueBinding(value = @Queue(value = Def.LEARN_QUEUE_HUA, durable = "true"),
exchange = @Exchange(value = Def.EXCHANGE, type = "topic"),
key = Def.ROUTE_KEY_HUA)
})
public void listenCt(String message) {
/*
订阅hua的消息队列,收到ct的消息,再发一条消息到ct_recive的队列
CT收到消息,回信会写到ct_recive的队列
*/
rabbitTemplate.convertAndSend(Def.EXCHANGE2, Def.ROUTE_KEY_CT_RECEIVE, "HUA接收到消息了!");
}
/**
* CT收到消息会回信给HUA_RECEIVE,这里绑定交换机2,和队列HUA_RECEIVE
* 接收 CT回信
* @param message
*/
@RabbitHandler
@RabbitListener(bindings = {
@QueueBinding(value = @Queue(value = Def.LEARN_QUEUE_HUA_RECEIVE, durable = "true"),
exchange = @Exchange(value = Def.EXCHANGE2, type = "topic"),
key = Def.ROUTE_KEY_HUA_RECEIVE)
})
public void listenHua(String message) {
// 这里是确认收到消息
System.out.println( "CT [x] Received '" + message + "'" + "HUHUA7877777777777777777777");
}
}