RabbitMQ 入门到应用 ( 五 ) 基本应用

news2024/9/22 3:37:12

6.更多应用

6.1.AmqpAdmin 工具类

可以通过Spring的@Autowired 注入 AmqpAdmin 工具类 , 通过这个工具类创建 队列, 交换机及绑定

import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @Autowired
    private AmqpAdmin amqpAdmin;

    @RequestMapping("/testAdmin")
    public String test(){
        // 创建队列
        // 队列名称,  是否为持久性, 是否为独享, 是否自动删除
        Queue queue = new Queue("new.admin", true, false, false);
        String queueStr = amqpAdmin.declareQueue(queue);
        System.out.println("queueStr = " + queueStr);

        // 创建交换机
        // 队列名称,  是否为持久性, 是否为独享, 是否自动删除
        DirectExchange directExchange = new DirectExchange("new.exchange.direct", true, false);
        amqpAdmin.declareExchange(directExchange);

        // 绑定
        // 目标 : 队列名 , 目标类型 ,  交换机 , 路由键  , 自定义参数
        Binding binding = new Binding(
                "new.admin",
                Binding.DestinationType.QUEUE,
                "new.exchange.direct",
                "new.admin",
                null);
        amqpAdmin.declareBinding(binding);

        return "over";
    }
}

调用方法后, 观察操作界面可以看到

新的队列
在这里插入图片描述

新的交换机

在这里插入图片描述

及 绑定信息

在这里插入图片描述

6.2.主题交换机

6.2.1.配置 队列 交换机 及 绑定关系

通过 new org.springframework.amqp.core.Queue() 创建 队列, 传入队列的 name 属性

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class RabbitConfig {

    /**
     * 声明 队列
     */
    @Bean
    public Queue fivemallQueue() {
        return new Queue("fivemall");
    }

    @Bean
    public Queue goodsQueue() {
        return new Queue("fivemall.goods");
    }

    @Bean
    public Queue adminQueue() {
        return new Queue("fivemall.admin");
    }

    @Bean
    public Queue yuanAdminQueue() {
        return new Queue("yuan.admin");
    }
    
    /**
     * 声明 交换机
     */  
    @Bean
    public TopicExchange topicExchange() {
        // 声明 name 为 "topicExchange" 的 主题交换机
        return new TopicExchange("topicExchange");
    }


    
    /**
     * 为 交换机 绑定 队列
     */  
    
    @Bean
    public Binding bindingFivemallExchange(Queue fivemallQueue, TopicExchange topicExchange) {
        return BindingBuilder.bind(fivemallQueue).to(topicExchange).with("fivemall.#");
    }
    
    @Bean
    public Binding bindingGoodsExchange(Queue goodsQueue, TopicExchange topicExchange) {
        return BindingBuilder.bind(goodsQueue).to(topicExchange).with("fivemall.#");
    }
    
    
    @Bean
    public Binding bindingAdminExchange(Queue adminQueue, TopicExchange topicExchange) {
        return BindingBuilder.bind(adminQueue).to(topicExchange).with("*.admin");
    }    
    
    @Bean
    public Binding bindingYuanExchange(Queue yuanAdminQueue, TopicExchange topicExchange) {
        return BindingBuilder.bind(yuanAdminQueue).to(topicExchange).with("*.admin");
    }
     
}

6.2.2.接收消息

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class TopicReceiver {


    @RabbitHandler
    @RabbitListener(queues = "fivemall")
    public void fivemall(String msg) {
        System.out.println("fivemall 接收信息: "+msg);
    }

    @RabbitHandler
    @RabbitListener(queues = "fivemall.goods")
    public void fivemallGoods(String msg) {
        System.out.println("fivemall.goods 接收信息: "+msg);
    }


    @RabbitHandler
    @RabbitListener(queues = "fivemall.admin")
    public void fivemallAdmin(String msg) {
        System.out.println("fivemall.admin 接收信息: "+msg);
    }


    @RabbitHandler
    @RabbitListener(queues = "yuan.admin")
    public void yuanAdmin(String msg) {
        System.out.println("yuan.admin 接收信息: "+msg);
    }
}

6.2.3.发送消息

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


@Component
public class TopicSender {

    @Autowired
    private AmqpTemplate rabbitTemplate;

    public void topicFivemall(String msg){
        System.out.println("发送 fivemall.order: "+msg);
        // 交换机 , 路由键 , 消息
        // fivemall.order 满足 fivemall.#,  所以 fivemall,  fivemall.goods 可以接收到消息
        rabbitTemplate.convertAndSend("topicExchange", "fivemall.order", msg);
    }

