問題:如下圖,可以看到,監聽隊列的消費者會從隊列中獲得消息。比如隊列中共有5條消息,這兩個監聽隊列的消費者會從隊列中共獲得共5條消息。C1監聽到3條消息,C2監聽到2條消息;或者C1監聽到4條消息,C2監聽到1條消息...
如果我想每個消費者都能監聽到隊列中的全部消息呢?可以利用發佈訂閱模式
1、發佈訂閱模式配置
a、聲明隊列
b、聲明交換機,交換機爲fanout類型,工作隊列及簡單隊列的交換機默認爲direct類型
c、隊列與交換機進行綁定
@Configuration
public class PublishMqConfig {
@Bean(name="Amessage")
public Queue AMessage() {
return new Queue("fanout.A");
}
@Bean(name="Bmessage")
public Queue BMessage() {
return new Queue("fanout.B");
}
@Bean(name="Cmessage")
public Queue CMessage() {
return new Queue("fanout.C");
}
@Bean
FanoutExchange fanoutExchange() {
return new FanoutExchange("fanoutExchange");//配置廣播路由器
}
@Bean
Binding bindingExchangeA(@Qualifier("Amessage") Queue AMessage, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(AMessage).to(fanoutExchange);
}
@Bean
Binding bindingExchangeB(@Qualifier("Bmessage") Queue BMessage, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(BMessage).to(fanoutExchange);
}
@Bean
Binding bindingExchangeC(@Qualifier("Cmessage") Queue CMessage, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(CMessage).to(fanoutExchange);
}
}
2、生產者
@Controller
@RequestMapping("fanout")
public class Sender {
private Logger logger= LoggerFactory.getLogger(Sender.class);
@Autowired
private AmqpTemplate rabbitTemplate;
@RequestMapping("/sendMessage")
public void sendMessage() {
logger.info("調用接口sendMessage");
rabbitTemplate.convertAndSend("fanoutExchange", "", "11111");
}
}
3、消費者
@Component
public class Receiver {
@RabbitListener(queues="fanout.A")
public void processA(String str1) {
System.out.println("ReceiveA:"+str1);
}
@RabbitListener(queues="fanout.B")
public void processB(String str) {
System.out.println("ReceiveB:"+str);
}
@RabbitListener(queues="fanout.C")
public void processC(String str) {
System.out.println("ReceiveC:"+str);
}
}
測試: