聊聊PowerJob的UserInfoController

本文主要研究一下PowerJob的UserInfoController

UserInfoController

tech/powerjob/server/web/controller/UserInfoController.java

@RestController
@RequestMapping("/user")
public class UserInfoController {@Resourceprivate UserService userService;@Resourceprivate UserInfoRepository userInfoRepository;@PostMapping("save")public ResultDTO<Void> save(@RequestBody ModifyUserInfoRequest request) {UserInfoDO userInfoDO = new UserInfoDO();BeanUtils.copyProperties(request, userInfoDO);userService.save(userInfoDO);return ResultDTO.success(null);}@GetMapping("list")public ResultDTO<List<UserItemVO>> list(@RequestParam(required = false) String name) {List<UserInfoDO> result;if (StringUtils.isEmpty(name)) {result = userInfoRepository.findAll();}else {result = userInfoRepository.findByUsernameLike("%" + name + "%");}return ResultDTO.success(convert(result));}private static List<UserItemVO> convert(List<UserInfoDO> data) {if (CollectionUtils.isEmpty(data)) {return Lists.newLinkedList();}return data.stream().map(x -> new UserItemVO(x.getId(), x.getUsername())).collect(Collectors.toList());}@Getter@NoArgsConstructor@AllArgsConstructorpublic static final class UserItemVO {private Long id;private String username;}
}

UserInfoController提供了save、list方法,其中save方法用到了userService.save

UserService

tech/powerjob/server/core/service/UserService.java

@Service
public class UserService {@Resourceprivate UserInfoRepository userInfoRepository;/*** 保存/修改 用户* @param userInfoDO user*/public void save(UserInfoDO userInfoDO) {userInfoDO.setGmtCreate(new Date());userInfoDO.setGmtModified(userInfoDO.getGmtCreate());userInfoRepository.saveAndFlush(userInfoDO);}/*** 根据用户ID字符串获取用户信息详细列表* @param userIds 逗号分割的用户ID信息* @return 用户信息详细列表*/public List<UserInfoDO> fetchNotifyUserList(String userIds) {if (StringUtils.isEmpty(userIds)) {return Lists.newLinkedList();}// 去重Set<Long> userIdList = Splitter.on(",").splitToList(userIds).stream().map(Long::valueOf).collect(Collectors.toSet());List<UserInfoDO> res = userInfoRepository.findByIdIn(Lists.newLinkedList(userIdList));res.forEach(x -> x.setPassword(null));return res;}
}

UserService提供了save、fetchNotifyUserList方法

alert

tech/powerjob/server/core/instance/InstanceManager.java

