当前位置: 首页 > news >正文

【微服务】分布式调度框架PowerJob使用详解

目录

一、前言

二、定时任务调度框架概述

2.1 为什么需要定时任务调度框架

2.2 定时任务调度使用场景

三、PowerJob 介绍

3.1 PowerJob 概述

3.2 PowerJob 功能特性

3.3 PowerJob 应用场景

3.4 PowerJob 与其他同类产品对比

四、PowerJob 部署

4.1 PowerJob 架构

4.2 部署方式介绍

4.3 idea本地部署

4.3.1 获取源码

4.3.2 导入idea

4.3.3 创建数据库

4.3.4 修改配置文件

4.3.5 启动服务

4.3.6 用户注册

4.4 linux部署

4.4.1 本地打包

4.4.2 上传服务器并启动

五、PowerJob快速使用

5.1 新建任务

5.2 修改配置文件并启动服务

5.3 任务执行日志

六、springboot接入PowerJob

6.1 springboot接入PowerJob操作过程

6.1.1 引入依赖包

6.1.2 配置连接信息

6.1.3 自定义执行器类

6.1.4 新建任务并使用自定义执行器

6.1.5 执行任务

七、写在文末


一、前言

定时调度这类需求,在很多项目的业务场景中基本上都会涉及到,尤其是分布式微服务项目,涉及到调度的场景随处可见。对一个运行中的项目来说,接入定时调度技术难度并不大,比如像spring自带的Scheduled 注解,老牌调度框架Quartz ,以及Spring 提供了 TaskScheduler 和 ThreadPoolTaskScheduler 接口,都可用于调度任务的执行。

但是随着项目架构的微服务化改造之后,传统的只有单一调度功能的技术组件很难再满足复杂业务场景下的调度需求,比如任务重试,任务转移等,这就需要功能更强大的带有分布式调度的组件,像xxl-job,ElasticJob,PowerJob 等,不仅功能更强大,而且提供了可视化的UI配置界面,能够更好的适配分布式调度任务下的各种场景。

二、定时任务调度框架概述

2.1 为什么需要定时任务调度框架

定时调度任务框架在实际应用中有非常重要的作用,具体来说:

  • 自动化操作

    • 定时调度任务框架能够自动执行预定的操作,如数据备份、系统监控等,减少人为干预的需要,提高效率。

  • 任务管理:

    • 通过任务框架可以对各种任务进行管理和监控,包括任务执行状态、时间安排以及错误处理等。

  • 资源优化

    • 合理地安排任务的执行时间,可以更好地利用系统资源,避免任务之间的冲突和资源浪费。

  • 提高可靠性

    • 通过定时调度任务框架,可以确保重要任务按时执行,从而提高系统的可靠性和稳定性。

2.2 定时任务调度使用场景

定时任务调度框架适用于很多场景,包括但不限于以下几个方面:

  • 数据处理和清洗

    • 定时任务可以用于对数据进行周期性的处理和清洗,例如数据备份、数据同步、数据转换等操作。

  • 定时任务调度

    • 显而易见,定时任务框架最主要的用途就是调度各种类型的定时任务,确保任务按照预定的时间和规则执行。

  • 系统监控和报告

    • 定时任务可用于收集系统指标、生成报告和执行健康检查,帮助监控系统的运行状态并及时发现问题。

  • 发送通知

    • 定时任务可以用于定期发送邮件通知,短信,例如定时发送报表、定时提醒等。

  • 定时数据采集

    • 定时任务可用于周期性地从外部数据源获取数据,用于分析、处理或展示。

  • 缓存刷新

    • 定时任务可用于定期刷新缓存数据,保持缓存数据的最新性,提高系统性能。

三、PowerJob 介绍

3.1 PowerJob 概述

PowerJob 是一个基于分布式任务调度和数据处理框架,用于解决任务调度和数据处理的问题。它使用 Spring Boot 和 Spring Cloud 进行开发,支持多种任务类型,包括定时任务、异步任务、数据处理等。

官网地址:PowerJob

