RabbitMQ养成记 (2. java操作MQ快速入门,日志监控,消息追踪)

news2025/1/10 23:44:05

快速入门

刚开始我们就一步一步来, 先搞什么spring集成。
先使用原始的java代码来操作一下MQ。
这里给新手兄弟的建议,这种技术性的学习 一定要先动手,从简单的地方动手,一步一步来,不然上来就搞理论或者复杂的应用很难坚持学下去。


在空项目中 创建2个 module 配置为生产者和消费者:
在这里插入图片描述

消息生产者

   public static void main(String[] args) throws IOException, TimeoutException {
        // 设定工厂参数
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("****");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/****");
        connectionFactory.setUsername("****");
        connectionFactory.setPassword("****");
        
        //建立连接
        Connection con = connectionFactory.newConnection();

        //创建channel
        Channel channel = con.createChannel();
        
        //创建队列
        channel.queueDeclare();

    }

先把该配置的配置了。 然后创建队列, 这个创建队列方法有很多参数,因为这个方法很关键 所以我们要理解一下 这些参数:

        /**
         * queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
         *
         * queue 队列名称
         * durable 是否持久化, 当mq重启之后 是否还在
         * exclusive 是否独占:只能有一个消费者监听这个队列。 当con关闭时,是否删除队列
         * autoDelete 当这个队列没有消费者的时候 自动删除
         * */

        //如果没有这个队列 会自动创建,如果有就不会再创建了
        channel.queueDeclare("hello_world",true,false,false,null);

创建好队列之后, 紧接着就是发送消息 publish这个方法 这个参数也很多 每个参数看一下。(MQ就是这样 它想各种定制化适配不同情况 所以刚开始接触 你就会发现 到处是参数)

     /**
         * basicPublish(String exchange, String routingKey, AMQP.BasicProperties props, byte[] body)
         * exchange 交换机名称(简单模式下可以传null 他会给一个默认交换机)
         * routingKey 路由名称
         * props 配置信息
         * body 真实发送的消息数据
         * */

        String body = "星际2是最好的游戏";
        channel.basicPublish("","hello_world",null,body.getBytes());

最后close释放资源:

   //释放资源
        channel.close();
        connectionFactory.clone();

ok 我们直接跑一下:
在这里插入图片描述
ok 你会发现已经有一个队列了。不难对吧 这就是最基本的 java MQ发送到服务器。


这里我们要明白几个要点:

  • MQ的解耦性, 有了MQ这个中转站 你的消息发出去放在哪里, 你就不用管了, 你不需要再担心 接收方到底收到没有。
  • 创建队列的方法 相同队列他就不会再创建了
  • 一定记得这种最后要close释放资源

消息消费者

消费者同理 前面的建工厂 创建队列 都一样,
到了 channel.basicConsume()
参数这个地方 它传进来一个consumer 调用回调

所谓的回调就是 它站在这里等 等到有消息的时候 它再调用这个方法。

我们来调用handleDelivery 利用匿名内部类 重写 打印出来

   Consumer consumer = new DefaultConsumer(channel){

            /***
             * 回调方法 当收到消息后 会自动执行该方法
             * consumerTag 标识
             * envelope 获取信息 交换机,路由key
             * properties 配置的信息
             * body 数据
             */

            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("1:"+consumerTag);
                System.out.println("2.1:"+envelope.getExchange()+" "+"2.2"+envelope.getRoutingKey());
                System.out.println("3:"+properties);
                System.out.println("4:"+ new String(body));

            }
        };

        /**
         * basicConsume(String queue, boolean autoAck, Consumer callback)
         * queue 队列名称
         * autoAck 是否自动确认 消费者收到之后自动给mq说一声 我收到了 作为确认
         * callback 回调对象 它会监听一些方法
         * */

        channel.basicConsume("hello_world",true,consumer);

注意消费者是不需要关close的,因为它处在一个监听状态:

1:amq.ctag-F7bTRdh6FCpw5Nr-Dks_ng
2.1: 2.2hello_world
3:#contentHeader<basic>(content-type=null, content-encoding=null, headers=null, delivery-mode=null, priority=null, correlation-id=null, reply-to=null, expiration=null, message-id=null, timestamp=null, type=null, user-id=null, app-id=null, cluster-id=null)
4:星际2是最好的游戏
1:amq.ctag-F7bTRdh6FCpw5Nr-Dks_ng
2.1: 2.2hello_world
3:#contentHeader<basic>(content-type=null, content-encoding=null, headers=null, delivery-mode=null, priority=null, correlation-id=null, reply-to=null, expiration=null, message-id=null, timestamp=null, type=null, user-id=null, app-id=null, cluster-id=null)
4:maru是最强的选手
1:amq.ctag-F7bTRdh6FCpw5Nr-Dks_ng
2.1: 2.2hello_world
3:#contentHeader<basic>(content-type=null, content-encoding=null, headers=null, delivery-mode=null, priority=null, correlation-id=null, reply-to=null, expiration=null, message-id=null, timestamp=null, type=null, user-id=null, app-id=null, cluster-id=null)
4:P是最imba的种族

