XXL-Job 监控消息队列消息数量预警

news2024/9/24 19:04:48

1、什么是Basic Authentication认证

Basic Authentication 是一种常用的 HTTP 认证机制,用于保护 Web 资源免受未授权访问。在这种认证方式中,客户端(通常是浏览器)需要在 HTTP 请求头中提供用户凭据(通常是用户名和密码),这些凭据以 Base64 编码的字符串形式包含在 "Authorization" 头字段中

当用户访问被保护起来的资源时,服务器会判断Header里面有没有Authorization字段,如果没有会返回status = 401状态码。

在请求Authenticate头部指定类型为Basic,客户端随后会提提示用户输入用户名和密码,并把它们以username:password的形式编码为Base64字符串,在后续的请求中通过Authorization头发送给服务器

没有请求头的情况下,直接使用RabbitMQAPI查看所有的队列,浏览器会弹出提示框

https://www.jb51.net/program/3242837xn.htm

2、在Java中使用HttpRequest.get请求时如何通过Basic Authentication认证

Basic Authentication认证会将用户输入的账号和密码拼接成 username:password后转化成base64格式,拼接上Basic

拼接效果如下所示

"Basic Z3Vlc3Q6Z3Vlc3Q= "

Java如何实现拼接并发送请求

指定查看某个队列和所有队列的消息数量

public void getQueueMessageCount(String username,String password,String queueName) {	//获得传递过来的账号密码	//手动拼接成指定格式
    String basic = username+":"+password;			//将拼接后的账号密码编码成base64格式	String encode = Base64.encode(basic.getBytes(StandardCharsets.UTF_8));	//将编译好的账号密码拼接上Basic	//真正的Basic	String Basic = "Basic"+ " "+ encode;	//请求路径	String url = "http://192.168.29.131:15672/api/queues/"+"%2f"+"/"+queueName;	//通过HttpRequest发送get请求     HttpResponse authorization = HttpRequest.get(url).header("Authorization", Basic).execute();
        //访问成功
        if(authorization.getStatus() == 200){

            String body = authorization.body();
            //获得所有的信息
            HashMap bodyList = JSONUtil.toBean(body, HashMap.class);
            Integer messages = (Integer)bodyList.get("messages");
            //判断消息数量是否足够
            if (messages > 3){
                //钉钉报警
                SendMessage(queueName);
                return;
            }else {
                System.out.println("消息队列信息正常,无事发生");
            }

        }
}//查看所有队列的消息 public void getQueueMessageCount(String username,String password) {
        //获得传递过来的账号密码
        String basic = username+":"+password;

        //base64编码
        /*不指定UTF-8,默认会使用系统编码格式,但是在不同的操作系统中大概率会出错,建议明确编码格式*/
        String encode = Base64.encode(basic.getBytes(StandardCharsets.UTF_8));
        //正确的basic
        String Basic = "Basic" +" "+encode;
        String url = "http://192.168.29.131:15672/api/queues/";

        HttpResponse authorization = HttpRequest.get(url).header("Authorization", Basic).execute();

        //访问成功
        if(authorization.getStatus() == 200){

            String body = authorization.body();
            //获得所有的信息
            List<Map> bodyList = JSONUtil.toList(body, Map.class);
            for (Map map : bodyList) {
                Integer message = (Integer) map.get("messages");
                //判断消息数量是否足够
                if (message > 3 ){
                    //钉钉报警
                    SendMessage(map.get("name").toString());
                }else {
                    log.debug("{}消息总量并没有超过限定值,无事发生",map.get("name"));
                }
            }


        }

        String mm = "";


    }

/*钉钉发送消息*/ private void SendMessage(String queueName ){
        String url = "https://oapi.dingtalk.com/robot/send?access_token=8fbcdf4c54bd3954b1f71993e6eeac1ea78f126d669f028d01349df44b37ead9";
        //存放at内部信息
        JSONArray array = new JSONArray();
        array.add("17839697920");
        //存放机器人的一些Json字符串
        JSONObject msg = new JSONObject();
        msg.set("msgtype","text");
        //String nickName = null;
        msg.set("text",new JSONObject().set("content","警告,消息队列: "+queueName+" 中的消息已经超出设定值,请尽快进行处理" ));
        msg.set("at",new JSONObject().set("atMobiles",array));
        String json = JSONUtil.toJsonStr(msg);
      HttpRequest.post(url).body(json).execute().body();
    }

测试方法

@SpringBootTest
public class MQMessageCount {
    @Autowired
    private RabbitMQHttpService rabbitMQHttpService;
    @Test
    public void test(){
        rabbitMQHttpService.getQueueMessageCount("guest","guest","ordering_ok_wms");
    }
    @Test
    public void test2(){
        rabbitMQHttpService.getQueueMessageCount("guest","guest");
    }
}

