生活服务类网站开发/中央电视台新闻联播广告价格
Quartz的不足
Quartz 的不足:Quartz 作为开源任务调度中的佼佼者,是任务调度的首选。但是在集群环境中,Quartz采用API的方式对任务进行管理,这样存在以下问题:
- 通过调用API的方式操作任务,不人性化。
- 需要持久化业务的 QuartzJobBean 到底层数据表中,系统侵入性相当严重。
- 调度逻辑和QuartzJobBean耦合在同一个项目中,这将导致一个问题,在调度任务数量逐渐增多,同时调度任务逻辑逐渐加重的情况下,此时调度系统的性能将大大受限于业务。
Xxl-job介绍
官方说明:XXL-JOB 是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
通俗来讲:XXL-JOB 是一个任务调度框架,通过引入 XXL-JOB 相关的依赖,按照相关格式撰写代码后,可在其可视化界面进行任务的启动,执行,中止以及包含了日志记录与查询和任务状态监控。
更多详细介绍推荐阅读官方文档。
项目实践
Spring Boot集成XXL-JOB
Spring Boot 集成 XXL-JOB 主要分为以下两步:
- 配置运行调度中心(xxl-job-admin)
- 配置运行执行器项目
xxl-job-admin 可以从源码仓库中下载代码,代码地址有两个:
- GitHub:github.com/xuxueli/xxl…
- Gitee:gitee.com/xuxueli0323…
下载完之后,在 doc/db
目录下有数据库脚本 tables_xxl_job.sql
,执行下脚本初始化调度数据库 xxl_job
,如下图所示:
配置调度中心
将下载的源码解压,用 IDEA 打开,我们需要修改一下 xxl-job-admin 中的一些配置。(我这里下载的是最新版 2.3.1)
1、修改 application.properties,主要是配置一下 datasource 以及 email,其他不需要改变。
### xxl-job, datasource
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
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=1739468244@qq.com
spring.mail.from=1739468244@qq.com
# 此处不是邮箱登录密码,而是开启SMTP服务后的授权码
spring.mail.password=xxxxx
2、修改 logback.xml,配置日志输出路径,我是在解压的 xxl-job-2.3.1 项目包中新建了一个 logs 文件夹。
<property name="log.path" value="/Users/xxx/xxl-job-2.3.1/logs/xxl-job-admin.log"/>
然后启动项目,正常启动后,访问地址为:http://localhost:8080/xxl-job-admin,默认的账户为 admin,密码为 123456,访问后台管理系统后台。
这样就表示调度中心已经搞定了,下一步就是创建执行器项目。
创建执行器项目
本项目与 Quartz 项目用的业务表和业务逻辑都一样,所以引入的依赖会比较多。
环境配置
1、引入依赖:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</version><relativePath/>
</parent><properties><java.version>1.8</java.version><fastjson.version>1.2.73</fastjson.version><hutool.version>5.5.1</hutool.version><mysql.version>8.0.19</mysql.version><org.mapstruct.version>1.4.2.Final</org.mapstruct.version><org.projectlombok.version>1.18.20</org.projectlombok.version><druid.version>1.1.18</druid.version><springdoc.version>1.6.9</springdoc.version>
</properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.1</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>3.5.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version><scope>runtime</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.12</version></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>${org.mapstruct.version}</version></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>${org.mapstruct.version}</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>${hutool.version}</version></dependency><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>${springdoc.version}</version></dependency>
</dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>
2、application.yml 配置文件
server:port: 9090# xxl-job
xxl:job:admin:addresses: http://127.0.0.1:8080/xxl-job-admin # 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;executor:appname: hresh-job-executor # 执行器 AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册ip: # 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";port: 6666 # ### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;logpath: /Users/xxx/xxl-job-2.3.1/logs/xxl-job # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;logretentiondays: 30 # 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;accessToken: default_token # 执行器通讯TOKEN [选填]:非空时启用;spring:application:name: xxl-job-practicedatasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/xxl_job?serverTimezone=Hongkong&characterEncoding=utf-8&useSSL=falseusername: rootpassword: rootmybatis:mapper-locations: classpath:mapper/*Mapper.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpllazy-loading-enabled: true
上述 xxl-job 的 logpath 配置与调度中心的输出日志用的是同一个目录,accessToken 也与调度中心的 xxl.job.accessToken 一致。
核心类
1、xxl-job 配置类
@Configuration
public class XxlJobConfig {@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.executor.appname}")private String appName;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${xxl.job.executor.logpath}")private String logPath;@Value("${xxl.job.executor.logretentiondays}")private int logRetentionDays;@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {// 创建 XxlJobSpringExecutor 执行器XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appName);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);// 返回return xxlJobSpringExecutor;}
}
2、xxl-job 工具类
@Component
@RequiredArgsConstructor
public class XxlUtil {@Value("${xxl.job.admin.addresses}")private String xxlJobAdminAddress;private final RestTemplate restTemplate;// 请求Urlprivate static final String ADD_INFO_URL = "/jobinfo/addJob";private static final String REMOVE_INFO_URL = "/jobinfo/removeJob";private static final String GET_GROUP_ID = "/jobgroup/loadByAppName";/*** 添加任务** @param xxlJobInfo* @param appName* @return*/public String addJob(XxlJobInfo xxlJobInfo, String appName) {Map<String, Object> params = new HashMap<>();params.put("appName", appName);String json = JSONUtil.toJsonStr(params);String result = doPost(xxlJobAdminAddress + GET_GROUP_ID, json);JSONObject jsonObject = JSON.parseObject(result);Map<String, Object> map = (Map<String, Object>) jsonObject.get("content");Integer groupId = (Integer) map.get("id");xxlJobInfo.setJobGroup(groupId);String xxlJobInfoJson = JSONUtil.toJsonStr(xxlJobInfo);return doPost(xxlJobAdminAddress + ADD_INFO_URL, xxlJobInfoJson);}// 删除jobpublic String removeJob(long jobId) {MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();map.add("id", String.valueOf(jobId));return doPostWithFormData(xxlJobAdminAddress + REMOVE_INFO_URL, map);}/*** 远程调用** @param url* @param json*/private String doPost(String url, String json) {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);HttpEntity<String> entity = new HttpEntity<>(json, headers);ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, entity, String.class);return responseEntity.getBody();}private String doPostWithFormData(String url, MultiValueMap<String, String> map) {HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(map, headers);ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, entity, String.class);return responseEntity.getBody();}
}
此处我们利用 RestTemplate 来远程调用 xxl-job-admin 中的服务,从而实现动态创建定时任务,而不是局限于通过 UI 界面来创建任务。
这里我们用到三个接口,都需要我们在 xxl-job-admin 中手动添加,这样在调用接口时,就不需要登录验证了,这就要求在定义接口时加上一个 PermissionLimit
并设置 limit 为 false,那么这样就不用去登录就可以调用接口。
3、修改 JobGroupController,新增 loadByAppName 方法
@RequestMapping("/loadByAppName")
@ResponseBody
@PermissionLimit(limit = false)
public ReturnT<XxlJobGroup> loadByAppName(@RequestBody Map<String, Object> map) {XxlJobGroup jobGroup = xxlJobGroupDao.loadByAppName(map);return jobGroup != null ? new ReturnT<XxlJobGroup>(jobGroup): new ReturnT<XxlJobGroup>(ReturnT.FAIL_CODE, null);
}
XxlJobGroupDao 文件以及对应的 xml 文件
XxlJobGroup loadByAppName(Map<String, Object> map);
<select id="loadByAppName" parameterType="java.util.HashMap" resultMap="XxlJobGroup">SELECT<include refid="Base_Column_List"/>FROM xxl_job_group AS tWHERE t.app_name = #{appName}</select>
4、修改 JobInfoController,增加 addJob 方法和 removeJob 方法
@RequestMapping("/addJob")@ResponseBody@PermissionLimit(limit = false)public ReturnT<String> addJob(@RequestBody XxlJobInfo jobInfo) {return xxlJobService.add(jobInfo);}@RequestMapping("/removeJob")@ResponseBody@PermissionLimit(limit = false)public ReturnT<String> removeJob(String id) {return xxlJobService.remove(Integer.parseInt(id));}
addJob 方法与 JobInfoController 文件中的 add 方法具体逻辑是一样的,只是换个接口名。
@RequestMapping("/add")@ResponseBodypublic ReturnT<String> add(XxlJobInfo jobInfo) {return xxlJobService.add(jobInfo);}
至此,关于调度中心的修改就结束了。
5、XxlService 创建任务
@Service
@Slf4j
@RequiredArgsConstructor
public class XxlService {private final XxlUtil xxlUtil;@Value("${xxl.job.executor.appname}")private String appName;public void addJob(XxlJobInfo xxlJobInfo) {xxlUtil.addJob(xxlJobInfo, appName);long triggerNextTime = xxlJobInfo.getTriggerNextTime();log.info("任务已添加,将在{}开始执行任务", DateUtils.formatDate(triggerNextTime));}}
业务代码
1、UserService,包括用户注册,给用户发送欢迎消息,以及发送天气温度通知。
@Service
@RequiredArgsConstructor
@Slf4j
public class UserService {private final UserMapper userMapper;private final UserStruct userStruct;private final WeatherService weatherService;private final XxlService xxlService;/*** 假设有这样一个业务需求,每当有新用户注册,则1分钟后会给用户发送欢迎通知.** @param userRequest 用户请求体*/@Transactionalpublic void register(UserRequest userRequest) {if (Objects.isNull(userRequest) || isBlank(userRequest.getUsername()) ||isBlank(userRequest.getPassword())) {BusinessException.fail("账号或密码为空!");}User user = userStruct.toUser(userRequest);userMapper.insert(user);LocalDateTime scheduleTime = LocalDateTime.now().plusMinutes(1L);XxlJobInfo xxlJobInfo = XxlJobInfo.builder().jobDesc("定时给用户发送通知").author("hresh").scheduleType("CRON").scheduleConf(DateUtils.getCron(scheduleTime)).glueType("BEAN").glueType("BEAN").executorHandler("sayHelloHandler").executorParam(user.getUsername()).misfireStrategy("DO_NOTHING").executorRouteStrategy("FIRST").triggerNextTime(DateUtils.toEpochMilli(scheduleTime)).executorBlockStrategy("SERIAL_EXECUTION").triggerStatus(1).build();xxlService.addJob(xxlJobInfo);}public void sayHelloToUser(String username) {if (StrUtil.isBlank(username)) {log.error("用户名为空");}User user = userMapper.selectByUserName(username);String message = "Welcome to Java,I am hresh.";log.info(user.getUsername() + " , hello, " + message);}public void pushWeatherNotification() {List<User> users = userMapper.queryAll();log.info("执行发送天气通知给用户的任务。。。");WeatherInfo weatherInfo = weatherService.getWeather(WeatherConstant.WU_HAN);for (User user : users) {log.info(user.getUsername() + "----" + weatherInfo.toString());}}
}
2、WeatherService,获取天气温度等信息,这里就不贴代码了。
3、UserController,只有一个用户注册方法
@RestController
@RequiredArgsConstructor
public class UserController {private final UserService userService;@PostMapping("/register")public Result<Object> register(@RequestBody UserRequest userRequest) {userService.register(userRequest);return Result.ok();}}
任务处理器
这里演示两种任务处理器,一种是用于处理 UI 页面创建的任务,另一种是处理代码创建的任务。
1、DemoHandler,仅用作演示,没什么实际含义。
@RequiredArgsConstructor
@Slf4j
public class DemoHandler extends IJobHandler {@XxlJob(value = "demoHandler")@Overridepublic void execute() throws Exception {log.info("自动任务" + this.getClass().getSimpleName() + "执行");}
}
2、SayHelloHandler,用户注册后再 xxl-job 上创建一个任务,到时间后就调用该处理器。
@Component
@RequiredArgsConstructor
public class SayHelloHandler {private final UserService userService;@XxlJob(value = "sayHelloHandler")public void execute() {String param = XxlJobHelper.getJobParam();userService.sayHelloToUser(param);}
}
在最新版本的 xxl-job 中,任务核心类 “IJobHandler” 的 “execute” 方法取消出入参设计。改为通过 “XxlJobHelper.getJobParam” 获取任务参数并替代方法入参,通过 “XxlJobHelper.handleSuccess/handleFail” 设置任务结果并替代方法出参,示例代码如下
@XxlJob("demoJobHandler")
public void execute() {String param = XxlJobHelper.getJobParam(); // 获取参数XxlJobHelper.handleSuccess(); // 设置任务结果
}
3、WeatherNotificationHandler,每天定时发送天气通知
@Component
@RequiredArgsConstructor
public class WeatherNotificationHandler extends IJobHandler {private final UserService userService;@XxlJob(value = "weatherNotificationHandler")@Overridepublic void execute() throws Exception {userService.pushWeatherNotification();}
}
测试
1、首先在执行器管理页面,点击新增按钮,弹出新增框。输入AppName (与application.yml中配置的appname保持一致),名称,注册方式默认自动注册,点击保存。
2、新增任务
控制台输出:
com.msdn.time.handler.DemoHandler : 自动任务DemoHandler执行
2、利用 postman 来注册用户
去 UI 任务管理页面,可以看到代码创建的任务。
1分钟后,控制台输出如下:
3、在 UI 任务管理页面手动新增任务,用来发送天气通知。
点击执行一次,控制台输出如下:
实际应用中,对于手动创建的任务,直接点击启动就可以了。
这里还有一个问题,如果每次有新用户注册,都会创建一个定时任务,而且只执行一次,那么任务列表到时候就会有很多脏数据,所以我们在执行完发送欢迎通知后,就要删除。所以我们需要修改一下 SayHelloHandler
@XxlJob(value = "sayHelloHandler")public void execute() {String param = XxlJobHelper.getJobParam();userService.sayHelloToUser(param);long jobId = XxlJobHelper.getJobId();xxlUtil.removeJob(jobId);}
重启项目后,比如说明再创建一个名为 hresh2 的用户,然后任务列表就会新增一个任务。
等控制台输出 sayHello 后,可以发现任务列表中任务 ID 为 20的记录被删除掉了。
问题
控制台输出邮件注册错误
11:01:48.740 logback [RMI TCP Connection(1)-127.0.0.1] WARN o.s.b.a.mail.MailHealthIndicator - Mail health check failed
javax.mail.AuthenticationFailedException: 535 Login Fail. Please enter your authorization code to login. More information in http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256
原因:xxl-job-admin 项目的 application.properties 文件中关于 spring.mail.password 的配置不对,可能有人配置了自己邮箱的登录密码。
解决方案:
总结
通过对比 Quartz 和 XXL-JOB 的使用,可以发现后者更易上手,代码侵入不严重,且具备可视化界面。这就是推荐新手使用 XXL-JOB 的原因。
感兴趣的朋友可以去我的 Github 下载相关代码,如果对你有所帮助,不妨 Star 一下,谢谢大家支持!
参考文献
XXL-JOB动态创建任务详解篇2
Spring Boot 集成 XXL-JOB 任务调度平台
相关文章:

