rabbitmq學習5-springboot和rabbitmq的發佈訂閱模式

問題:如下圖,可以看到,監聽隊列的消費者會從隊列中獲得消息。比如隊列中共有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);
    }
    
}

測試:

代碼:https://github.com/windyNaruto9833/java-rabbitmq.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章