    public void topicAdmin(String msg){
        System.out.println("发送 fivemall.admin: "+msg);
        // fivemall.admin 同时满足 fivemall.#  /  *.admin  两个路由键  
        // 所以 fivemall,  fivemall.goods , fivemall.admin  , yuan.admin  都可以接收到消息
        rabbitTemplate.convertAndSend("topicExchange", "fivemall.admin", msg);
    }
}

6.3.传递对象

6.3.1.定义vo类

这个类必须 可以序列化 , 实现 implements Serializable

import lombok.Data;
import java.io.Serializable;

@Data
public class Student implements Serializable {

    private String name;
    private Integer age;

}

6.3.2.发送消息

@RequestMapping("/sendObj")
public String sendObj(){
    Student stu = new Student();
    stu.setName("王小二");
    stu.setAge(22);

    rabbitTemplate.convertAndSend("new.exchange.direct", "new.admin", stu );

    return "已经发送";
}

6.3.3.接收信息

@RabbitListener(queues = "new.admin")
@RabbitHandler
public void receiveObj(Message message, Student student) {

    System.out.println("new.admin 队列 接收消息 : " + message);
    MessageProperties messageProperties = message.getMessageProperties();
    byte[] body = message.getBody();
    System.out.println("student = " + student);
}

在 控制台 查看输出:

new.admin 队列 接收消息 : (Body:'[serialized object]' MessageProperties [headers={}, contentType=application/x-java-serialized-object, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=new.exchange.direct, receivedRoutingKey=new.admin, deliveryTag=1, consumerTag=amq.ctag-7VnkoHigsGqUapoFWM_-bg, consumerQueue=new.admin])
student = Student(name=王小二, age=22)

可以看到 Message 分为 Body, MessageProperties

而 Body 的内容是 serialized object

6.3.3.1.加入转换类

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 RabbitMessageConfig {

    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}

再来测试, 查看控制台输出

new.admin 队列 接收消息 : (Body:'{"name":"王小二","age":22}' MessageProperties [headers={__TypeId__=com.yuan.rabbitdemo.entity.Student}, contentType=application/json, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=new.exchange.direct, receivedRoutingKey=new.admin, deliveryTag=1, consumerTag=amq.ctag-grY888419qaD_fUA6YkK8Q, consumerQueue=new.admin])
student = Student(name=王小二, age=22)

Body 的内容是 转为 JSON结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/357619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux xargs 删除名字中包含某字符串的文件

xargs的作用 格式化输出 可以把多行文本变成一行,或者指定行数和列数。每一列用空格作分隔符号。 test.txt中的内容 例子1: 用xargs格式化输出后,多行变成了一行,而且多个空格变成了一个空格。 cat test|xargs例子2: 当然也可…

go size class 内存块思考

浏览到的一篇文章,让我也有机会反思一下 go 内存管理。网络上,go 内存管理方面的介绍挺多的,面试的时候,偶尔也会被问到内存管理。 而且,从 go1.15 到 go1.16 在 size class 上引入了新的内存块,能直观的看…

信奥一本通1365

1365:FBI树(fbi) 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6443 通过数: 4366 【题目描述】 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为…

C语言——动态内存管理(详解)

1.动态内存管理存在的意义 在前面的C语言的学习中,我们已经掌握的空间开辟的方式有如下两种 int i 0; //开辟了4字节大小的空间存放i int arr[5] {0}; //开辟了20字节的空间存放数组arr这样开辟空间有两个显著的特点: 1、每次开辟空间的大小都是固定…

K8S集群将Docker切换到Containerd

文章目录1. 开启节点维护1.1 将节点设置成不可调度1.2 驱逐节点上的 Pod1.3 停止相关服务2. 升级到 containerd2.1 安装 containerd2.2 调整 containerd 配置2.3 修改 kubelet 启动配置参数3. 重启节点服务4. 验证升级后的节点5. 容器管理工具5.1 容器管理命令行工具对比5.2 cr…

【JavaScript】ES6模块化与异步编程高级用法

一、ES6模块化 1、回顾:node.js遵循了ComminJS的模块化规范。 其中: 导入其他模块使用require()方法模块对外共享成员使用module.exports对象 模块化的好处: 遵守同样的模块化规范写代码,降低了沟通成本,极大方便了…

使用 ApiPost进行WebService 调试,就是这样简单

文章目录5.1 新建一个 HTTP 接口5.2 添加请求Body5.3 设置请求Header5.4 发送请求Apipost 可以用于调试 WebService 请求。具体步骤如下:5.1 新建一个 HTTP 接口 新建一个 HTTP接口,URL 部分填写 endpoint,请求方式选择 POST。以下 URL 为示…