SpringBoot结合XXL-JOB实现定时任务
Quartz的不足 Quartz 的不足:Quartz 作为开源任务调度中的佼佼者,是任务调度的首选。但是在集群环境中,Quartz采用API的方式对任务进行管理,这样存在以下问题: 通过调用API的方式操作任务,不人性化。需要…...

【Node.js】 创建web服务器
Node.js什么是客户端,什么是服务器服务器和普通电脑的区别什么是http模块导入http模块服务器相关概念创建web服务器的基本步骤req请求对象req响应对象解决中文乱码根据不同的url响应不同的html内容什么是客户端,什么是服务器 客户端在网络节点中&#x…...

基于go语言实现RestFul交互
一、RestFul 1.1 RestFul的介绍 RESTFUL(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于HTTP或HTTPS,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景&…...

情感溢出:读《浣溪沙》
浣溪沙 谁念西风独自凉 作者 纳兰性德 谁念西风独自凉,萧萧黄叶闭疏窗,沉思往事立残阳。 被酒莫惊春睡重,赌书消得泼茶香,当时只道是寻常。 记得年轻时学这篇词,就是愣背,现在也就记得这句当时只道是寻常…...

深入解读.NET MAUI音乐播放器项目(一):概述与架构
系列文章将分步解读音乐播放器核心业务及代码: 深入解读.NET MAUI音乐播放器项目(一):概述与架构深入解读.NET MAUI音乐播放器项目(二):播放内核深入解读.NET MAUI音乐播放器项目(三…...

【Python小游戏】某程序员将套圈游戏玩儿到了巅峰,好嗨哟~Pygame代码版《牛牛套圈》已上线,大人的套圈游戏太嗨了,小孩勿进。
前言 世上选择那么多。 关注栗子同学会是您最明智的选择哦。 所有文章完整的素材源码都在👇👇 粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。 “幸运牛牛套圈圈”套住欢乐,圈住幸福,等你来挑战…...

php的declare命令如何使用?
php中的declare结构用来设定一段代码的执行指令declare用于执行3个指令:ticks,encoding,strict_typesdeclare结构用于全局范围,影响到其后的所有代码(但如果有declare结构的文件被其他文件包含,则对包含他的父文件不起作用&#x…...

嵌软工程师要掌握的硬件知识2:一文看懂什么开漏和推挽电路(open-drain / push-pull)
想了解开漏和推挽,就要先了解一下三极管和场效应管是什么,在其他章节有详细介绍,本文就不再进行赘述。 1 推挽(push pull)电路 1.1 理解什么是推挽电路 - 详细介绍 如图所示,Q3是个NPN型三极管,Q4是个PNP型三极管。 1)当Vin电压为正时,上面的N型三极管控制端有电…...

1.2.6存储结构-磁盘管理:单缓冲区与双缓冲区读取、流水线周期、计算流水线执行时间
1.2.6存储结构-磁盘管理:单缓冲区与双缓冲区读取、流水线周期、计算流水线执行时间流水线周期计算流水线执行时间微秒,时间单位,符号μs(英语:microsecond ),1微秒等于百万分之一秒(…...

【pytest接口自动化测试】结合单元测试框架pytest+数据驱动模型+allure
api: 存储测试接口 conftest.py :设置前置操作 目前前置操作:1、获取token并传入headers,2、获取命令行参数给到环境变量,指定运行环境commmon:存储封装的公共方法 connect_mysql.py:连接数据库http_requests.py: 封装…...

展锐平台WIFI吞吐问题解决方案
同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。 一、Wi-Fi 吞吐验收标准 预置条件:屏蔽房;DUT 距离 AP 1m 左右;测试 AP 不加密;…...

全局向量的词嵌入(GloVe)
诸如词-词共现计数的全局语料库统计可以来解释跳元模型。 交叉熵损失可能不是衡量两种概率分布差异的好选择,特别是对于大型语料库。GloVe使用平方损失来拟合预先计算的全局语料库统计数据。 对于GloVe中的任意词,中心词向量和上下文词向量在数学上是等…...

华为OD机试 - 特异性双端队列(Python),真题含思路
特异性双端队列 题目 有一个特异性的双端队列,该队列可以从头部到尾部添加数据,但是只能从头部移除数据。 小 A 一次执行 2 n 2n 2n 个指令往队列中添加数据和移除数据, 其中 n n n 个指令是添加数据(可能从头部也可以从尾部添加) 依次添加 1 到...

【Linux】操作系统进程概念
文章目录1. 冯诺依曼体系结构2. 操作系统3. 进程进程的基本概念查看进程和杀死进程父进程和子进程通过系统调用创建子进程1. 冯诺依曼体系结构 冯诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。数学家冯诺依曼提出了计算…...

C语言const的用法详解
有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定。例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小。为了满足这一要求,可以使用const关键字对变量加以限定:constin…...

Day886.MySQL的“饮鸩止渴”提高性能的方法 -MySQL实战
MySQL的“饮鸩止渴”提高性能的方法 HI,我是阿昌,今天学习记录的是关于MySQL的“饮鸩止渴”提高性能的方法的内容。 不知道在实际运维过程中有没有碰到这样的情景: 业务高峰期,生产环境的 MySQL 压力太大,没法正常响…...

08- 数据升维 (PolynomialFeatures) (机器学习)
在做数据升维的时候,最常见的手段就是将已知维度进行相乘(或者自乘)来构建新的维度 使用 np.concatenate()进行简单的,幂次合并,注意数据合并的方向axis 1 数据可视化时,注意切片,因为数据升维…...

2023备战金三银四,Python自动化软件测试面试宝典合集(二)
马上就又到了程序员们躁动不安,蠢蠢欲动的季节~这不,金三银四已然到了家门口,元宵节一过后台就有不少人问我:现在外边大厂面试都问啥想去大厂又怕面试挂面试应该怎么准备测试开发前景如何面试,一个程序员成长之路永恒绕…...

笔试题-2023-紫光展锐-数字芯片设计【纯净题目版】
回到首页:2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录 推荐内容:数字IC设计学习比较实用的资料推荐 题目背景 笔试时间:2022.08.24应聘岗位:数字芯片设计工程师笔试时长:90min笔试平台:nowcoder牛客网题目类型:单选题(18道)、不定项选择题(22道)题目评…...

WordPress网站日主题Ri主题RiProV2主题开启了验证码登录但是验证码配置不对结果退出登录后进不去管理端了
背景 WordPress网站日主题Ri主题RiProV2主题开启了验证码登录但是验证码配置不对结果退出登录后进不去管理端了;开启了腾讯云验证码防火墙但APPID,APPSecret没配置,结果在退出登录后,由于验证码验证失败管理端进不去了 提示如下:...

自动驾驶感知——毫米波雷达
文章目录1. 雷达的基本概念1.1 毫米波雷达分类1.2 信息的传输1.3 毫米波雷达的信号频段1.4 毫米波雷达工作原理1.4.1 毫米波雷达测速测距的数学原理1.4.2 毫米波雷达测角度的数学原理1.4.3 硬件接口1.4.4 关键零部件1.4.5 数据的协议与格式1.5 车载毫米波雷达的重要参数1.6 车载…...

取电芯片全协议都可兼容
乐得瑞PD协议芯片/PD取电芯片/PD受电端协议芯片 支持5/9/12/15/20v定制 1、概述 LDR6328S 是乐得瑞科技有限公司开发的一款兼容 USB PD、QC 和 AFC 协议的 Sink 控制器。 LDR6328S 从支持 USB PD、QC 和 AFC 协议的适配器取电,然后供电给设备。比如可以配置适配器输…...

自己总结优化代码写法
jdk1.7新特性详解 开发期间略知jdk1.7的一些特性,没有真正的一个一个得展开研究,而是需要说明再去查,导致最整个新特性不是特别的清楚,这种情况以后得需要改变了,否则就会变成代码的奴隶。现在正好有时间可以细细的研…...

Java体系最强干货分享—挑战40天准备Java面试,最快拿到offer!
如何准备java面试,顺利上岸大厂java岗位? 主攻Java的人越来越多,导致行业越来越卷,最开始敲个“hello world”都能进大厂,现在,八股、全家桶、算法等等面试题横行,卷到极致!就拿今年…...

云计算|OpenStack|错误记录和解决方案(不定时更新)
前言: openstack的部署和使用是难度比较大的,难免会出现各种各样的问题,因此,本文将把一些在部署和使用openstack社区版时出现的错误做一个记录,并就每一个错误分析和解决问题。(尽量记录比较经典的错误&a…...

项目实战-NewFixedThreadPool线程池
目录 什么是线程池 线程池的类型 1.CachedThreadPool 2.FixedThreadPool 3.ScheduledThreadPool 4.SingleThreadPool 5.newWorkStealingPool 线程池的好处 1、线程池的重用 2、控制线程池的并发数 3、线程池可以对线程进行管理 线程池的示例 1.Client启动类 2.具体…...

导数与微分总复习——“高等数学”
各位CSDN的uu们你们好呀,今天,小雅兰来复习一下之前学过的知识点,也就是导数与微分的总复习,依旧是高等数学的内容,主要是明天就要考高等数学了,哈哈哈,下面,让我们一起进入高等数学…...

Linux软件安装
1.Linux安装JDK 1.安装位置 /opt 2.安装包 jdk-8u171-linux-x64.rpm 3.安装步骤 1.将安装包上传到虚拟机中 [rootlocalhost opt]# ls jdk-8u171-linux-x64.rpm2.执行安装命令 [rootlocalhost opt]# rpm -ivh jdk-8u171-linux-x64.rpm 准备中... #####…...

【表面缺陷检测】基于YOLOX的PCB表面缺陷检测(全网最详细的YOLOX保姆级教程)
写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 Hello,大家好,我是augustqi。 今天给大家分享一个表面缺陷检测项目:基于YOLOX的PCB表面缺陷检测(保姆级教程)。多的…...

【C#基础】C# 程序基础语法解析
序号系列文章0【C#基础】初识编程语言C#1【C#基础】C# 程序通用结构总结 文章目录前言基础语法1. using 关键字2. namespace 关键字3. class 关键字4. 成员字段5. 成员方法6. Main 方法7. new 关键字8. 标识符9. 关键字结语前言 😄 大家好,我是writer桑&…...