分布式定时调度-xxl-job

news2024/10/7 10:31:56

分布式定时调度-xxl-job

一.定时任务概述

1.定时任务认识

1.1.什么是定时任务

定时任务是按照指定时间周期运行任务。使用场景为在某个固定时间点执行,或者周期性的去执行某个任务,比如:每天晚上24点做数据汇总,定时发送短信等。

1.2.常见定时任务方案

  • While + Sleep : 通过循环加休眠的方式定时执行
  • Timer和TimerTask实现 :JDK自带的定时任务,可以实现简单的间隔执行任务(在指定时间点执行某一任务,也能定时的周期性执行),无法实现按日历去调度执行任务。
  • ScheduledExecutorService : Java并发包下,JDK1.5出现,是比较理想的定时任务实现方案。Eureka就使用的是它
  • QuartZ : 使用Quartz,它是一个异步任务调度框架,功能丰富,可以实现按日历调度,支持持久化。
  • 使用Spring Task,Spring 3.0后提供Spring Task实现任务调度,支持按日历调度,相比Quartz功能稍简单,但是在开发基本够用,支持注解编程方式。
  • SpringBoot中的Schedule :通过@EnableScheduling+@Scheduled最实现定时任务,底层使用的是Spring Task

2.分布式定时任务

2.1.遇到什么问题

上述的定时任务都是集中式(单体项目使用)的定时任务,在分布式中将会面临一些问题或不足

  • 业务量大,单机性能瓶颈需要扩展
  • 多台机器部署如何保证定时任务不重复执行
  • 定时任务时间需要可调整,可以暂停
  • 机器发生故障down机,定时任务依然可用,如何实现故障转移
  • 定时任务,执行日志是否可监控

2.2.分布式定时任务xxl-job

XXL-JOB是一个分布式任务调度平台,于2015问世,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。其具备且不止如下能力

  • 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
  • 2、动态:支持动态修改任务状态、启动/停止任务,以及终止运行中任务,即时生效;
  • 3、调度中心HA(中心式):调度采用中心式设计,“调度中心”基于集群Quartz实现并支持集群部署,可保证调度中心HA;执行器HA(分布式):任务分布式执行,任务"执行器"支持集群部署,可保证任务执行HA;
  • 4、弹性扩容缩容:一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;
  • 5、路由策略:执行器集群部署时提供丰富的路由策略,包括:第一个、最后一个、轮询、随机、一致性HASH、最不经常使用、最近最久未使用、故障转移、忙碌转移等;
  • 6、故障转移:任务路由策略选择"故障转移"情况下,如果执行器集群中某一台机器故障,将会自动Failover切换到一台正常的执行器发送调度请求。
  • 7、任务失败告警;默认提供邮件方式失败告警,同时预留扩展接口,可方面的扩展短信、钉钉等告警方式;

具体见:https://github.com/xuxueli/xxl-job/tree/v2.0.0

二.XXL-JOB初体验

1.xxl-job架构设计

1.1.设计思想

将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。

将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;

1.2.架构设计图

xxl-job分为 调度中心和执行器两大模块

  • 调度模块(调度中心)
    负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;
    支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover(故障转移)。
  • 执行模块(执行器)
    负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;
    接收“调度中心”的执行请求、终止请求和日志请求等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YotgsgRk-1637138879954)(课件图片/img_Qohm.png)]

  • 调度中心高可用

基于数据库的集群方案,数据库选用Mysql;集群分布式并发环境中进行定时任务调度时,会在各个节点会上报任务,存到数据库中,执行时会从数据库中取出触发器来执行,如果触发器的名称和执行时间相同,则只有一个节点去执行此任务。

  • 并行调度

调度采用线程池方式实现,避免单线程因阻塞而引起任务调度延迟。XXL-JOB调度模块默认采用并行机制,在多线程调度的情况下,调度模块被阻塞的几率很低,大大提高了调度系统的承载量。

XXL-JOB的不同任务之间并行调度、并行执行。XXL-JOB的单个任务,针对多个执行器是并行运行的,针对单个执行器是串行执行的。同时支持任务终止。

  • 执行器(任务)高可用

执行器如若集群部署,调度中心将会感知到在线的所有执行器,如“127.0.0.1:9997, 127.0.0.1:9998, 127.0.0.1:9999”。多个执行器可以选择“路由策略”来采用轮询,随机等方式进行多机器调度。