SpringBoot自动装配的原理

前言 在开发SpringBoot项目时,当我们引入spring-boot-starter-xxx依赖后,想要使用依赖中的bean,直接就用Autowired拿来用了,不需要用xml或者注解的方式把它先注入到Spring容器中。这就是自动装配的特性,本文来讲述Spri…

Spring Bean循环依赖

解决SpringBean循环依赖为什么需要3级缓存?回答:1级Map保存单例bean。2级Map 为了保证产生循环引用问题时,每次查询早期引用对象,都拿到同一个对象。3级Map保存ObjectFactory对象。数据结构1级Map singletonObjects2级Map earlySi…

CMake option选项使用方式及注意事项

CMAKE官网 🍘 在复习 CMake 的时候,使用了 option 功能,发现修改了参数的值之后,和未修改的效果一样,然后不断的查找 option 的使用方法,最后发现并非 option 使用方式而错误,而是 option 第一…

SpringCloudAlibaba-分布式事务Seata

一、介绍官网:http://seata.io/zh-cn/index.html TC (Transaction Coordinator) - 事务协调者维护全局和分支事务的状态,驱动全局事务提交或回滚。TM (Transaction Manager) - 事务管理器定义全局事务的范围:开始全局事务、提交或回滚全局事务…

Mac Appium iOS自动化测试环境搭建教程

目录Appium环境搭建Mac iOS环境搭建Appium基础Appium进阶环境搭建安装brewCopyruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"安装javaCopybrew install java安装python3 及相关包Copybrew install python3 pip install selenium pip install app…

实现8086虚拟机(四)——mov 和 jmp 指令解码

文章目录mov 指令解码jmp 指令解码这篇文章举例来讲讲 mov 指令和 jmp 指令解码函数的实现,其他的指令解码函数都与这些类似。mov 指令解码 以 mov 指令中的一类:寄存器/内存 到/从 寄存器,来详细说明解码函数的实现。 机器指令格式如下&am…

联想M7268激光打印机开机红绿灯双闪报错不打印

故障现象: 一台联想M7268激光打印机开机后电源键、复印键一起双闪,电源键闪红灯、复印键闪绿灯; 检测维修: 根据闪灯故障判断如果无卡纸异常情况下可能是激光器故障,因为以前曾经维修过一台一模一样的机器故障基本相同,先打开机器吧,把硒鼓拿出来先看看有没有卡纸,进纸…

php小程序餐馆点餐订餐外卖系统

目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2.2MyEclipse环境配置 4 2.3 B/S结构简介 4 2.4MySQL数据库 5 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3.1.2技术可行性 6 3.1.3运行可行性 6 …

c++11 标准模板(STL)(std::unordered_set)(二)

定义于头文件 <unordered_set> template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_set;(1)(C11 起)namespace pmr { templ…

python中的for循环以及枚举函数enumerate()

一、可迭代的对象&#xff08;iteratle_object&#xff09; python中可以使用for循环进行迭代的对象大致有以下几种类型&#xff1a; String(字符串)List(列表)Tuple(元组)Dictionary(字典)range()内置函数返回的对象 二、for循环迭代示例 1. 依次输出字符串"python&q…

printk浅析

内核printk原理介绍 - 知乎 (zhihu.com)34.Linux-printk分析、使用prink调试驱动 (bbsmax.com)【原创】计算机自制操作系统(Linux篇)五&#xff1a;内核开发之万丈高楼从地起---printk(理清pintf/vprintf&#xff1b;sprintf/vsprintf &#xff1b;fprintf/vfprintf) - 知乎 (z…

自抗扰控制ADRC之扩张观测器

目录 前言 1. 被控对象(被观测对象) 2.非线性观测器 2.1仿真分析 2.2仿真模型 2.3仿真结果 3.线性观测器 3.1仿真模型 3.2仿真结果 4.总结和学习问题 前言 什么叫观测器&#xff1f;为什么该类观测称为扩张观测器&#xff1f; &#xff1a;观测器可以理解为所观测…

组合数学原理与例题

目录 一、前言 二、计数原理 1、加法原理 2、分割立方体&#xff08;lanqiaoOJ题号1620&#xff09; 3、乘法原理 4、挑选子串&#xff08;lanqiaoOJ题号1621&#xff09; 5、糊涂人寄信&#xff08;lanqiaoOJ题号1622&#xff09; 6、战斗吧N皇后&#xff08;lanqiaoO…