这个地方我们观察一下 首先第一个打出来的是
consumerTag:三条消息的consumerTag是相同

然后打出来的是
exchange 这个是空 因为我们生产者 发送就是空

然后是routingKey 路由名称 和我们生产者的参数相同

然后是一些配置信息

最后是实际的body数据


消息追踪

这里分享一个消息追踪插件: firehouse

在rabbitmq 管理台里面 我们可以看到这样一个 交换机:
在这里插入图片描述
是专门用于消息追踪的

开启追踪:

rabbitmqctl trace_on

在这里插入图片描述
当我们发送一条消息的时候,这个交换机也会发一条相关的更详细的消息

而且在这里我们可以讲追踪信息打到日志里面:
在这里插入图片描述
当然开发的同学 不需要太深究这个 这种监控一般都是运维的活
你主要知道有这么个东西 当你想要追踪消息日志的时候 知道去哪看就好了

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

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

相关文章

JDBC API

注册数据库驱动 Class.forName("com.mysql.jdbc.Driver"); 所谓的注册驱动&#xff0c;就是让JDBC程序加载mysql驱动程序&#xff0c;并管理驱动 驱动程序实现了JDBC API定义的接口以及和数据库服务器交互的功能&#xff0c;加载驱动是为了方便使用这些功能。 获…

Spring IOC相关注解运用——下篇

目录 一、Configuration 二、ComponentScan 1. 说明 2. 测试方法 3. 运行结果 三、PropertySource 1. 说明 2. 测试方法 3. 测试结果 四、Bean 1. 说明 2. 添加驱动依赖 3. 将Connection对象放入Spring容器 3. 测试 五、Import 1. 说明 2. 测试方法 3. 运行结…

从一道go逆向出发,讨论类tea的逆算法

tea代码很短&#xff0c;经常被直接复制为源码&#xff08;而不是像标准算法那样调库&#xff09;。在ctf逆向中也算比较常见&#xff0c;复杂度适中。 例题是一道go逆向&#xff0c;经go parser处理后&#xff0c;核心代码如下图。 panic算是go的专有名词&#xff0c;类似异常…

吃透 Spring AOP (1.理解概念)

理解 什么是AOP AOP&#xff0c;全称面向切面编程。 它可以说是对面向对象OOP的思想升华。从总的理解来讲&#xff0c;AOP是横向对不同程序的抽象。这个思想要不断实践动手之后&#xff0c;才会有很深刻的理解 理解 代理模式 在理解AOP之前&#xff0c;我们首先要单独说一个…

FFMPEG录屏(16)--- MAG(Magnification)捕获桌面

最近增加了对Magnification API捕获桌面的支持&#xff0c;记录一下过程和其中遇到的问题。 参考资料 Magnification API overview Magnification API sample webrtc screen_capturer_win_magnifier.cc Structured Exception Handling (C/C) 前言 我又不得不吐槽一下了&a…

【JavaWeb】-- HTTP、Tomcat、Servlet

文章目录 HTTP1.简介2.请求数据格式2.2.1 格式介绍 3.响应数据格式3.1 格式介绍3.2 响应状态码 Tomcat1.简介1.1 什么是Web服务器 2.基本使用2.1 安装2.2 启动2.3 关闭 3.Maven创建Web项目4.IDEA使用Tomcat4.1集成本地Tomcat4.2 Tomcat Maven插件 Servlet1.简介2.快速入门3.执行…

okhttp篇3:RealCall

Call Call一般代表一个已经准备好的Request&#xff0c;Request的包装类&#xff0c;可执行&#xff0c;它一般有两个主要的方法&#xff1a; execute(立即执行&#xff0c;并阻塞线程&#xff0c;直到Response返回)enqueue(将Request放入队列&#xff0c;等待线程池调度执行…

spring源码学习_01 本地环境搭建

参考网上各种资源&#xff0c;终于把spring源码运行起来了&#xff1b;步骤总结如下&#xff1a; spring版本&#xff1a; 5.2.x 本地系统mac idea 2019.3.2 下载地址&#xff1a;https://www.jetbrains.com/idea/download/other.html jdk 11 下载地址&#xff1a;https://repo…

【设计模式二十三剑】✨编写更高质量代码的秘诀✨