具体来说:

  • 它提供了可靠的任务调度、分布式计算、高可用性和自动扩展等功能,使得分布式任务调度更加方便、高效和可靠;

  • PowerJob 基于分布式协调服务(如ZooKeeper)和分布式消息队列(如RocketMQ)实现任务的调度和执行;

  • PowerJob 支持将任务分布在多台机器上执行,通过对任务的监控和管理实现任务的可靠执行;

  • PowerJob还提供了丰富的任务调度功能,如定时触发、依赖关系、失败重试、超时控制等,满足不同业务场景下的任务调度需求;

3.2 PowerJob 功能特性

PowerJob(原OhMyScheduler)是全新一代分布式任务调度与计算框架,其主要功能特性如下:

  • 使用简单

    • 提供前端Web界面,允许开发者可视化地完成调度任务的管理(增、删、改、查)、任务运行状态监控和运行日志查看等功能。

  • 定时策略完善

    • 支持 CRON 表达式、固定频率、固定延迟和API四种定时调度策略。

  • 执行模式丰富

    • 支持单机、广播、Map、MapReduce 四种执行模式,其中 Map/MapReduce 处理器能使开发者寥寥数行代码便获得集群分布式计算的能力

  • 工作流支持

    • 支持在线配置任务依赖关系(DAG),以可视化的方式对任务进行编排,同时还支持上下游任务间的数据传递,以及多种节点类型(判断节点 & 嵌套工作流节点)。

  • 执行器支持广泛

    • 支持 Spring Bean、内置/外置 Java 类,另外可以通过引入官方提供的依赖包,一键集成 Shell、Python、HTTP、SQL 等处理器,应用范围广。

  • 运维便捷

    • 支持在线日志功能,执行器产生的日志可以在前端控制台页面实时显示,降低 debug 成本,极大地提高开发效率。

  • 依赖精简

    • 最小仅依赖关系型数据库(MySQL/**PostgreSQL/Oracle/MS SQLServer...)**

  • 高可用 & 高性能

    • 调度服务器经过精心设计,一改其他调度框架基于数据库锁的策略,实现了无锁化调度。部署多个调度服务器可以同时实现高可用和性能的提升(支持无限的水平扩展)。

  • 故障转移与恢复

    • 任务执行失败后,可根据配置的重试策略完成重试,只要执行器集群有足够的计算节点,任务就能顺利完成。

3.3 PowerJob 应用场景

PowerJob 具备其他的任务调度框架的功能同时,还加入了一些其他的新功能特性,比如工作流,分布式处理业务等,官方给出的场景应用如下:

  • 有定时执行需求的业务场景:如每天凌晨全量同步数据、生成业务报表、未支付订单超时取消等;

  • 有需要全部机器一同执行的业务场景:如使用广播执行模式清理集群日志;

  • 有需要分布式处理的业务场景:比如需要更新一大批数据,单机执行耗时非常长,可以使用Map/MapReduce 处理器完成任务的分发,调动整个集群加速计算;

  • 有需要延迟执行某些任务的业务场景:比如订单过期处理等。

更通用来说,PowerJob 具备如下普适的使用场景:

  • 定时任务调度

    • PowerJob 提供了灵活的定时任务调度功能,可以按照设定的时间规则执行任务,适用于定时统计、数据备份等场景。

  • 分布式任务协调

    • PowerJob 可以协调和管理分布式系统中的各个任务节点,确保任务的顺利执行和结果的一致性。

  • 数据处理和计算

    • PowerJob 可用于处理大规模数据集的计算和处理任务,支持并行计算和分布式处理,提高任务执行效率。

  • 实时数据处理

    • PowerJob 支持实时数据处理任务,可以满足对数据处理速度要求较高的应用场景,如实时监控、实时报表生成等。

  • 弹性扩展

    • PowerJob 可以根据任务负载自动进行弹性扩展,提高系统的稳定性和可靠性。

3.4 PowerJob 与其他同类产品对比

PowerJob 的设计目标为企业级的分布式任务调度平台,即成为公司内部的任务调度中间件。整个公司统一部署调度中心 powerjob-server,旗下所有业务线应用只需要依赖 powerjob-worker 即可接入调度中心获取任务调度与分布式计算能力。

在任务调度的解决方案中,行业内也有不少知名成熟的组件,比如xxl-job,elastic-job等,下面列举几种常用的任务调度技术框架,方便进行学习和对比。

QuartZxxl-jobSchedulerX 2.0PowerJob
定时类型CRONCRONCRON、固定频率、固定延迟、OpenAPICRON、固定频率、固定延迟、OpenAPI
任务类型内置Java内置Java、GLUE Java、Shell、Python等脚本内置Java、外置Java(FatJar)、Shell、Python等脚本内置Java、外置Java(容器)、Shell、Python等脚本
分布式任务静态分片MapReduce 动态分片MapReduce 动态分片
在线任务治理不支持支持支持支持
日志白屏化不支持支持不支持支持
调度方式及性能基于数据库锁,有性能瓶颈基于数据库锁,有性能瓶颈不详无锁化设计,性能强劲无上限
报警监控邮件短信邮件,提供接口允许开发者扩展
系统依赖关系型数据库(MySQL、Oracle...)MySQL人民币任意 Spring Data Jpa支持的关系型数据库(MySQL、Oracle...)
DAG 工作流不支持不支持支持不支持

四、PowerJob 部署

4.1 PowerJob 架构

下图是powerjob官方架构图,从架构图颜色可以看出主体就分了两个大块和一小条:调度中心、执行器、Akka,关于其核心的组件做如下介绍说明:

  • 调度中心 powerjob-server

    • PowerJob 的设计目标为企业级的分布式任务调度平台,即成为调度中间件,让任意业务线的应用仅需要依赖 powerjob-worker 即可获取任务调度与分布式计算的能力。因此,PowerJob 的理想部署模式为一个公司统一部署 powerjob-server 集群,各业务线应用直接接入使用。

  • 执行器 powerjob-worker

    • 根据以前对定时任务的理解,用过Quartz的话,这里相当于Job这个接口;用过ElasticJob的话,最起码相当于Job接口中的一种,比如SimpleJob接口;用过xxl-job的话,这里也是同理,相当于使用了注解@XxlJob的方法。因此,所有需要执行的任务,mars酱的理解都需要依赖powerjob-worker的。

  • Akka ActorSystem

    • 基于Actor模型设计的,专用于构建高度并发、分布式和弹性的工具包,号称单台机器上高达 200 亿条消息/秒。从架构图来看,PowerJob用来做数据交换传输,这么牛逼的中间协议处理者,看来PowerJob团队一定是想往大了搞的。

4.2 部署方式介绍

PowerJob 提供了多种部署方式,比如以jar包的方式在服务器部署运行,也可以进行docker容器部署。那么部署的是什么呢?实际上就是在上面架构图中介绍的,即powerjob-server。简单理解就是说,powerjob-server就是一个任务调度中心的服务端,通过 powerjob-server,用户可以方便地管理和调度分布式任务,实现任务的高效执行和监控。同时,它支持任务的依赖关系配置、任务失败重试、任务超时处理等功能,能够帮助用户构建稳定可靠的任务调度系统。

可对比理解很多技术中间件的服务端,像mysql,es等,都需要先搭建一个服务端,然后应用才能接入进去执行自身的业务操作。

powerjob部署方式:

  • 本地idea部署

    • 即本地直接运行工程,启动服务端;

    • 开发或测试的时候可以使用,生产环境不允许;

  • linux部署

    • 将源码下载之后进行打包构建,然后在linux上启动;

  • docker部署

    • 通过docker命令启动powerjob-server的镜像;

4.3 idea本地部署

4.3.1 获取源码

通过git或gitee下载源码到本地;

这里我使用4.3.9的版本;

4.3.2 导入idea

将工程导入idea之后,工程结构如下,部署测试阶段重点关注下面标注的两个模块:

4.3.3 创建数据库

powerjob运行过程中产生的调度数据需要进行持久化存储,因此需要提前创建数据库,在powerjob-server启动时会自动创建数据表。

CREATE DATABASE IF NOT EXISTS `powerjob-daily` DEFAULT CHARSET utf8mb4;

4.3.4 修改配置文件

找到下面这个配置文件

修改位置1,数据库连接:

  • 修改数据库连接地址jdbc-url,指向自己的数据库地址;

  • 修改数据库连接的用户名和密码;

####### 外部数据库配置(需要用户更改为自己的数据库配置) #######
spring.datasource.core.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.core.jdbc-url=jdbc:mysql://IP:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.core.username=root
spring.datasource.core.password=root
spring.datasource.core.maximum-pool-size=20
spring.datasource.core.minimum-idle=5

修改位置2;

  • 可以使用mongodb,只需开启一下即可;

  • 也可以使用mysql,配置连接一下mysql的连接即可;

####### mongoDB配置,非核心依赖,通过配置 oms.mongodb.enable=false 来关闭 #######
#oms.storage.dfs.mongodb.uri=mongodb+srv://zqq:No1Bug2Please3!@cluster0.wie54.gcp.mongodb.net/powerjob_daily?retryWrites=true&w=majority
oms.storage.dfs.mysql_series.driver=com.mysql.cj.jdbc.Driver
oms.storage.dfs.mysql_series.url=jdbc:mysql://IP:3306/powerjob-daily?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
oms.storage.dfs.mysql_series.username=root
oms.storage.dfs.mysql_series.password=root
oms.storage.dfs.mysql_series.auto_create_table=true

修改位置3,邮件设置

####### 邮件配置(不需要邮件报警可以删除以下配置来避免报错) #######
spring.mail.host=smtp.163.com
spring.mail.username=zqq@163.com
spring.mail.password=GOFZPNARMVKCGONV
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

其他的配置保持默认即可,用到的时候再配置也可以。

4.3.5 启动服务

powerjob-server-starter模块是一个springboot工程,直接启动即可,启动完成后可以看到相关的数据表初始化出来了;

访问地址:http://127.0.0.1:7700,来到下面的控制台界面;

4.3.6 用户注册

注册一个应用,这个应用可以理解为一个账户,注册完成之后,用这个应用账号和密码登录

登录之后就来到控制台主页

界面上功能的的具体使用,后文将会陆续提到。

4.4 linux部署

4.4.1 本地打包

使用maven命令打出jar包

4.4.2 上传服务器并启动

这里做下模拟,找到打好的jar,然后使用java -jar命令启动即可

五、PowerJob快速使用

5.1 新建任务

在任务管理 —>新建任务,创建一个新的任务;

填写表单参数,注意标注的是非必填的内容,如果不清楚参数含义的话;

在上面的表单项中,任务每隔10秒执行一次,创建完成之后,在任务列表页就可以看到这条新建的任务。

5.2 修改配置文件并启动服务

找到工程中的worker-samples模块,该模块提供了一些测试用的任务样例,即任务的处理器示例,可直接使用;

使用之前,首先要修改配置文件中的应用名称,使用上午中创建的那个应用;

我们选择样例中的StandaloneProcessorDemo这个类作为测试,在上面的任务表单参数中,也使用的是这个类的全类名,以上配置都完成之后,运行SampleApplication即可。然后在任务列表中点击运行。

稍等一会,在控制台上面就能看到类中输出的日志信息,而后按照没10秒的频率输出,同时还将任务中的参数输出了出来。

5.3 任务执行日志

点击任务后的更多—>运行记录,可以查看任务运行时的日志信息。

点击每一条日志记录进去,可以查看每一条执行日志的详情,如果任务执行过程中有报错也可以通过检查日志进行分析定位。

六、springboot接入PowerJob

如何基于当前的springboot项目接入PowerJob呢?下面看具体的操作步骤。

6.1 springboot接入PowerJob操作过程

6.1.1 引入依赖包

依赖包的版本可以根据自身的需求选择,这里选择版本时,尽量与powerjob服务端版本保持一致

<dependency><groupId>tech.powerjob</groupId><artifactId>powerjob-worker-spring-boot-starter</artifactId><version>4.3.8</version>
</dependency>

6.1.2 配置连接信息

注意应用名称填写上面注册的那个应用名称,这里推荐直接将源码中样例的配置文件拿过来稍做修改即可;

server.port=7788
spring.jpa.open-in-view=false
powerjob.worker.enabled=true
powerjob.worker.allow-lazy-connect-server=false
powerjob.worker.port=27777
powerjob.worker.app-name=app_test
powerjob.worker.server-address=127.0.0.1:7700,127.0.0.1:7701
powerjob.worker.protocol=http
powerjob.worker.store-strategy=disk
powerjob.worker.max-result-length=4096
powerjob.worker.max-appended-wf-context-length=4096

6.1.3 自定义执行器类

自定义一个执行器,实现BasicProcessor接口,然后重写里面的process方法,可以参考上面的源码工程中的示例类变现;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import tech.powerjob.worker.core.processor.ProcessResult;
import tech.powerjob.worker.core.processor.TaskContext;
import tech.powerjob.worker.core.processor.sdk.BasicProcessor;@Component
@Slf4j
public class MyProcessor implements BasicProcessor {@Overridepublic ProcessResult process(TaskContext taskContext) throws Exception {log.info("MyProcessor fetch ...");return new ProcessResult(true, taskContext + ": ProcessResult fetch success" );}
}

6.1.4 新建任务并使用自定义执行器

在控制台创建一个新的任务,并使用上述自定义的执行器,如下图

6.1.5 执行任务

运行springboot工程,启动完成后,选择任务列表中上面的这个自定义执行器任务,点击执行

然后就能看到任务开始执行了,控制台可以看到代码中的日志输出  

 

同时任务的执行日志也可以看到详细的执行信息 

七、写在文末

 分布式调度任务在越来越多的业务场景中发挥着重要的作用,在一些大型的平台中,任务调度甚至可以作为一个重要的业务板块承担着不可替代的角色,不管是哪种任务调度框架,掌握其核心的设计思想,才能根据自身的场景选择合理的任务调度框架进行使用,本篇到此结束,感谢观看!

相关文章:

【微服务】分布式调度框架PowerJob使用详解

目录 一、前言 二、定时任务调度框架概述 2.1 为什么需要定时任务调度框架 2.2 定时任务调度使用场景 三、PowerJob 介绍 3.1 PowerJob 概述 3.2 PowerJob 功能特性 3.3 PowerJob 应用场景 3.4 PowerJob 与其他同类产品对比 四、PowerJob 部署 4.1 PowerJob 架构 4.…...

一命通关广度优先遍历

前言 在这篇文章之前&#xff0c;已对非线性结构遍历的另一种方法——深度优先遍历进行了讲解&#xff0c;其中很多概念词都是共用的。为了更好的阅读体验&#xff0c;最好先在掌握或起码了解dfs的基础上&#xff0c;再来阅读本文章&#xff0c;否则因为会有很多概念词看不明白…...

力扣4寻找两个正序数组的中位数

1.实验内容 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 2.实验目的 算法的时间复杂度应该为 O(log (mn)) 。 3.基本思路 碰到时间复杂度要求log的&#xff0c;肯定用二分查找&…...

jmeter之常用函数-第六天

1.常见函数&#xff1a; _counter 计数器函数 TRUE(每个用户都有自己的计数器) FALSE(所有用户共用一个计数器) _Random 随机数函数 参数1:取值范围最小值(包含) 参数2:取值范围最大值(包含) _time 获取当前时间的函数 无参: 获取的是距离 1970/01/01 00:00:00 的毫秒值 参…...

原创!分解+集成思想新模型!VMD-CNN-BiGRU-Attention一键实现时间序列预测!以风速数据集为例

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 数据介绍 模型流程 创新点 结果展示 部…...

ab (Apache benchmark) - 压力/性能测试工具

Apache benchmark&#xff08;ab&#xff09; 安装window安装使用方法 - bin目录运行使用方法 - 任意目录运行 linux安装 基本命令介绍常用参数:输出结果分析&#xff1a; ab的man手册 安装 window安装 官网下载链接&#xff1a;https://www.apachehaus.com/cgi-bin/download…...

除了Confluence,有没有其他工具一样好用?

每个团队都需要一个协同工作工具&#xff0c;以更有效地管理任务、跟踪进度和分享知识。这就是Atlassian的Confluence发挥作用的地方。然而&#xff0c;尽管它相当强大&#xff0c;其昂贵的价格和复杂的界面可能会让某些用户望而却步。所以&#xff0c;还有其他工具可以替代Con…...

查询表中数据(全列/特定列/表达式,where子句(比较/逻辑运算符),order by子句,limit筛选分页),mysql执行顺序

目录 select 全列查询 特定列查询 用表达式查询 (as) 名字 distinct 去重 where子句 比较运算符 列数据之间的比较 ​编辑 别名不能参与比较 null查询 between and in ( ... , ...) 模糊匹配 逻辑运算符 order by子句 可以使用别名 总结mysql执行顺…...

【Linux】多线程概念 | POSIX线程库

文章目录 一、线程的概念1. 什么是线程Linux下并不存在真正的多线程&#xff0c;而是用进程模拟的&#xff01;Linux没有真正意义上的线程相关的系统调用&#xff01;原生线程库pthread 2. 线程和进程的联系和区别3. 线程的优点4. 线程的缺点5. 线程异常6. 线程用途 二、二级页…...

Java Spring AOP代码3分钟快速入手

AOP Spring入门(十)&#xff1a;Spring AOP使用讲解 - 掘金 maven的依赖&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId> </dependency> <!--aspectj支持--> <dependen…...

.NET开源快速、强大、免费的电子表格组件

今天大姚给大家分享一个.NET开源&#xff08;MIT License&#xff09;、快速、强大、免费的电子表格组件&#xff0c;支持数据格式、冻结、大纲、公式计算、图表、脚本执行等。兼容 Excel 2007 (.xlsx) 格式&#xff0c;支持WinForm、WPF和Android平台&#xff1a;ReoGrid。 项…...

docker一键部署若依前后端分离版本

比如这里把文件放到/xin/docker/jiaoZ/的目录下&#xff0c;jar包和下面的配置文件都放在这个文件夹下。 注意要把jar端口改为你实际启动的&#xff0c;映射端口也可以改为你想要的。 这里的映射端口为&#xff1a;nginx监听80端口&#xff0c;jar在8620端口&#xff0c;mysq…...

Java项目开发之fastjson详解

Fastjson 是由阿里巴巴公司开发的一个 Java 语言编写的高性能 JSON 处理库。它主要用于 Java 对象与 JSON 数据格式之间的转换&#xff0c;提供了简单易用的 API 来实现序列化&#xff08;Java 对象转 JSON 字符串&#xff09;和反序列化&#xff08;JSON 字符串转 Java 对象&a…...

面试算法-62-盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。…...

【智能算法】海洋捕食者算法(MPA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年&#xff0c;Afshin Faramarzi 等人受到海洋生物适者生存启发&#xff0c;提出了海洋捕食者算法(Marine Predators Algorithm&#xff0c;MPA)。 2.算法原理 2.1算法思想 MPA根据模拟自然界…...

刷题DAY24 | LeetCode 77-组合

1 回溯法理论基础 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 所以以下讲解中&#xff0c;回溯函数也就是递归函数&#xff0c;指的都是一个函数。 1.1 回溯法的效率 回溯法的性能如何呢&#xff0…...

Spring Boot为什么默认使用CGLIB动态代理

兼容性&#xff1a; 1. CGLIB 动态代理可以代理任何类型的目标类&#xff0c;无论它是否实现了接口&#xff1b;&#xff3b;注意的是&#xff0c;类被 final 修饰&#xff0c;那么该不可被继承&#xff0c;即不可被代理&#xff1b;同样&#xff0c;类中 final 修饰的方法&am…...

算法详解——Dijkstra算法

Dijkstra算法的目的是寻找单起点最短路径&#xff0c;其策略是贪心加非负加权队列 一、单起点最短路径问题 单起点最短路径问题&#xff1a;给定一个加权连通图中的特定起点&#xff0c;目标是找出从该起点到图中所有其他顶点的最短路径集合。需要明确的是&#xff0c;这里关心…...

利用GANs进行图像生成

生成对抗网络&#xff08;GANs&#xff09;是一种深度学习模型&#xff0c;由两部分组成&#xff1a;生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;。它们通过相互竞争来提高生成器生成高质量图像的能力。以下是如何利用GANs进行图像…...

Flutter-底部弹出框(Widget层级)

需求 支持底部弹出对话框。支持手势滑动关闭。支持在widget中嵌入引用。支持底部弹出框弹出后不影响其他操作。支持弹出框中内容固定头部和下面列表时&#xff0c;支持触摸头部并在列表不在头部的时候支持滑动关闭 简述 通过上面的需求可知&#xff0c;就是在界面中可以支持…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...