RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding组成了消息的路由键;客户端Producer通过连接channel和server进行通信,Consumer从queue获取消息进行消费(长连接,queue有消息会推送到consumer端,consumer循环从输入流读取数据)。rabbitMQ以broker为中心;有消息的确认机制。

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: Pass@1234

 

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); } }

 

posted on 2019-07-11 09:07  colorfulworld  阅读(216)  评论(0编辑  收藏  举报