使用XXl_Job监控队列消消息是否超出指定数量

XXL_Job调度配置

{

"url":"http://192.169.31.400:15672/api/queues/%2f/canal_q01","method":"GET","body":"","header":"Authorization:Basic Z3Vlc3Q6Z3Vlc3Q= ","count":"1"

}

@XxlJob("httpJobHandler")
 public void httpJobHandler() throws Exception {

        String param = XxlJobHelper.getJobParam();
        HashMap map = JSONUtil.toBean(param, HashMap.class);
        String url = map.get("url").toString();
        String method = map.get("method").toString();
        String body = map.get("body").toString();
        Integer count = Integer.valueOf(map.get("count").toString());
        String[] headers = map.get("header").toString().split(":");

        String ResultBody = HttpRequest.of(url).method(Method.GET).header(headers[0], headers[1]).execute().body();
        //通过ResultBody获得返回过来的数据并转换成json字符串
        Map ResultMap = JSONUtil.toBean(ResultBody, HashMap.class);
        Integer messagesCount = (Integer)ResultMap.get("messages");
        //获得队列名称
        String queueName = (String)ResultMap.get("name");
        if (messagesCount > count){
            SendMessage(queueName);
        }
    }

 private void SendMessage(String queueName ){
        String url="https://钉钉Api";
        //存放at内部信息
        JSONArray array = new JSONArray();
        array.add("17839697920");
        //存放机器人的一些Json字符串
        JSONObject msg = new JSONObject();
        msg.set("msgtype","text");
        //String nickName = null;
        msg.set("text",new JSONObject().set("content","警告,消息队列: "+queueName+" 中的消息已经超出设定值,请尽快进行处理" ));
        msg.set("at",new JSONObject().set("atMobiles",array));
        String json = JSONUtil.toJsonStr(msg);
        HttpRequest.post(url).body(json).execute().body();
    }

3、为什么在HttpRequest连接中使用%2f

有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,需要使用特殊的编码格式

编码格式为 %后面跟对应字符的ASCII(16进制)码值

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

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

相关文章

Leetcode 最小覆盖子串

解题思路&#xff1a; 哈希表存储字符频率&#xff1a;首先统计字符串 t 中每个字符出现的次数。滑动窗口&#xff1a;用两个指针 left 和 right 来标记当前窗口的左右边界&#xff0c;不断右移 right&#xff0c;直到包含了所有 t 中的字符。然后尝试右移 left&#xff0c;缩…

python爬虫/引用requests/基本使用

1.安装requests 进入控制台使用该命令安装requests pip3 install requests 2.对网站使用get请求 这里用对网站进行get请求&#xff0c;然后打印。 import requests //引用requestsresponse requests.get(urlhttps://www.bilibili.com/)print(response.text) 3.对网站使用…

2024全国研究生数学建模竞赛(数学建模研赛)ABCDEF题深度建模+全解全析+完整文章

全国研究生数学建模竞赛&#xff08;数学建模研赛&#xff09;于9月21日8时正式开赛&#xff0c;赛程4天半&#xff0c;咱这边会在开赛后第一时间给出对今年的6道赛题的评价、分析和解答。包括ABCDEF题深度建模全解全析完整文章&#xff0c;详情可以点击底部的卡片来获取哦。 …

座椅空置状态检测系统源码分享

座椅空置状态检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

大模型之基准测试集(Benchmark)-给通义千问2.0做测评的10个权威测基准测评集

引言 在去年(2023)云栖大会上&#xff0c;阿里云正式发布千亿级参数大模型通义千问2.0。据现场介绍&#xff0c;在10个权威测评中&#xff0c;通义千问2.0综合性能超过GPT-3.5&#xff0c;正在加速追赶GPT-4。以下是通义千问在MMLU、C-Eval、GSM8K、HumanEval、MATH等10个主流…

基于Springboot共享充电宝管理系统JAVA|VUE|SSM计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统&#xff1a;Window操作系统 2、开发工具&#xff1a;IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

openEuler普通用户su root时Permission denied

openEuler普通用户su root时Permission denied 背景&#xff1a; openEuler默认普通用户是不能通过su切换到root用户的 如果想通过su切换到root&#xff0c;有以下两个解决办法 1、修改/etc/pam.d/su 文件 [rootlocalhost ~]# vim /etc/pam.d/su #修改21行&#xff0c;将“…

视频怎么制作成二维码?视频轻松生成二维码的3步操作