当任务”路由策略”选择”故障转移(FAILOVER)”时,当调度中心每次发起调度请求时,会按照顺序对执行器发出心跳检测请求,第一个检测为存活状态的执行器将会被选定并发送调度请求。调度成功后,可在日志监控界面查看“调度备注”

更多功能见:https://www.xuxueli.com/xxl-job/#%E4%BA%94%E3%80%81%E6%80%BB%E4%BD%93%E8%AE%BE%E8%AE%A1

2.xxl-job安装

2.1.下载源码

请下载项目源码并解压,使用IDEA工具导入项目

源码仓库地址Release Download
https://github.com/xuxueli/xxl-jobDownload
http://gitee.com/xuxueli0323/xxl-jobDownload

项目代码结构如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GcV8gQVU-1637138879958)(课件图片/1637133624058.png)]

  • doc : 文档,即SQL脚本所在目录
  • db : “调度数据库”建表脚本
  • xxl-job-admin : 调度中心项目源码
  • xxl-job-core : 核心模块,公共Jar依赖
  • xxl-job-executor-samples : 执行器,Sample示例项目(大家可以在该项目上进行开发,也可以将现有项目改造生成执行器项目)

2.2.导入数据库

打开项目代码,获取 “调度数据库初始化SQL脚本” 并执行即可。“调度数据库初始化SQL脚本” 位置为: /xxl-job/doc/db/tables_xxl_job.sql ,数据库名:xxl_job

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eCxldsYU-1637138879960)(课件图片/1637133468426.png)]

数据库如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dgd07HmX-1637138879962)(课件图片/1637133507365.png)]

  • xxl_job_lock:任务调度锁表;
  • xxl_job_group:执行器信息表,维护任务执行器信息;
  • xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
  • xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
  • xxl_job_log_report:调度日志报表:用户存储XXL-JOB任务调度日志的报表,调度中心报表功能页面会用到;
  • xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
  • xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
  • xxl_job_user:系统用户表;

2.3.启动调度中心

打开 xxl-job-admin 的配置文件,/xxl-job/xxl-job-admin/src/main/resources/application.properties 对调度中心进行配置,重要配置如下

  • server.port : 根据情况修改端口
  • spring.datasource.url : 指向刚才准备的数据库
  • spring.datasource.password : 记得修改成自己的数据库密码
  • spring.mail.username : 配置自己的邮件账号
  • spring.mail.password :邮件的授权码,我下面是以qq邮箱为例

下面根据自己的情况进行修改,不要直接复制

### 调度中心JDBC链接:链接地址请保持和 2.1章节 所创建的调度数据库的地址一致
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root_pwd
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
### 报警邮箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxx@qq.com
spring.mail.password=邮箱授权码,不是登录密码
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
### 调度中心通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 调度中心国际化配置 [必填]: 默认为 "zh_CN"/中文简体, 可选范围为 "zh_CN"/中文简体, "zh_TC"/中文繁体 and "en"/英文;
xxl.job.i18n=zh_CN
## 调度线程池最大线程配置【必填】
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### 调度中心日志表数据保存天数 [必填]:过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能;
xxl.job.logretentiondays=30

然后启动调度中心 ,执行 XxlJobAdminApplication#main 方法 , 启动之后,浏览器访问 http://localhost:18080/xxl-job-admin/jobinfo?jobGroup=2 ;注意URL中有个上下文路径。默认登录账号 “admin/123456”, 登录后运行界面如下图所示。

img

2.3.配置部署“执行器项目

“执行器”项目:xxl-job-executor-sample-springboot (提供多种版本执行器供选择,现以 springboot 版本为例,可直接使用,也可以参考其并将现有项目改造成执行器)

作用:负责接收“调度中心”的调度并执行;可直接部署执行器,也可以将执行器集成到现有业务项目中。

修改配置:/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties

  • xxl.job.admin.addresses : 调度中心的地址,如果调度中心修改过端口,这里也要对应修改
### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:18080/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-executor-sample
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=30

上面配置是为了在Spring容器中创建一个 XxlJobSpringExecutor 执行器Bean,见:com.xxl.job.executor.core.config.XxlJobConfig#xxlJobExecutor

