首页 > 其他分享 >RabbitMQ-笔记

RabbitMQ-笔记

时间:2024-03-18 21:35:33浏览次数:13  
标签:return String 笔记 Queue Bean RabbitMQ msg public

RabbitMQ-笔记

目录

零、资料

一、RabbitMQ 常见的3种模型

1.基本队列
2.工作队列
3.发布订阅(解决前2个模型阅后即焚的问题):Fanout(广播交换机,一对多)、Dircet(直连交换机,一对一)、Topic(主题交换机,模糊匹配)



1.1、基本队列


前提:已经手动在RabbitMQ中创建了用户、虚拟主机、队列 步骤: > 1、添加依赖 > 2、添加配置 > 3、生产者发布消息到队列 > 4、消费者监听消息队列

1、添加依赖

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

2、添加配置

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: zs
    password: root
    virtual-host: itcast

3、生产者发布消息到队列

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void test1(){
        String queueName = "simple.queue";
        String msg = "hello mq";        
        rabbitTemplate.convertAndSend(queueName, msg);
    }

4、消费者监听消息队列

@Component
public class ConsumerListener {

    @RabbitListener(queues = "simple.queue")
    public void listen(String msg) throws InterruptedException{
        System.out.println("消费的消息为:"+msg);
    }
}

1.2、工作队列


前提:已经手动在RabbitMQ中创建了用户、虚拟主机、队列 步骤: > 1、添加依赖 > 2、添加配置 > 3、生产者发布消息到队列 > 4、消费者监听消息队列

1、添加依赖

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

2、添加配置

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: zs
    password: root
    virtual-host: itcast
    listener:
      simple:
        pre-fetch: 1 # 每次只获取1条消息,处理完再拿下一个消息

3、生产者发布消息到队列

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void test1(){
        String queueName = "simple.queue";
        String msg = "hello mq ";        
        for(int i=0;i<10;i++){
          rabbitTemplate.convertAndSend(queueName, msg+i);
        }
    }

4、消费者监听消息队列

@Component
public class ConsumerListener {

    // 消费者1
    @RabbitListener(queues = "simple.queue")
    public void listen1(String msg) throws InterruptedException{
        System.out.println("消费的消息为:"+msg);
    }

    // 消费者2
    @RabbitListener(queues = "simple.queue")
    public void listen2(String msg) throws InterruptedException{
        System.out.println("消费的消息为:"+msg);
    }
}

1.3、发布订阅


交换机类型: > Fanout(广播交换机,一对多) > Dircet(直连交换机,一对一) > Topic(主题交换机,模糊匹配)

1.3.1 Fanout交换机

配置类:

@Configuration
public class FanoutExchangeConfig {

    @Bean
    public FanoutExchange fanoutExchange(){
        String fanoutExchangeName = "itcast.fanout";
        return new FanoutExchange(fanoutExchangeName);
    }

    @Bean
    public Queue fanoutQueue1(){
        return new Queue("fanout.queue1");
    }

    @Bean
    public Binding fanoutBinding1(Queue fanoutQueue1,FanoutExchange fanoutExchange){
        return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
    }

    @Bean
    public Queue fanoutQueue2(){
        return new Queue("fanout.queue2");
    }

    @Bean
    public Binding fanoutBinding2(Queue fanoutQueue2,FanoutExchange fanoutExchange){
        return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);
    }

}

绑定RabbitMQ的监听器:

@Component
public class ConsumerListener3 {

    @RabbitListener(queues = "fanout.queue1")
    public void listen1(String msg){
        System.out.println(msg);
    }

    @RabbitListener(queues = "fanout.queue2")
    public void listen2(String msg){
        System.out.println(msg);
    }
}

问题:SpringBoot集成rabbitMQ后不会自动创建队列?

原因:https://blog.csdn.net/weixin_48841931/article/details/130137092

1.3.2 Dirct交换机

此处以1个交换机,2个队列为例,2个消费者为例。

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: zs
    password: root
    virtual-host: itcast
    listener:
      simple:
        prefetch: 1

配置类:


@Configuration
public class DirectConfig {

    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange("itcast.direct");
    }

    @Bean
    public Queue queue1() {
        return new Queue("direct.queue1");
    }

    @Bean
    public Binding binding1(Queue queue1, DirectExchange directExchange) {
        return BindingBuilder.bind(queue1).to(directExchange).with("key1");
    }


    
    @Bean
    public  Queue queue2(){
        return new Queue("direct.queue2");
    }

    @Bean
    public Binding binding2(Queue queue2,DirectExchange directExchange){
        return BindingBuilder.bind(queue2).to(directExchange).with("key2");
    }

}

监听器(消费者):


@Component
public class ConsumerListener4 {

    // 消费者1 接收到消息后的处理方法
    @RabbitListener(bindings =@QueueBinding(
            value = @Queue(name = "direct.quque1"),
            exchange = @Exchange(name="itcast.direct",type = ExchangeTypes.DIRECT),
            key="key1"
    ))
    public void listen1(String msg) {
        System.out.println("key1   "+msg);
    }

    // 消费者2 接收到消息后的处理方法
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("direct.queue2"),
            exchange = @Exchange(value = "itcast.direct",type = ExchangeTypes.DIRECT),
            key = "key2"
    ))
    public void listen2(String msg) {
        System.out.println("key2   "+msg);
    }


}

生产者:

    @Autowired
    private RabbitTemplate rabbitTemplate;


    @Test
    public void test4_1() {
        String msg = "hello mq  --direct";
        String exchange = "itcast.direct";
        rabbitTemplate.convertAndSend(exchange, "key1", msg);
    }

    @Test
    public void test4_2() {
        String msg = "hello mq  --direct";
        String exchange = "itcast.direct";
        rabbitTemplate.convertAndSend(exchange, "key2", msg);
    }


1.3.3 Topic交换机

此处以1个交换机,2个队列为例,2个消费者为例。

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: zs
    password: root
    virtual-host: itcast
    listener:
      simple:
        prefetch: 1

配置类:

@Configuration
public class TopicConfig {

    @Bean
    public TopicExchange topicExchange(){
        return new TopicExchange("itcast.topic");
    }

    @Bean
    public Queue queue1(){
        return new Queue("topic.queue1");
    }

    @Bean
    public Binding binding1(Queue queue1,TopicExchange topicExchange){
        return BindingBuilder.bind(queue1).to(topicExchange).with("china.#");
    }

    @Bean
    public Queue queue2(){
        return new Queue("topic.queue2");
    }

    @Bean
    public Binding binding2(Queue queue2,TopicExchange topicExchange){
        return BindingBuilder.bind(queue2).to(topicExchange).with("us.#");
    }

}

监听器(消费者)【注意:这里的注解中的key里的#表示大于等于0个字符,*代表1个字符】:

@Configuration
public class ConsumerListener5 {
    
    // 消费者1
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("topic.queue1"),
            exchange = @Exchange(name = "itcast.topic",type = ExchangeTypes.TOPIC),
            key = "china.#"
    ))
    public void listen1(String msg){
        System.out.println("china :  "+msg);
    }
    
    // 消费者2
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("topic.queue2"),
            exchange = @Exchange(value = "itcast.topic",type = ExchangeTypes.TOPIC),
            key = "us.#"
    ))
    public void listen2(String msg){
        System.out.println("us : "+msg);
    }



}

生产者:

    @Autowired
    private RabbitTemplate rabbitTemplate;



    @Test
    public void test5_1() {
        String msg = "hello mq  --topic";
        String exchange = "itcast.topic";
        rabbitTemplate.convertAndSend(exchange, "china.zj", msg);
    }

    @Test
    public void test5_2() {
        String msg = "hello mq  --topic";
        String exchange = "itcast.topic";
        rabbitTemplate.convertAndSend(exchange, "us.bst", msg);
    }



1.4 消息转化器

在上面的使用中,生产者发送消息是通过:


    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void test5_2() {

      // 此处省略了 exchange, routingKey, msg 的定义
      rabbitTemplate.convertAndSend(exchange, routingKey, msg);

    }

