RabbitMQ 入门到应用 ( 五 ) 应用

news2024/12/24 11:45:36

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/356143.html

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

相关文章

python基于django微信小程序的适老化老人健康预警小程序

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代, 适老化老人健康预警微信小程序就是信息时代变革中的产物之一。 任何系统都要遵…

Spring国际化实现

Java国际化 Java使用Unicode来处理所有字符。 Locales 国际化主要涉及的是数字、日期、金额等。 有若干个专门负责格式处理的类。为了对格式进行控制,可以使用Locale类。它描述了: 一种语言一个位置(通常包含)一段脚本(可选,自Java SE7开…

CMMI之需求开发流程

需求开发(Requirement Development, RD)的目的是通过调查与分析,获取用户需求并定义产品需求。需求开发过程域是SPP模型的重要组成部分。本规范阐述了需求开发过程域的两个主要规程: 需求调查 [SPP-PROC-RM-SURVEY] 需求定义 [SPP…

消失的数字【C语言】

题目&#xff1a; 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 解法&#xff1a; int missingNumber(int* nums, int numsSize){int val0;for(int i0;i<numsSize;i){val^nums[i];}fo…

Vue3之条件渲染

1.何为条件渲染 条件渲染就是在指定的条件下&#xff0c;渲染出指定的UI。比如当我们显示主页的时候&#xff0c;应该隐藏掉登录等一系列不相干的UI元素。即UI元素只在特定条件下进行显示。而在VUE3中&#xff0c;这种UI元素的显示和隐藏可以通过两个关键字&#xff0c;v-if 和…

Qt动画框架详解

目录1.前言2.原理3.属性动画4.并行执行的动画5.顺序执行的动画6.扩展属性动画支持的数据类型1.前言 为软件适当的添加一些动画&#xff0c;能够提高软件的用户体验。在使用Qt框架开发软件时&#xff0c;我们可以用Qt提供的动画框架来为QWidget等UI元素添加动画效果。本文从动画…

程序员和他的女朋友一起创建了价值 150,000,000 美元的网站

本篇文章讲述了Otis和Elizabeth Chandler创办Goodreads.com的故事。他们从小就爱读书&#xff0c;创办网站前他们的困惑是没有很多人在线分享书评。Otis和Elizabeth觉得如果有一个地方把所有人的评论和评价收集起来&#xff0c;那将会很有价值。奥蒂斯和伊丽莎白从小就喜欢读书…

MMKV与mmap:全方位解析

概述 MMKV 是基于 mmap 内存映射的移动端通用 key-value 组件&#xff0c;底层序列化/反序列化使用 protobuf 实现&#xff0c;性能高&#xff0c;稳定性强。从 2015 年中至今&#xff0c;在 iOS 微信上使用已有近 3 年&#xff0c;其性能和稳定性经过了时间的验证。近期已移植…

海量数据相似数据查询方法

1、海量文本常见 海量文本场景&#xff0c;如何寻找一个doc的topn相似doc&#xff0c;一般存在2个问题&#xff0c; 1)、两两对比时间o(n^2) 2)、高维向量比较比较耗时。 文本集可以看成(doc,word)稀疏矩阵&#xff0c;一般常见的方法是构建到排索引&#xff0c;然后进行归并…

论文投稿指南——中文核心期刊推荐(社会学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

【论文精读】DeepWalk: Online Learning of Social Representations

DeepWalk: Online Learning of Social Representations 本文是我参加Datawhale的CS224W图机器学习时的笔记&#xff0c;第一次学习图机器学习&#xff0c;对DeepWalk这篇开山之作的理解。 论文的三位作者均来自纽约州立大学石溪分校&#xff0c;杨振宁和丘成桐也曾在此教学。 …

JavaScript内存泄露和垃圾回收机制

1、是什么&#xff1f;内存泄露&#xff08;Memory leak&#xff09;是在计算机科学中&#xff0c;由于疏忽或错误造成程序未能释放已经不再使用的内存。并非指内存在物理上的消失&#xff0c;而是应用程序分配某段内存后&#xff0c;由于设计错误&#xff0c;导致在释放该段内…

Spring Boot 项目介绍

Spring Boot 项目介绍 作为学习过 Java 的软件开发者&#xff0c;相信都知道 Spring 这一伟大的框架&#xff0c;它所拥有的强大功能之一就是可以集成各种开源软件。但随着互联网的高速发展&#xff0c;各种框架层出不穷&#xff0c;这就对系统架构的灵活性、扩展性、可伸缩性…

【项目精选】基于JSP物流信息网(论文+源码+视频)

点击下载源码 近年来&#xff0c;随着时代的进步&#xff0c;社会随之不断发展&#xff0c;经济也快速发展起来了&#xff0c;人民的消费水平在不断地提高&#xff0c;平常的实体店消费已经不能满足人们的需求&#xff1b;在者&#xff0c;互联网技术的不断发展也为电子商务的兴…

CSS Houdini

前言 最近看了几篇文章&#xff0c;是关于 CSS Houdini 的。作为一个前端搬砖的还真不知道这玩意&#xff0c;虽然不知道的东西挺多的&#xff0c;但是这玩意有点高大上啊。 Houdini 是一组底层 API&#xff0c;它们公开了 CSS 引擎的各个部分&#xff0c;从而使开发人员能够通…

Matlab搭建AlexNet实现手写数字识别

Matlab搭建AlexNet实现手写数字识别 个人博客地址 文章目录Matlab搭建AlexNet实现手写数字识别环境内容步骤准备MNIST数据集数据预处理定义网络模型定义训练超参数网络训练和预测代码下载环境 Matlab 2020aWindows10 内容 使用Matlab对MNIST数据集进行预处理&#xff0c;搭建…

基于Spring Boot框架的人事管理系统的设计与实现(程序+详细文档)

大家好✌&#xff01;我是CZ淡陌。这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路&#xff01; &#x1f345;更多优质项目&#x1f447;&am…

面向六部十层电梯群控算法的研究

面向六部十层电梯群控算法的研究 赵大权&#xff0c;张翔宇 &#xff08;晋中学院 机械学院&#xff0c;山西 晋中 030619&#xff09; 摘 要&#xff1a; 在商业大楼和高层写字楼里&#xff0c;基于可编程逻辑控制器&#xff08;PLC&#xff09;对电梯运行进行控制是当前主流…

【LeetCode】剑指 Offer(4)

目录 写在前面&#xff1a; 题目&#xff1a;剑指 Offer 10- I. 斐波那契数列 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 10- II. …

河南工程学院2.17蓝桥杯培训

乘法口诀数列&#xff1a;https://www.acwing.com/problem/content/3466/ 剪绳子&#xff1a;https://www.acwing.com/problem/content/68Sin SinSine之舞&#xff1a;http://lx.lanqiao.cn/problem.page?gpidD5272 数列&#xff1a;https://www.acwing.com/problem/content/…