文章目录 ✨✨简述&#x1f386;【万能之门】简单工厂模式&#xff08;Simple Factory&#xff09;&#x1f387;【制造之剑】工厂方法模式&#xff08;Factory Method&#xff09;&#x1f387;【生产之剑】抽象工厂模式&#xff08;Abstract Factory&#xff09;&#x1f387…

C语言基础知识:函数的调用

函数的定义 一般来说&#xff0c;执行源程序就是执行主函数main&#xff0c;其他函数只能被主函数所调用&#xff0c;而其他函数之间也可以相互调用。 1.标准库函数&#xff1a; 分为&#xff1a;I/O函数&#xff0c;字符串&#xff0c;字符处理函数&#xff0c;数学函数&am…

Go语言的函数和defer用法

目录 函数的基本用法 函数中的变长参数 递归函数(recursion) 函数是“一等公民” 函数中defer的用法 defer的底层原理 使用 defer 跟踪函数的执行过程 defer的注意事项 &#xff08;1&#xff09;Go语言内置的函数中哪些可以作为deferred 函数 &#xff08;2&#xf…

面试code(1)—— 排序算法

算法动画 从小到大排序 1 冒泡排序 被动的将最大值送到最右边 1、比较相邻的元素。如果第一个比第二个大&#xff0c;就交换他们两个。 2、对每一对相邻元素作同样的工作&#xff0c;从开始第一对到结尾的最后一对。这步做完后&#xff0c;最后的元素会是最大的数。 3、针对…

Redis修炼 (17. redis主从集群的数据同步原理 全量同步/增量同步)

数据同步 在一个集群之中 数据同步是很重要的。 redis的集群有多种。 我们这次主要说 主从集群。 全量同步 既然是主从集群 那么肯定是 1个master节点 多个从节点。redis的集群中的第一次同步 我们叫 全量同步&#xff1a; 为什么要强调第一次&#xff1f; 因为如果你是第一…

独家策略大放送:最高年化150%的策略,谁不感兴趣?(含免费版)

上一节我们在沪深300中回测了550中均线交叉策略,有朋友想看看这些策略在沪深300以外的中小市场表现如何,同时大家都非常好奇表现抢眼的老Q自研指标WMA_Q系列到底是怎么计算的。 于是老Q又选择了中证500和创业板指来验证下这些策略是否能有同样的表现(PART 1),顺便在今天的…

流水线中的握手信号笔记

1.《握手信号的打拍(一)》 解释了&#xff0c;为什么在流水线中&#xff0c;握手信号不能简单得加一级寄存器 业界关于流水线级握手信号的标准答案是 skid buffer&#xff0c;此外还有人提到了 Register slice 2.《握手信号的打拍(二)》 为什么简单加一级寄存器会握手失败 &…

抖音SEO系统源码开发搭建/MVC二次开发定制

首先&#xff0c;抖音SEO矩阵系统源码开发&#xff0c;如何做独立部署&#xff0c;首先我们需要深刻理解这个系统的开发逻辑是什么&#xff1f;开发的前言是在抖音平台做流量新增&#xff0c;现在抖音及各大主流短视频平台&#xff0c;流量新增&#xff0c;各大企业需要在短视频…

Redis BigKey

Redis BigKey 一 面试题引入二 MoreKey案例2.1 大批量往redis里面插入2000W测试数据key2.1.1 Linux Bash下执行&#xff0c;插入100W2.1.2 通过redis提供的管道 --pipe命令插入100W大批量数据 2.2 key *2.3 生产上如何限制keys*/flushdb/flushall等危险命令以防止误删误用&…

我们在操作自动化测如何实现用例设计实例

在编写用例之间&#xff0c;笔者再次强调几点编写自动化测试用例的原则&#xff1a; 1、一个脚本是一个完整的场景&#xff0c;从用户登陆操作到用户退出系统关闭浏览器。 2、一个脚本脚本只验证一个功能点&#xff0c;不要试图用户登陆系统后把所有的功能都进行验证再退出系统…

【结构体-位段】

位段 在结构体中&#xff0c;以位为单位的成员&#xff0c;咱们称之为位段(位域)。 struct packed_data{unsigned int a:2;unsigned int b:6;unsigned int c:4;unsigned int d:4;unsigned int i; } data;注意&#xff1a;不能对位段成员取地址。 #include<stdio.h>str…

5.名词复数、动词规则、代词、形容词、副词(不包含不规则)

目录 一、 名词、动词、代词、形容词、副词五种的规则变化。 &#xff08;1&#xff09;名词。 &#xff08;1.1&#xff09;名词复数变化。 &#xff08;1.2&#xff09;名词所有格。 &#xff08;2&#xff09; 动词变化规则。 &#xff08;3&#xff09;代词。 &…