    private void alert(Long instanceId, String alertContent) {InstanceInfoDO instanceInfo = instanceInfoRepository.findByInstanceId(instanceId);JobInfoDO jobInfo;try {jobInfo = instanceMetadataService.fetchJobInfoByInstanceId(instanceId);} catch (Exception e) {log.warn("[InstanceManager-{}] can't find jobInfo, alarm failed.", instanceId);return;}JobInstanceAlarm content = new JobInstanceAlarm();BeanUtils.copyProperties(jobInfo, content);BeanUtils.copyProperties(instanceInfo, content);List<UserInfoDO> userList = SpringUtils.getBean(UserService.class).fetchNotifyUserList(jobInfo.getNotifyUserIds());if (!StringUtils.isEmpty(alertContent)) {content.setResult(alertContent);}alarmCenter.alarmFailed(content, AlarmUtils.convertUserInfoList2AlarmTargetList(userList));}

InstanceManager的alert方法会根据instanceId拉取InstanceInfoDO、JobInfoDO信息,然后根据alertContent创建JobInstanceAlarm,最后通过alarmCenter.alarmFailed(content, AlarmUtils.convertUserInfoList2AlarmTargetList(userList))进行告警;如果用户信息的webHook不为空,则会通过webhook回调;若DingTalkUtils存在且用户信息的phone不为空,则会通过dingTalkUtils.fetchUserIdByMobile(phone)获取dingtalk的userId然后进行dingtalk告警;若javaMailSender实例存在,且配置了from则会通过email进行告警

UserInfoDO

tech/powerjob/server/persistence/remote/model/UserInfoDO.java

@Data
@Entity
@Table(indexes = {@Index(name = "uidx01_user_info", columnList = "username"),@Index(name = "uidx02_user_info", columnList = "email")
})
public class UserInfoDO {@Id@GeneratedValue(strategy = GenerationType.AUTO, generator = "native")@GenericGenerator(name = "native", strategy = "native")private Long id;private String username;private String password;/*** 手机号*/private String phone;/*** 邮箱地址*/private String email;/*** webHook*/private String webHook;/*** 扩展字段*/private String extra;private Date gmtCreate;private Date gmtModified;
}

UserInfoDO定义了id、username、password、phone、email、webHook、extra、gmtCreate、gmtModified属性

相关表

user_info

Create Table: CREATE TABLE `user_info` (`id` bigint NOT NULL AUTO_INCREMENT,`email` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`extra` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`gmt_create` datetime(6) DEFAULT NULL,`gmt_modified` datetime(6) DEFAULT NULL,`password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`phone` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`username` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`web_hook` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,PRIMARY KEY (`id`),KEY `uidx01_user_info` (`username`),KEY `uidx02_user_info` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
1 row in set (0.00 sec)

这里的user_info仅仅作为任务告警用

job_info

CREATE TABLE `job_info` (`id` bigint NOT NULL AUTO_INCREMENT,`alarm_config` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`app_id` bigint DEFAULT NULL,`concurrency` int DEFAULT NULL,`designated_workers` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`dispatch_strategy` int DEFAULT NULL,`execute_type` int DEFAULT NULL,`extra` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`gmt_create` datetime(6) DEFAULT NULL,`gmt_modified` datetime(6) DEFAULT NULL,`instance_retry_num` int DEFAULT NULL,`instance_time_limit` bigint DEFAULT NULL,`job_description` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`job_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`job_params` longtext COLLATE utf8mb4_general_ci,`lifecycle` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`log_config` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`max_instance_num` int DEFAULT NULL,`max_worker_count` int DEFAULT NULL,`min_cpu_cores` double NOT NULL,`min_disk_space` double NOT NULL,`min_memory_space` double NOT NULL,`next_trigger_time` bigint DEFAULT NULL,`notify_user_ids` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`processor_info` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`processor_type` int DEFAULT NULL,`status` int DEFAULT NULL,`tag` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`task_retry_num` int DEFAULT NULL,`time_expression` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,`time_expression_type` int DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx01_job_info` (`app_id`,`status`,`time_expression_type`,`next_trigger_time`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

job_info定义了notify_user_ids字段,存储了任务要告警的用户的id,多个用逗号分隔

小结

PowerJob的UserInfoController提供了save、list方法,其中save方法用到了userService.save;UserService提供了save、fetchNotifyUserList方法;它的userInfo仅仅是作为job的告警用户,其中job_info定义了notify_user_ids字段,存储了任务要告警的用户的id,多个用逗号分隔;InstanceManager的alert方法会根据instanceId拉取InstanceInfoDO、JobInfoDO信息,然后根据alertContent创建JobInstanceAlarm,最后通过alarmCenter.alarmFailed(content, AlarmUtils.convertUserInfoList2AlarmTargetList(userList))进行告警。

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

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

相关文章

课时13:变量基础_变量场景

2.1.1 变量场景 学习目标 这一节&#xff0c; 我们从 数据存储、变量场景、小结 三个方面来学习。 数据存储 数据存储 所谓的数据存储&#xff0c;我们从三方面来理解这句话&#xff1a;1、数据保存到哪里 -- 各种媒介&#xff0c;CPU、内存、磁盘、磁带、网盘...2、数据保…

06:原生云K8S解密|K8S集群安装部署|K8S网络插件

原生云K8S解密&#xff5c;K8S集群安装部署&#xff5c;K8S网络插件 K8SK8S集群架构图解 K8S部署仓库初始化kube-master安装计算节点的安装token管理 配置flannel网络&#xff08;master主机操作&#xff09; K8S 有大量夸主机的容器需要管理&#xff0c;快速部署应用&#xff…

Kotlin-类

构造函数 Java final File file new File("file.txt");Kotlin val file File("file.txt")类 Java public final class User { }Kotlin class User公开类 Java public class User { }Kotlin open class User属性类 Java final class User {pri…

河西走廊潜在蒸散发时空格局变化与气象因素的关系_马亚丽_2023

河西走廊潜在蒸散发时空格局变化与气象因素的关系_马亚丽_2023 摘要关键词 1 数据与方法1.1 数据来源1.2 变化趋势分析1.3 定性分析方法1.3.1 主成分分析1.3.2 相关系数1.3.3 通径分析 1.4 定量分析方法1.4.1 敏感系数1.4.2 贡献率计算 2 结果与分析2.1 ET0多年变化特征2.1.1 E…

pandas+numpy的一些基础总结

都是我白嫖来的知识&#xff0c;当记笔记了 pandas 8 个常用的 set_option 设置方法 - 知乎 (zhihu.com) np.set_printoptions()用法总结-CSDN博客 特别有用

Python绘图工具seaborn,教会你如何绘制更加精美的图形(二)

文章目录 用分类数据绘图1 类别散点图2 类别内的数据分布2.1 绘制箱形图2.2 绘制提琴图 3 类别内的统计估计3.1 绘制条形图3.2 绘制点图 Hello&#xff0c;大家好&#xff0c;我是景天&#xff0c;今天我们探讨下seaborn根据分类数据类绘图的方法 用分类数据绘图 数据集中的数…

【前端模板】bootstrap5实现高端手表网页Chrono(适用电商,附带源码)

一、需求分析 高端手表网页是指专门销售高端手表的在线平台或网站。这些网页旨在向消费者展示和销售高级手表品牌的产品。以下是一些常见的功能&#xff1a; 产品展示&#xff1a;高端手表网页提供详细的产品页面&#xff0c;展示不同品牌和型号的高级手表。这些页面通常包括产…

Vim工具使用全攻略:从入门到精通

引言 在软件开发的世界里&#xff0c;Vim不仅仅是一个文本编辑器&#xff0c;它是一个让你的编程效率倍增的神器。然而&#xff0c;对于新手来说&#xff0c;Vim的学习曲线似乎有些陡峭。本文将手把手教你如何从Vim的新手逐渐变为高手&#xff0c;深入理解Vim的操作模式&#…

Python 数据分析(PYDA)第三版(一)

原文&#xff1a;wesmckinney.com/book/ 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 关于开放版本 第 3 版的《Python 数据分析》现在作为“开放获取”HTML 版本在此网站wesmckinney.com/book上提供&#xff0c;除了通常的印刷和电子书格式。该版本最初于 2022 年…

iOS应用提交上架的最新流程

摘要 本篇博客介绍了iOS应用程序上架的最新流程。包括上架基本需求资料、证书的创建和使用、测试设备的添加、描述文件的创建、打包、审核等步骤。 引言 在开发完iOS应用程序后&#xff0c;我们需要将其提交到App Store上架。然而&#xff0c;随着技术的不断发展&#xff0c;…

11.Ubuntu

目录 1. 什么是Ubuntu 1.1. 概述 1.2. Ubuntu版本简介 1.2.1. 桌面版 1.2.2. 服务器版 2. 部署系统 2.1. 新建虚拟机 2.2. 安装系统 2.3. 部署后的设置 2.3.1. 设置root密码 2.3.2. 关闭防火墙 2.3.3. 启用允许root进行ssh 2.3.4. 安装所需软件 2.3.5. 制作快照 …

vue3学习——mock数据

安装 pnpm install -D vite-plugin-mock mockjsvite.config.js 配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import { viteMockServe } from vite-plugin-mockexport default defineConfig(({ command }) > {return {plugins: [vue(),vite…

三种pdf转ppt方法?学会这几招轻松搞定转换

三种pdf转ppt方法&#xff1f;在当今的工作和生活中&#xff0c;PDF和PPT这两种文件格式常常会让我们感到困扰。有时候我们需要将PDF文件转换成PPT格式&#xff0c;以便更好地进行演示或工作汇报。但是&#xff0c;如何快速、准确地完成这项任务呢&#xff1f;本文将为你揭秘三…

引流技术-通过文件中增加联系方式并传播

文章目录 前言文档增加联系方式扩散网盘扩散自建网站借力 注意 前言 很多人在找资料的时候可能都遇到过下图情况&#xff1a; 1、文档最后面留一个自己的联系方式&#xff1b; 2、找的一堆文件中都有相同的情况&#xff1b; 3、一段时间全网搜到的很多相同文件也有这个联系方式…

ffmpeg 输入文件,输入出udp-ts 指定pid、Programid ts流参数

要使用FFmpeg将输入文件转换为UDP传输流&#xff08;TS&#xff09;并指定特定的PID、Program ID以及其他TS流参数&#xff0c;您可以使用以下命令&#xff1a; ffmpeg -i input_file -c:v libx264 -preset ultrafast -tune zerolatency -f mpegts -map 0:v:0 -map 0:a:0 -pid …

洞察未来趋势,引领技术革新——2023年全球软件开发大会(QCon上海站)全景解析

在全球科技飞速发展的浪潮中&#xff0c;软件开发行业始终扮演着创新引擎的角色。 作为业界瞩目的年度盛会&#xff0c;2023年全球软件开发大会&#xff08;QCon上海站&#xff09;不仅是一场技术交流的嘉年华&#xff0c;更是一次洞察行业趋势、探索未来发展方向的重要平台。…

【Linux】vim的简单使用

我们知道在Windows下的VS2019是一个集成开发环境&#xff0c;也就是说&#xff0c;集编辑&#xff0c;编译&#xff0c;调试等功能都放在了一起&#xff1b;但是在Linux下&#xff0c;这些步骤都是分开的&#xff0c;我们这篇博客就来说一说vim这个编辑器&#xff0c;它只有编辑…

vit细粒度图像分类(十)TransFG学习笔记

1.摘要 细粒度视觉分类(FGVC)是一项非常具有挑战性的任务&#xff0c;它旨在从子类别中识别对象&#xff0c;这是由于类间固有的微妙差异。现有的大部分工作主要是通过重用骨干网络提取检测到的判别区域的特征来解决这一问题。然而&#xff0c;这种策略不可避免地使管道变得复…

搭建k8s集群实战(四)k8s node 资源管理、避免系统无响应

Kubernetes 的节点可以按照 Capacity 调度。默认情况下 pod 能够使用节点全部可用容量。 这是个问题,因为节点自己通常运行了不少驱动 OS 和 Kubernetes 的系统守护进程。 除非为这些系统守护进程留出资源,否则它们将与 pod 争夺资源并导致节点资源短缺问题,从而导致系统无响…

回溯法:回溯法通用模版汇总以及模版应用

从一个问题开始 给定两个整数 n 和 k&#xff0c;返回 1 ... n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4] ] 很容易想到 用两个for循环就可以解决。 如果n为100&#xff0c;k为50呢&#xff0c;那就50层for循…