欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java RabbitMQ的三種Exchange模式

 更新時(shí)間:2022年08月18日 09:26:48   作者:劍圣無(wú)痕???????  
這篇文章主要介紹了Java RabbitMQ的三種Exchange模式,分別為Direct模式、Fanout模式、Topic模式,Rabbit的Direct Exchange模式是指消息發(fā)送導(dǎo)RouteKey中指定的Queue,Direct模式可以使用Rabbit自帶的Exchange

前言:

上一章講解RabbitMq的相關(guān)知識(shí)和如何使用Spring Boot集成Rabbitmq發(fā)送消息,本文將講解RabbitMQ三種Exchange模式。

簡(jiǎn)介

RabbitMQ的Exchange通常有三種模式分別為:Direct模式、Fanout模式、Topic模式。

Direct模式

Rabbit的Direct Exchange模式是指消息發(fā)送導(dǎo)RouteKey中指定的Queue,Direct模式可以使用Rabbit自帶的Exchange,所以不需要將Exchange進(jìn)行任何綁定。消息傳遞時(shí),RouteKey必須完全匹配,消息才會(huì)被隊(duì)列接收,否則消息將會(huì)被拋棄。

原理如下圖:

示例代碼:

可以參考上一章的示例代碼,本文就不在重復(fù)闡述。

Fanout Exchange

Fanout Exchange 模式不處理路由鍵,只需要簡(jiǎn)單的將隊(duì)列綁定到交換機(jī)上發(fā)送到交換機(jī)的消息都會(huì)被轉(zhuǎn)發(fā)到與該交換機(jī)綁定的所有隊(duì)列上。因此Fanout交換機(jī)轉(zhuǎn)發(fā)消息是最快的。

原理如下圖:

示例代碼

配置類(lèi)

@Configuration
public class RabbmitFanoutConfig
{
    private final static String FANOUT_QUEUE_1 = "fanoutQueue1"; //隊(duì)列名稱(chēng)1
    private final static String EXCHANGE_NAME = "fanoutExchange"; //交換器名稱(chēng)

    @Bean
    public Queue queue1() {
        return new Queue(FANOUT_QUEUE_1);
    }

    @Bean
    public FanoutExchange fanoutExchange() {
        return new FanoutExchange(EXCHANGE_NAME);
    }

    @Bean
    public Binding bindingExchange1() {
        return BindingBuilder.bind(queue1()).to(fanoutExchange());
    }
}

生產(chǎn)者

@Component
public class FanOutMqProduce
{
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendMessage(String message)
    {
        rabbitTemplate.convertAndSend("fanoutExchange",null,message);

    }
}

說(shuō)明:convertAndSend 第一個(gè)參數(shù)為Exchange的名稱(chēng),第二參數(shù)為routekey的名稱(chēng),由于Fanout不需要通過(guò)Routekey來(lái)綁定所以參數(shù)為空。

消費(fèi)者

@Component
@RabbitListener(queues = "fanoutQueue1")
public class FanOutMqConsumer
{
    private static final Logger logger = LoggerFactory.getLogger(FanOutMqConsumer.class);

    @RabbitHandler
    public void receive(String message) 
    {
        logger.info("receive message content:{}",message);
    }
}

說(shuō)明:監(jiān)聽(tīng)隊(duì)列的名稱(chēng)與配置的隊(duì)列名稱(chēng)一致。

測(cè)試代碼

  @RequestMapping("/sendFanOutMessage")
    public String sendFanOutMessage()
    {
        fanOutMqProduce.sendMessage("this is fanout message");
        return "success";
    }

運(yùn)行結(jié)果:

c.s.f.r.consumer.FanOutMqConsumer - receive message content:this is fanout message

Topic模式

Topic模式是通過(guò)Routing Key來(lái)進(jìn)行通配符匹配。

  • 符號(hào)#代表可以匹配一個(gè)或多個(gè)詞
  • 符號(hào)*代表只能匹配一個(gè)詞

原理如下圖:

說(shuō)明:例如:usa.#能夠匹配導(dǎo)usa.news.huofu,而europe.*只能匹配europe.news或者europe.weather

示例代碼

配置類(lèi)

@Configuration
public class RabbmitTopicConfig
{
    private final static String TOPIC_QUEUE_A = "topic.QueueA"; //隊(duì)列名稱(chēng)A
    private final static String TOPIC_QUEUE_B = "topic.QueueB"; //隊(duì)列名稱(chēng)B
    private final static String EXCHANGE_NAME = "topicExchange"; //交換器名稱(chēng)


    @Bean
    public Queue queueA() {
        return new Queue(TOPIC_QUEUE_A);
    }

    @Bean
    public Queue queueB() {
        return new Queue(TOPIC_QUEUE_B);
    }

    @Bean
    public TopicExchange topicExchange() {
        return new TopicExchange(EXCHANGE_NAME);
    }

    /**
     *
     * @return
     */
    @Bean
    public Binding bindingExchangeA() {
        return BindingBuilder.bind(queueA()).to(topicExchange()).with("topic.QueueA");
    }

    @Bean
    public Binding bindingExchange() {
        return BindingBuilder.bind(queueB()).to(topicExchange()).with("topic.#");
    }
}

消息發(fā)送者

@Component
public class TopicMqProduce
{
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendMessage(String message,String routeKey)
    {
        rabbitTemplate.convertAndSend("topicExchange",routeKey,message);

    }
}

消息接收者

#監(jiān)聽(tīng)A隊(duì)列
@Component
@RabbitListener(queues = "topic.QueueA")
public class TopicMqConsumerA
{
    private static final Logger logger = LoggerFactory.getLogger(TopicMqConsumerA.class);
    @RabbitHandler
    public void receive(String message) 
    {
        logger.info("receive topic QueueA message content:{}",message);
    }
}

#監(jiān)聽(tīng)B隊(duì)列
@Component
@RabbitListener(queues = "topic.QueueB")
public class TopicMqConsumerB
{
    private static final Logger logger = LoggerFactory.getLogger(TopicMqConsumerB.class);

    @RabbitHandler
    public void receive(String message) 
    {
        logger.info("receive topic QueueB message content:{}",message);
    }
}

測(cè)試代碼

#測(cè)試只發(fā)送A隊(duì)列
 @RequestMapping("/sendTopicMessageA")
    public String sendTopicMessageA()
    {
        topicMqProduce.sendMessage("topic.QueueA","this is fanout message");
        return "success";
    }

    @RequestMapping("/sendTopicMessageB")
    public String sendTopicMessageB()
    {
        topicMqProduce.sendMessage("topic.QueueB","this is fanout message");
        return "success";
    }

總結(jié)

到此這篇關(guān)于Java RabbitMQ的三種Exchange模式的文章就介紹到這了,更多相關(guān) Java Exchange模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論