@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
    logger.info(">>>>>>>>>>> xxl-job config init.");
    XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
    xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
    xxlJobSpringExecutor.setAppname(appname);
    xxlJobSpringExecutor.setAddress(address);
    xxlJobSpringExecutor.setIp(ip);
    xxlJobSpringExecutor.setPort(port);
    xxlJobSpringExecutor.setAccessToken(accessToken);
    xxlJobSpringExecutor.setLogPath(logPath);
    xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);

    return xxlJobSpringExecutor;
}

com.xxl.job.executor.service.jobhandler.SampleXxlJob中提供了简单的定时任务实例

为方便用户参考与快速实用,示例执行器内原生提供多个Bean模式任务Handler,可以直接配置实用,如下:

  • demoJobHandler:简单示例任务,任务内部模拟耗时任务逻辑,用户可在线体验Rolling Log等功能;
  • shardingJobHandler:分片示例任务,任务内部模拟处理分片参数,可参考熟悉分片任务;
  • httpJobHandler:通用HTTP任务Handler;业务方只需要提供HTTP链接等信息即可,不限制语言、平台。示例任务入参如下:
/**
 * XxlJob开发示例(Bean模式)
 *
 * 开发步骤:
 * 1、在Spring Bean实例中,开发Job方法,方式格式要求为 "public ReturnT<String> execute(String param)"
 * 2、为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
 * 3、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志;
 *
 * @author xuxueli 2019-12-11 21:52:51
 */
