场景:
服务A发布消息,要求多实例部署的服务B都要同时接收到消息
问题:
第一反应想到是利用RabbitMQ的FANOUT Exchange把消息广播到绑定此exchange的队列上
此情况下多实例服务B肯定订阅的是同一队列,由于RabbitMQ特性一条消息只能被同一队列的其中一个消费端消费掉,这就导致了要么实例1上的能接收,要么实例2上能收到,反正是不能同时收到消息,不是我想要的结果
解决:
在网上找到了很多方法都不行
这个问题也困扰我好久,我的做法是:
生产者声明一个FANOUT交换机
消费者声明一个系统产生的随机队列绑定到这个交换机上,然后往交换机发消息,只要绑定到这个交换机上都能收到消息,关键代码如下:
生产者:
@Slf4j
@Component
public class RabbitHelper {
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 广播消息
* @param exchange
* @param message
*/
public void broadcast(String exchange,String message){
rabbitTemplate.convertAndSend(exchange,"",message);
}
}
消费者:
@Slf4j
@Component
public class DownCmdConsumer {
@RabbitListener(bindings = @QueueBinding(
value = @Queue(), //注意这里不要定义队列名称,系统会随机产生
exchange = @Exchange(value = "填写交换机名称",type = ExchangeTypes.FANOUT)
)
)
public void process(String payload) {
log.info("receive:{}",payload)
}
}
效果:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)