首页 > 其他分享 >RabbitMQ 10 头部模式

RabbitMQ 10 头部模式

时间:2023-04-09 14:33:44浏览次数:48  
标签:10 amqp core springframework RabbitMQ 头部 import org

头部模式是根据头部信息来决定的,在发送的消息中是可以携带一些头部信息的(类似于HTTP),可以根据这些头部信息来决定路由到哪一个消息队列中。

  1. 定义配置类。
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.ExchangeBuilder;
import org.springframework.amqp.core.HeadersExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * RabbitMQ配置类
 */
@Configuration
public class RabbitMqConfig {
    
    /**
     * 定义交换机,可以很多个
     * @return 交换机对象
     */
    @Bean
    public HeadersExchange headersExchange(){
        return ExchangeBuilder.headersExchange("amq.headers").build();
    }

    /**
     * 定义消息队列
     * @return 消息队列对象
     */
    @Bean
    public Queue headersQueue(){
        return new Queue("headersQueue");
    }
    
    /**
     * 定义绑定关系
     * @return 绑定关系
     */
    @Bean
    public Binding binding(@Qualifier("headersExchange") HeadersExchange exchange,
                           @Qualifier("headersQueue") Queue queue){
        // 将定义的交换机和队列进行绑定
        return BindingBuilder
                // 绑定队列
                .bind(queue)
                // 到交换机
                .to(exchange)
//                .whereAny("a", "b").exist();                              // 这个是只要存在任意一个指定的头部Key就行
//                .whereAny(Collections.singletonMap("a", "b")).match();    // 传入Map也行,批量指定键值对
//                .whereAll("a", "b").exist();                              // 这个是必须存在所有指定的的头部Key
//                .whereAll(Collections.singletonMap("a", "b")).match();    // 传入Map也行,批量指定键值对
                .where("test").matches("hello");                  // 比如我们现在需要消息的头部信息中包含test,并且值为hello才能转发给我们的消息队列
    }
}
  1. 定义消费者。
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 头部监听器
 */
@Component
public class HeadersListener {

    /**
     * 监听头部队列消息
     */
    @RabbitListener(queuesToDeclare = {@Queue("headersQueue")})
    public void receiver(String message) {
        System.out.println("头部队列接收到消息:" + message);
    }

}
  1. 定义生产者。
import org.junit.jupiter.api.Test;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class RabbitMqSpringBootTests {

    /**
     * RabbitTemplate封装了大量的RabbitMQ操作,已经由Starter提供,因此直接注入使用即可
     */
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 生产者
     */
    @Test
    void producer()  {
        
        Message message = MessageBuilder.withBody("Hello World".getBytes()).setHeader("test","hello").build();
        rabbitTemplate.convertAndSend("amq.headers", "", message);
    }

}
  1. 启动生产者发送消息。

    可以看到,通过头部的匹配,队列成功接收到了消息。


标签:10,amqp,core,springframework,RabbitMQ,头部,import,org
From: https://www.cnblogs.com/codesail/p/17300291.html

相关文章

  • 在Ubutu(14.10)的Eclipse启动Tomcat,以及部署问题
    启动Tomcat安装了阿土14.10(启动盘报gfxboot.c32:notaCOM32Rimage,网上查得输入live,果然可以,对此解决方式只能说),想装一个javaservlet的环境,下载了eclipse,通过apt-getinstall安装了tomcat和openjava。但是在运行时,RunOnServer中ServerName无法显示,导致无法运行。根据网上的指......
  • 力扣1077(MySQL)-项目员工Ⅲ(中等)
    题目:写一个SQL查询语句,报告在每一个项目中经验最丰富的雇员是谁。如果出现经验年数相同的情况,请报告所有具有最大经验年数的员工。查询结果格式在以下示例中:   employee_id为1和3的员工在project_id为1的项目中拥有最丰富的经验。在project_id为2的项目......
  • 力扣1076(MySQL)-员工项目Ⅱ(简单)
    题目:编写一个SQL查询,报告所有雇员最多的项目。查询结果格式如下所示:  解题思路:方法一:将两个表联结,以project_id进行分组,统计员工数降序排序,然后筛选出第一条数据。1selectproject_id2fromprojecta3joinemployeeb4ona.employee_id=b.employee_id5group......
  • 力扣1075(MySQL)-项目员工Ⅰ(简单)
    题目:项目表 Project:  员工表 Employee:请写一个SQL 语句,查询每一个项目中员工的 平均 工作年限,精确到小数点后两位。查询结果的格式如下:   解题思路:建表语句:1CreatetableIfNotExistsProject_1075(project_idint,employee_idint);2Createtable......
  • CHR(10)和CHR(13)的区别
    总体来说:chr(10)表示换行,chr(13)表示回车百度搜索所得:“换行”(linefeed)和“回车”(carriagereturn):换行(\n)就是光标下移一行却不会移到这一行的开头,回车(\r)就是回到当前行的开头却不向下移一行。Enter键按下后会执行\n\r这样就是我们看到的一般意义的回车了,所以你用16进制文......
  • windows 10 家庭版安装Docker和portainer汉化版
    目录前景提要存在问题一、Docker的windows版本安装1、官网下载:https://www.docker.com/(没有本文问题的直接下载就好.)2、本文是找到其他版本的Docker,装一个不是最新的版本,就可以了。3、系统修改开启本机的虚拟器(1)开启Hyper-V(2)开启虚拟平台和Linux子系统修改默认的安装路......
  • 1012. 至少有 1 位重复的数字
    题目链接:1012.至少有1位重复的数字方法:数位dp解题思路参考:数位DP通用模板,附题单(Python/Java/C++/Go)注意:其中\(isNum\)是用来针对前导\(0\)可能影响结果而设置的标志,如\(010\)(即\(10\))实际是没有重复的数字,而由于前导\(0\)的影响使得是有重复的数字。对于不受前导\(0\)影......
  • 108. 将有序数组转换为二叉搜索树
    题目链接:108.将有序数组转换为二叉搜索树方法:递归建树解题思路每次选取中间的元素作为根节点,递归创建左右子树,就可以保证左右子树的高度差绝对值不超过1代码/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*......
  • PAT Basic 1076. Wifi密码
    PATBasic1076.Wifi密码1.题目描述:下面是微博上流传的一张照片:“各位亲爱的同学们,鉴于大家有时需要使用wifi,又怕耽误亲们的学习,现将wifi密码设置为下列数学题答案:A-1;B-2;C-3;D-4;请同学们自己作答,每两日一换。谢谢合作!!~”——老师们为了促进学生学习也是拼了……本题就要求......
  • 10.大牛是怎么思考设计MySQL优化方案的?
    https://www.cnblogs.com/keme/p/10300154.htmlhttps://www.cnblogs.com/keme/p/10472283.html ......