@Component
public class SampleXxlJob {
    private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);
	/**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob("demoJobHandler")
    public ReturnT<String> demoJobHandler(String param) throws Exception {
        logger.info("XXL-JOB, Hello World. param={}",param);
        return ReturnT.SUCCESS;
    }
    //...省略...
}

重要】 如果我们要写自己的定时任务,参照上面方法,在方法上注解一个@XxlJob("任务名字") ,方法可以接受一个字符串参数,方法需要返回ReturnT格式。

最后启动执行器项目.

3.配置定时任务

3.1.执行器创建

打开调度中心可视化界面,在执行器管理界面,添加新增执行器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G0KocL0v-1637138879964)(课件图片/1637134732964.png)]

  • appName : 执行器的名字,可以任意填写

  • 名称:任意填写

  • 注册方式:调度中心是通过RPC的方式对执行器发起调度,所以这里需要的是执行器项目的ip:port ,注意,该端口不是执行器项目的server.port ,而是:xxl.job.executor.port 端口。你可以选择自动注册,也可以手动录入。

3.2.创建任务

在 任务管理 界面,新增任务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DmeE1GSP-1637138879966)(课件图片/1637135062774.png)]

  • 路由策略:有轮询,随机,故障转移等等策略,是用在集群模式下的调度方式。
  • cron : 定时任务的执行时间规则,时间表达式
  • JobHandler : 这个是要对应 “执行器项目”中 @XxlJob("demoJobHandler") 注解中的名字
  • 运行模式 : Bean ,使用内置代码方式,也可以执行在线执行代码方式
  • 报警邮件 : 如果定时任务失败,会发送报警邮件到邮箱
  • 任务参数:这个参数可以传递给 @XxlJob("demoJobHandler")所在方法的参数。

创建好任务之后就可以执行了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3asKcdzV-1637138879967)(课件图片/1637135245475.png)]

调度日志

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tSwJ8Mh5-1637138879968)(课件图片/1637138390369.png)]

IDEA工具控制台效果

15:47:33.017 logback [Thread-16] INFO  c.x.j.e.s.jobhandler.SampleXxlJob - XXL-JOB, Hello World. param=
15:47:34.007 logback [Thread-16] INFO  c.x.j.e.s.jobhandler.SampleXxlJob - XXL-JOB, Hello World. param=
15:47:35.008 logback [Thread-16] INFO  c.x.j.e.s.jobhandler.SampleXxlJob - XXL-JOB, Hello World. param=
...省略...

4.GLUE模式(Java)

4.1.添加任务

该模式支持在线编辑定时任务的内容,立刻执行,无需再开发工具中编辑代码,也无需重启项目。

请点击任务右侧 “GLUE” 按钮,进入 “GLUE编辑器开发界面” ,见下图。“GLUE模式(Java)” 运行模式的任务默认已经初始化了示例任务代码,即打印Hello World。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uNwXbc32-1637138879969)(课件图片/1637137444000.png)]

任务以源码方式维护在调度中心,支持通过Web IDE在线更新,实时编译和生效,因此不需要指定JobHandler

4.2.编写代码

保存之后可以在操作按钮里面去编写任务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fxKzDC5X-1637138879970)(课件图片/1637137493351.png)]

(“GLUE模式(Java)” 运行模式的任务实际上是一段继承自IJobHandler的Java类代码,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器里中的其他服务),比如我的定时任务如下,编辑好之后点击保存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pNUiWBoq-1637138879971)(课件图片/1637137843345.png)]

保存好之后,启动定时任务,效果如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OxO9lylU-1637138879972)(课件图片/1637137960273.png)]

三.XXL-JOB集群部署

1.调度中心集群

1.1.问题概述

调度中心支持集群部署,提升调度系统容灾和可用性。调度中心集群部署时,几点要求和建议:

  • DB配置保持一致;

  • 集群机器时钟保持一致(单机集群忽视);

  • 当启动多个调度器时,执行器配置调度中心部署跟地址可以用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;

    但是建议:推荐通过nginx为调度中心集群做负载均衡,分配域名。调度中心访问、执行器回调配置、调用API服务等操作均通过该域名进行。

1.2.启动多个调度中心

修改调度中心端口,启动多个调度中心,我这里启动两个如

  • http://localhost:18080/xxl-job-admin/
  • http://localhost:18081/xxl-job-admin/

1.3.配置Nginx负载均衡

当启动多个调度器时,执行器配置调度中心部署跟地址可以用逗号分隔。执行器将会使用该地址进行“执行器心跳注册”和“任务结果回调”;为空则关闭自动注册;

但是建议:推荐通过nginx为调度中心集群做负载均衡,分配域名。调度中心访问、执行器回调配置、调用API服务等操作均通过该域名进行。

我们启动了2个调度中心,那么我的执行器项目该注册到哪个调度中心呢?我们通过Nginx来解决这个问题,原理如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5iu4xT3X-1637138879973)(课件图片/1637135852714.png)]

我们再hosts配置 www.jobs.com作为nginx的主机域名,然后反向代理到多个调度中心,这样一来执行器就只需要注册到www.jobs.com Nginx即可。

修改 C:\Windows\System32\drivers\etc\hosts增加配置如下

127.0.0.1 www.jobs.com

Nginx配置如下

#调度中心
	upstream jobs{
		server localhost:18080;
		server localhost:18081;
	}
	
	server {
        listen       80;
        #使用域名
        server_name  www.jobs.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
        	#调度中心反向代理配置
            proxy_pass   http://jobs/;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        
    }

启动Nginx,通过浏览器访问 http://www.jobs.com/xxl-job-admin/ ,可以访问到调度中心的管理界面

2.执行器项目集群

执行器支持集群部署,提升调度系统可用性,同时提升任务处理能力。

执行器集群部署时,几点要求和建议:

  • 执行器回调地址(xxl.job.admin.addresses)需要保持一致;执行器根据该配置进行执行器自动注册等操作。
  • 同一个执行器集群内AppName(xxl.job.executor.appname)需要保持一致;调度中心根据该配置动态发现不同集群的在线执行器列表。

2.1.启动多个执行器项目

现在对执行器项目做集群,修改xxl-job-executor-sample-springboot配置文件application.properties

  • server.port : 既然是做集群,项目端口需要修改
  • xxl.job.admin.addresses : 调度中心地址需要修改成www.jobs.com ,多个执行器配置同一个地址。
  • xxl.job.executor.port : RPC通信端口也要修改,多个执行器该端口需要不一样

第一个实例配置

server.port=19090
xxl.job.admin.addresses=http://www.jobs.com/xxl-job-admin #对应Nginx地址
xxl.job.executor.port=9999

第二个实例配置

server.port=19091
xxl.job.admin.addresses=http://www.jobs.com/xxl-job-admin
xxl.job.executor.port=9998

在 Configurations中配置,允许启动多个实例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FFUGiRRs-1637138879973)(课件图片/1637136682350.png)]

启动实例如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bM130ivW-1637138879974)(课件图片/1637136824731.png)]

2.2.配置定时任务

通过http://www.jobs.com/xxl-job-admin 访问调度中心管理界面,在执行器管理中可以看到多台执行器实例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HyzhATpI-1637138879975)(课件图片/1637137102829.png)]

在任务管理中,可以编辑任务,然后选择路由策略,比如:选择轮询,然后启动任务,就会看到两个执行器项目轮着执行定时任务。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AvTDtdNA-1637138879976)(课件图片/1637137227287.png)]

说在最后

xxl-job确实很强大,功能也很全,经过该文章学习相信你可以把xxl-job给用起来了,但是如果你的项目是一个小体量的单体,我不太建议使用它,Quzrtz或者SpringBoot Task就足够 ,对于xxl-job个人还是有些笨重。文章到这就结束了,喜欢的话请一定给个三连。收藏,点赞,好评。

来源:https://blog.csdn.net/u014494148/article/details/121382211

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

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

相关文章

Android中Adapter的作用

Adapter的介绍 An Adapter object acts as a bridge between an AdapterView and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making aView for each item in the data set. 一个Adapter是Ada…

关于 SAP Cloud Connector 500 failed to sign the Certificate 的错误消息

有朋友向我询问一个关于 SAP Cloud Connector 的问题&#xff0c;错误消息如下&#xff1a; 500 failed to sign the Cloud Connector Certificate for subaccount XXX. Verify Configuration and proxy settings. See Log And Trace Files and in particular ljs_trace.log fo…

基于Java+SpringBoot+Mybatis+Vue+ElementUi的校园闲置物品交易

项目介绍 我们通过java语言&#xff0c;后端springboot框架&#xff0c;数据库mysql&#xff0c;前端vue技术&#xff0c;开发本系统&#xff0c;校园闲置物品交易网站系统中的功能模块主要是实现管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、商品信息管理、系…

什么是固话号码认证?固话号码认证有用吗?

固话号码认证提供企业号码认证服务&#xff0c;来电场景中展现企业LOGO&#xff0c;展现品牌&#xff0c;可以查看更多企业相关信息&#xff0c;可有效提高接通率&#xff0c;保证品牌企业的身份及商业价值。 那如何实施号码认证服务呢&#xff1f;接下来小编就给大家整理了号…

ICML-2022 | 强化学习论文清单(附链接)

第39届国际机器学习会议&#xff08;International Conference on Machine Learning, ICML 2022&#xff09;于北京时间7月17日至7月23日&#xff0c;在美国马里兰州巴尔的摩市以线上线下结合的方式举办。 本文列举了会议主题与强化学习&#xff08;Reinforcement Learning, R…

20行Python代码,轻轻松松获取各路书本,你还在花钱买着看嘛~

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 作为现代青年&#xff0c;我相信应该没几个没看过xiao shuo的吧&#xff0c;嘿嘿~ 一般来说咱们书荒的时候怎么办&#xff1f; 自然是去寻一个网站先找到xiao shuo名字&#xff0c;然后再找度娘…

高压功率放大器原理和应用场合介绍

高压功率放大器是用来对&#xff08;脉冲发生器、函数发生器以及波形发生器等&#xff09;信号进行电压、电流或者功率放大&#xff0c;能够给测试负载提供信号驱动的测量仪器。独立的波形功率放大器分为电压放大器、电流放大器以及电压/电流放大器。另外&#xff0c;还有一类被…

Spring的常用拓展点

文章目录自定义拦截器获取 Spring 容器对象修改 BeanDefinition添加BeanDefinition测试初始化 Bean 前后初始化方法使用PostConstruct 注解实现 InitializingBean 接口BeanFactoryPostProcessor 接口关闭容器前自定义作用域自定义拦截器 spring mvc 拦截器的顶层接口是&#x…

web端常见导航设计

一、导航的定义 导航作为网站或者平台的骨架&#xff0c;是产品设计中不容忽视的一环导航是内容或者功能的定位、导向与通道。 二、导航分类 遵循导航层级结构&#xff0c;包括全局导航和局部导航 全局导航往往指页眉和页脚&#xff0c;存在于网站的大部分页面&#xff0c;便于…

游戏引擎概述-Part1

一、简述自己的学习心路历程 自从业UNITY以来已经有4个月多了&#xff0c;回想起来自己从工作以来就很少写博客了&#xff0c;也算督促一下自己&#xff0c;回想自己从最早的Unity开始&#xff0c;入手C#和编辑器、Unity开发界面&#xff0c;再到自己学一些Unity的小项目…

有效学习,通过PMP考试

但是我们时间有限&#xff0c;如何有效利用这些资料&#xff0c;花最少时间通过考试&#xff0c;是个关键问题。 课程主要的资料包括&#xff1a; PMBOK。官方指定用书&#xff0c;考试知识点来自PMBOK。 汪博士解读PMP考试。考试参考书&#xff0c;比PMBOK解析得更清楚&…

Qt-FFmpeg开发-视频播放(3)

Qt-FFmpeg开发-视频播放【软解码 OpenGL显示RGB图像】 文章目录Qt-FFmpeg开发-视频播放【软解码 OpenGL显示RGB图像】1、概述2、实现效果3、FFmpeg软解码流程4、主要代码4.1 解码代码4.2 OpenGL显示RGB图像代码5、完整源代码更多精彩内容&#x1f449;个人内容分类汇总 &…

Bio-Helix 艾美捷IRIS11预染蛋白Markers基参及相关研究

IRIS11预染色蛋白梯是11种分子量为3至60kDa的预染色蛋白的组合。11种重组蛋白与蓝色发色团共价偶联&#xff0c;而2条70kDa和260kDa的红色带、一条15kDa的绿色带和一条新设计的60kDa的孔雀绿色带作为参考带。IRIS11预拉伸蛋白质阶梯在SDS聚丙烯酰胺凝胶电泳过程中跟踪蛋白质的大…

[附源码]java毕业设计新冠疫苗线上预约系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【测试沉思录】17. 性能测试中的系统资源分析之四:网络

作者&#xff1a;马海琴 编辑&#xff1a;毕小烦 计算机网络&#xff0c;就是通过光缆、电缆、电话线或无线通讯将两台以上的计算机互连起来的集合&#xff0c;包括广域网、城域网、局域网和无线网。 计算机网络是传输信息的媒介。我们常说的千兆网&#xff0c;是指网络带宽为…

openssl中SM2、SM3、SM4使用实例

目录 openssl的版本如下&#xff1a; SM3使用实例 1. SM3的扎凑实例 SM2使用实例 1. 生成SM2密钥对 2.查看SM2密钥对 3.生成自签名证书 4.查看证书详情 5.私钥签名消息 6.证书验证消息签名 SM4 使用实例 openssl的版本如下&#xff1a; SM3使用实例 SM3是中华人民共…

前端框架 Nextjs 实现React SEO优化

目录 一、Nextjs框架创建React项目 二、路由的使用 1、静态路由 2、动态路由 3、Link路由跳转 4、Api路由 5、Api动态路由 三、Nextjs中加载js脚本 四、Nextjs中加载图片 五、Nextjs的公共布局 六、Pages的其他特性 一、Nextjs框架创建React项目 快速入门 | Next.…

YOLOv5~目标检测模型精确度

还是yolo5的基础啊~~ 一些关于目标检测模型的评估指标&#xff1a;IOU、TP&FP&FN&TN、mAP等&#xff0c;并列举了目标检测中的mAP计算。 指标评估(重要的一些定义) IOU 也称重叠度表示计算预测回归框和真实回归框的交并比,计算公式如下: TP&FP&FN&…

2022CTF培训(二)Hook进阶反调试

附件下载链接 Hook进阶 更精准的 Inline Hook 要求 实现防止任务管理器对某进程自身的结束要求不影响任务管理器结束其它进程的功能 Dll 注入程序编写 提权 主要过程如下&#xff1a; 首先,程序需要调用OpenProcessToken函数打开指定的进程令牌&#xff0c;并获取TOKEN…

【架构设计】作为架构师你应该掌握的画图技术

1.前言 大家知道&#xff0c;架构的过程其实就是建模的过程&#xff0c;那自然离不开架构图。那么&#xff0c;我们先来看几个问题。 &#xff08;1&#xff09;什么是架构图&#xff1f; 架构图 架构 图&#xff0c;用图的形式把系统架构展示出来&#xff0c;配上简单的文…