这里的 msg 通过代码提示可以知道是Object类型,但是在RabbitMQ的管理界面可以看到这个Object类型使用的是JDK的序列化,数据又长又看不到,因此需要重写消息转化器。

注意:消费者和生产者如果在2个模块中,则都需要引入依赖、写配置类

依赖:

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

配置类:

import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfig {
    @Bean
    public MessageConverter jsonMessageConvert(){
        return new Jackson2JsonMessageConverter();
    }
}

标签:return,String,笔记,Queue,Bean,RabbitMQ,msg,public
From: https://www.cnblogs.com/cywdder/p/18081078

相关文章

  • Flask学习笔记
    Flask构成1.路由(Routing):Flask使用路由来定义URL和对应的处理函数。通过装饰器@app.route(),可以将一个URL映射到相应的处理函数上,从而实现请求的路由和处理。2.视图函数(ViewFunctions):视图函数是Flask中处理请求的核心组件,它接收请求并返回响应。视图函数通常被装饰器绑......
  • 学习笔记444—macbook软件卸载了图标还在launchpad上怎么办?一分钟搞定!
    macbook软件卸载了图标还在launchpad上怎么办?一分钟搞定!问题描述有时候,我们使用MacBook时没有从AppleStore安装软件,而是从一些非官方渠道安装的软件。这样我们将这些macbook软件卸载了之后,图标还会留在在launchpad(启动台)上,这些软件的图标无法删除,鼠标长按也不会出来叉叉。我们的......
  • JavaScript学习笔记6: 对象 - 字符串Stirng
    JS对象-字符串String字符串的创建方式<script>//字符串创建方式1varstr1=newString("str1");//字符串创建方式2varstr2="str2";</script>字符串属性&方法length属性<script>console.log("获取字符串的length属性");    con......
  • JavaScript学习笔记7: 对象 - 自定义对象&JSON
    JS对象-自定义对象&JSON自定义对象类似java的类Json的所有属性(key)需要用双引号包围,本质是字符串<script>    varuser={    name:"tom",    age:10,    gender:"male",    //eat:function(){}    //可以简写为    eat(){//自......
  • JavaScript学习笔记3: 数据类型,运算符,类型转换
    JS数据类型,运算符,类型转换利用typeof获取数据类型数字3的类型<script>console.log("3的类型:"+typeof3);</script>浮点数<script>console.log("3.14的类型:"+typeof3.14);</script>字符串<script>console.log("'......
  • JavaScript学习笔记4: 流程控制语句 ,函数
    流程控制语句与java基本一致的语法<script>vara=true;if(a){    //语句}else{    //语句}</script>函数函数定义方式1<script>functionadd(a,b){returna+b;}alert(add(1,2));//也可以用变量......
  • JavaScript学习笔记5: 对象 - 数组Array
    JS对象-数组Array数组的定义及特性数组定义<script>//数组定义方式1,赋值给变量vararr1=newArray(1,2,3);//数组定义方式2,初始化数组vararr2=[4,5,6];</script>JS数组长度可变<script>vararr2=[4,5,6];//数组初始长度为3......
  • JavaScript学习笔记1: JS引入方法
    JavaScriptJS的引入方法内部脚本在script标签间插入js语句,可以在任意位置放置任意数量的script,为了改善显示速度,一般把js脚本放在body的底部<!--内部脚本--><script>//警告框alert('HelloJS');</script>外部脚本外部定义的js脚本,在js脚本中......
  • JavaScript学习笔记2: js书写语法及变量
    JS书写语法以及变量变量声明变量<style>vara=20;a="张三";//js是一门弱类型语言,变量可以存放不同类型的值</style>几种不同的变量声明方式varvar定义的是全局变量在代码块中声明的变量,在代码块外也可以访问可以重复定义<style>{v......
  • 学习笔记——C语言基本概念&运算符——(2)
    目录一、运算符1.1赋值运算符1.2算数运算符 1.3关系运算符1.5位运算符1.6 自增自减运算符1.7  复合运算符1.8逗号运算符1.9 三目运算符1.10 sizeof运算符附录:运算符优先性表一、运算符1>.按照操作数目分类:单目运算符,双目运算符,三目运算符。2>......