rabbitmq

Posted enhance

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rabbitmq相关的知识,希望对你有一定的参考价值。

1、  pom添加依赖

通用依赖:

        <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>1.5.9.RELEASE</version>

        <relativePath/> <!-- lookup parent from repository -->

</parent>

 

<dependency>

                  <groupId>org.springframework.boot</groupId>

                  <artifactId>spring-boot-starter-amqp</artifactId>

                  <version>1.5.2.RELEASE</version>

          </dependency>

2、  添加rabbitmq服务配置信息

# rabbitmq配置

spring:

    rabbitmq:

      addresses: 172.16.4.201

      username: admin

          password: [email protected]

 

3、  Rabbitmq三种交换机模式:

a)         Direct Exchange

(直连):传递时需要一个Routekey,通过Routkey寻找对应队列;这种模式Exchange不需要绑定(binding)queue

 技术图片

 

例子:

BindingBuilder.bind(queueA()).to(defaultExchange()).with(RabbitConfig.ROUTINGKEY_A);

 

b)         Fanout Exchange

(广播):任何发送到Fanout Exchange的消息都会转发到与该Exchange绑定(bingding)的所有queue上;这种模式不需要routkey

 技术图片

 

 

例子:BindingBuilder.bind(queueA).to(fanoutExchange);

       

c)         Topic Exchange

可以理解为direct exchange+fanout exchange;任何发送到Exchange的消息都会被转发所有关心Routekey中所指定的queue上;

需要指定routekey;exchange需要绑定(binding)queue;

模糊匹配:#表示0个或若干个关键字, “”表示一个关键字。如log.”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。

 技术图片

 

例子:BindingBuilder.bind(queueA()).to(defaultExchange()).with(RabbitConfig.ROUTINGKEY_A);

 

 

Rabbitmq消费者是按照广播消费还是集群消费完全是看发送者的exchange的。如下例子中:

①RabbitmqConfig类:

//定义一个名字为Abc类型为FanoutExchange的交换机
   @Bean
    FanoutExchange Abc() 

        // 定义一个名为fanoutExchange的fanout交换器

        return new FanoutExchange("Abc");

    

//交换机绑定三个队列fanoutA()、fanoutB()、fanoutC()
    @Bean
    public Binding bindingExchangeWithA() 
        return BindingBuilder.bind(fanoutA()).to(fanoutExchange());
    

    /**
     * 将定义的fanoutB队列与fanoutExchange交换机绑定
     * @return
     */
    @Bean
    public Binding bindingExchangeWithB() 
        return BindingBuilder.bind(fanoutB()).to(fanoutExchange());
    

    /**
     * 将定义的fanoutC队列与fanoutExchange交换机绑定
* fanout类型交换机的生产者发送时routkey为空,格式rabbitTemplate.convertAndSend(Exchange,"", content);这样可以将消息发送到在RabbitConfig类中所有绑定的queues上
* direct类型交换机生产者生产者发送时需要routkey,格式:RabbitTemplate.convertAndSend(EXCHANGE, ROUTINGKEY, content);这样之后将消息发送到routkey指定的queue上
*
@return */ @Bean public Binding bindingExchangeWithC() return BindingBuilder.bind(fanoutC()).to(fanoutExchange()); ②生产者代码 public void fanoutSend() Date date = new Date(); String dateString = new SimpleDateFormat("YYYY-mm-DD hh:MM:ss").format(date); System.out.println("[fanout] send msg:" + dateString); // 注意 第一个参数是我们交换机的名称 ,第二个参数是routerKey 我们不用管空着就可以,第三个是你要发送的消息 this.rabbitTemplate.convertAndSend("Abc", "", dateString); //这里通过交换机名称确定发送消息时何种类型的。本例子中是Abc对应到RabbitConfig中Abc是广播类型,fanout交换机类型生产者无需routkey ③消费端代码 @Component @RabbitListener(queues = "fanout.a") //消费端通过queue名字找到对应绑定的交换机,然后判断是何种类型消费 public class FanoutAConsumer @Autowired private AmqpTemplate rabbitmqTemplate; /** * 消息消费 * @RabbitHandler 代表此方法为接受到消息后的处理方法 */ @RabbitHandler public void recieved(String msg) System.out.println("[fanout.a] recieved message:" + msg); @Component @RabbitListener(queues = "fanout.b") public class FanoutBConsumer @Autowired private AmqpTemplate rabbitmqTemplate; /** * 消息消费 * @RabbitHandler 代表此方法为接受到消息后的处理方法 */ @RabbitHandler public void recieved(String msg) System.out.println("[fanout.b] recieved message:" + msg);

 

以上是关于rabbitmq的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQRabbitMQ和Erlang下载与安装步骤—2023超详细最新版

Springboot 整合 RabbitMQrabbitmq介绍:安装,下载,创建队列交换机,5种工作模式

RabbitMQ

RabbitMQ安装

day11

RabbitMQ消息中间件