现在很多人为了能够更快捷的实现视频内容的分享&#xff0c;会通过将视频生成二维码的方式&#xff0c;让其他人可以通过扫描二维码来查看视频内容。这种方式不需要用户存储视频&#xff0c;扫码就能够在设备上查看视频&#xff0c;有利于提升查看视频的便捷性&#xff0c;可以…

图片压缩工具免费怎么找?归纳了这几个压缩工具

有哪些图片压缩工具免费&#xff1f;在数字化时代&#xff0c;图像已成为我们生活中不可或缺的一部分。无论是网站设计、社交媒体分享还是文件传输&#xff0c;高质量的图片都扮演着重要的角色。但高质量往往意味着大文件体积&#xff0c;这可能会导致加载速度变慢或存储空间不…

打造以太坊数据监控利器:InfluxDB与Grafana构建Geth可视化分析平台

前言 以太坊客户端收集大量数据&#xff0c;这些数据可以按时间顺序数据库的形式读取。为了简化监控&#xff0c;这些数据可以输入到数据可视化软件中。在此页面上&#xff0c;将配置 Geth 客户端以将数据推送到 InfluxDB 数据库&#xff0c;并使用 Grafana 来可视化数据。 一…

Android13中Android.mk和Android.bp预编译多种架构文件

需求&#xff1a; 1&#xff0c; 当前有多个架构的config文件&#xff0c;但是需要不同架构使用不同config文件 2&#xff0c; 必须将config文件拷贝到out/host目录下 常规思路 在Android.bp中&#xff0c; 一般在编译多架构文件时&#xff0c;都会使用arch属性&#xff…

Tauri 应用 input 输入自动大写问题定位解决

使用 Tauri React 开发 MinApi(http api接口测试工具) 时&#xff0c;在 Mac 系统中遇到一个很奇怪的问题&#xff1a;在 input 输入框中输入内容时&#xff0c;如果输入的是全小写英文字母&#xff0c;会自动将首字母转换为大写&#xff0c;效果如下图所示。 问题定位 经过排…

WebRTC关键技术及应用场景:EasyCVR视频汇聚平台高效低延迟视频监控解决方案

众所周知&#xff0c;WebRTC是一项开源的实时通信技术&#xff0c;它通过集成音频、视频和数据传输到Web浏览器中&#xff0c;使得实时通信变得简单且无需任何插件或第三方软件。WebRTC不仅是一个API&#xff0c;也是一系列关键技术和协议的集合&#xff0c;它的出现改变了传统…

代码随想录算法训练营Day14 | 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

目录 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度 226.翻转二叉树 题目 226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例1&#…

Android下反调试与反反调试

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 反调试检测 反调试检测的几种方式。 1. TrackerId 首先&#xff0c;通过 IDA Pro 的调试器附加到当前 app 进程 关于IDA Pro调试android app的详细教程可以…

必应广告投放推广收费标准和流程

在当今竞争激烈的商业环境中&#xff0c;如何精准高效地推广产品与服务&#xff0c;成为企业面临的重大挑战。微软必应Bing广告平台&#xff0c;凭借其强大的技术实力和精准的数据分析能力&#xff0c;已成为众多企业广告推广的首选。云衔科技作为业界领先的数字化营销服务商&a…

【机器学习-无监督学习】聚类

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

安卓系统升级后,关于Fiddler工具不能抓取https接口问题

问题原因&#xff1f; 目前安卓手机可以抓取的https接口都在安卓7.0版本以下&#xff0c;有时候抓取Android7.0版本或以上的接口抓取不到 因为Android7.0之后常规手段不能抓Https的包&#xff0c;应用会默认不信任用户安装的证书(手机里自己安装的证书)&#xff0c;只信任系统…

最新版FaceFusion3.0.0,最强AI换脸,表情修改,视频换脸,年龄修改,多人换脸,面部遮挡换脸,参数调优

主要修改&#xff1a;表情修改,视频换脸,年龄修改,多人换脸,面部遮挡换脸,参数调优 变更日志 改造一切皆工作的建筑介绍pixel boost换脸者为面部检测器添加多角度处理引入年龄修正处理器推出 Live Portrait 表情恢复处理器推出由 Live Portrait 提供支持的脸部编辑处理器用res…

视频制作软件哪个好?前十名推荐!

在视频制作领域&#xff0c;选择合适的软件是提升创作效率和作品质量的关键。本文将根据软件的适用人群&#xff1a;新手入门和专业领域&#xff0c;以及推荐的书籍&#xff0c;为您详细介绍视频制作软件的前十名。 新手入门级别&#xff1a; 1.影忆 功能特点&#xff1a;新手入…