rabbitmq简单示例

1.pom文件引入rabbitmq

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

2.配置连接参数 

Exchange的四种类型 :fanout、direct、topic、headers

         1.fanout 类型:类似于广播,群发。接收到的消息,会分发给所有绑定的队列。如下图所示,每个队列都会得到全部得消息。

        2.direct 类型:消息生产者投递消息到 Exchange 时,给出两个信息:一个是消息本体,一个是消息的路由键(RoutingKey)。类似与我们电子邮件时,邮件的内容(消息本体)和接收人的邮件地址(路由键)。队列和和 Exchange 绑定时,需要指定一个绑定键(BindingKey)关联。当Exchange投递消息时,会把消息投递到绑定键和路由键相等的队列里。

        3.topic 类型:消息生产者投递消息到 Exchange 时,给出两个信息:一个是消息本体,一个是消息的路由键(RoutingKey)。路由键可以使用 “.” 字符做为分割符,如:cn.beijing.tongzhou。此时路由键可以理解为按 “.”分割的单词cn、beijing、tongzhou,同时这个绑定键还可以使用 “” 做单个单词的模糊匹配;用“#”做多个单词的模糊匹配。

        例如cn.beijing. 绑定键的队列接收路由键cn.beijing.tongzhou、cn.beijing.chaoyang 等等以cn.beijing. 开头,后面跟任何字符串做路由键(不含“.”)的消息。
cn.# 绑定键的队列接收路由键 cn.beijing.tongzhou、cn.beijing cn.beijing.changyang.wangjing 等等以 cn. 开头,后面跟任何字符串做路由键(包含“.”)的消息。

        4.headers类型:消息生产者发送消息时,指定headers(键对值形式),队列和 Exchange 绑定时指定headers的匹配形式;

        匹配规则x-match有下列两种类型:

  • x-match = all   :表示所有的键值对都匹配才能接受到消息

  • x-match = any :表示只要有键值对匹配就能接受到消息

代码实现direct类型

        首先添加一个配置类文件:配置类里的代码如下:绑定交换机和队列和路由key

package com.springboot.rabbitmq.demo.config;
 
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class RabbitmqDirectConfig {
 
    public static final String QUEUE_NAME = "QUEUE_DEMO_DIRECT";
 
    public static final String EXCHANGE_NAME = "direct_exchange";
 
    public static final String ROUTING_KEY = "ROUTING_KEY_01";
 
    @Bean("bootDirectExchange")
    public Exchange bootDirectExchange(){
        return ExchangeBuilder.directExchange(EXCHANGE_NAME).durable(true).build();
    }
 
    @Bean("bootDirectQueue")
    public Queue bootDirectQueue(){
        return QueueBuilder.durable(QUEUE_NAME).build();
    }
 
    @Bean
    public Binding bindDirectQueueExchange(@Qualifier("bootDirectQueue") Queue queue, @Qualifier("bootDirectExchange") Exchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY).noargs();
    }
 
}

        创建一个消费类,监听队列:


package com.rabbitmq.demo.consumer;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
 
 
@Component
public class RabbitmqListener {
 
  private Logger logger= LoggerFactory.getLogger(RabbitmqListener.class);
 
 
    @RabbitListener(queues = "QUEUE_DEMO_DIRECT")
    public void ListenerQueue01(Message message){
        System.out.println("mess===="+message);
        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), 
    message);
    }
}

        启动启动类后监听生效,使用测试类实现代码发送测试。测试类,发送消息到交换机,交换机绑定的队列就能收到消息进行消费消息:

package com.rabbitmq.demo;
 
import com.rabbitmq.demo.config.RabbitmqDirectConfig;
import com.rabbitmq.demo.config.RabbitmqFanoutConfig;
import com.rabbitmq.demo.config.RabbitmqTopicConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
 
@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
 
    @Autowired
    private RabbitTemplate rabbitTemplate;
 
    @Test
    public void DirectExchange() {
        rabbitTemplate.convertAndSend(RabbitmqDirectConfig.EXCHANGE_NAME,RabbitmqDirectConfig.ROUTING_KEY,"boot mq hello Direct");
    }
}

运行结果如下

 

 代码实现Topic类型

配置类

package com.springboot.rabbitmq.demo.config;
 
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class RabbitmqTopicConfig {
    private static final String QUEUE_NAME="QUEUE_DEMO_TOPIC";
    public static final String EXCHANGE_NAME="topic_exchange";
 
 
    @Bean("bootTopicExchange")
    public Exchange bootTopicExchange(){
        return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build();
    }
 
    @Bean("bootTopicQueue")
    public Queue bootTopicQueue(){
        return QueueBuilder.durable(QUEUE_NAME).build();
    }
 
    @Bean
    public Binding bindTopicQueueExchange(@Qualifier("bootTopicQueue") Queue queue, @Qualifier("bootTopicExchange") Exchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("boot.#").noargs();
    } 
}

        消费者,监听器

@RabbitListener(queues = "QUEUE_DEMO_TOPIC")
    public void ListenerQueue2(Message message){
        System.out.println("mess===="+message);
        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), 
     message);
    }

           生产者,发送消息

 @Test
   public void TopicExchange() {
        rabbitTemplate.convertAndSend(RabbitmqTopicConfig.EXCHANGE_NAME,"boot.haha","boot 
      mq hello Topic");
    }

 代码实现fanout类型

配置类

package com.springboot.rabbitmq.demo.config;
 
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class RabbitmqTopicConfig {
    private static final String QUEUE_NAME="QUEUE_DEMO_TOPIC";
    public static final String EXCHANGE_NAME="topic_exchange";
 
 
    @Bean("bootTopicExchange")
    public Exchange bootTopicExchange(){
        return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build();
    }
 
    @Bean("bootTopicQueue")
    public Queue bootTopicQueue(){
        return QueueBuilder.durable(QUEUE_NAME).build();
    }
 
    @Bean
    public Binding bindTopicQueueExchange(@Qualifier("bootTopicQueue") Queue queue, @Qualifier("bootTopicExchange") Exchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("boot.#").noargs();
    }
}

        消费者,监听器

 @RabbitListener(queues = "QUEUE_DEMO_FANOUT_A")
    public void ListenerQueueA(Message message){
        System.out.println("QUEUE_DEMO_FANOUT_A======="+message);
        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
    }
    @RabbitListener(queues = "QUEUE_DEMO_FANOUT_B")
    public void ListenerQueueB(Message message){
        System.out.println("QUEUE_DEMO_FANOUT_B======="+message);
        logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
    }

           生产者,发送消息

 @Test
    public void FanoutExchange(){
        for(int i=0;i<4;i++){
            rabbitTemplate.convertAndSend(RabbitmqFanoutConfig.EXCHANGE_NAME,"",i+"===boot mq 
          hello Fanout");
        }
 
    }

rabbitMq测试demo样例完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值