quartz的使用

简介

是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer。功能更强大

常规

依赖

<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version>
</dependency>

编写核心逻辑

public class FirstJob implements Job {public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {System.out.println("this is first job!");}
}

quartz的核心逻辑在org.quartz.Job#execute中,其中JobExecutionContext是任务执行上下文,可以从中获取到相关的调度参数

定式调度

public static void main(String[] args) throws Exception{SchedulerFactory factory = new StdSchedulerFactory();Scheduler scheduler = factory.getScheduler();JobKey jobKey = new JobKey("triggerTX2", "groupTX1"); // 任务(Job)的唯一标识,如果在创建任务时没有设置该项,由框架生成List<? extends Trigger> triggersOfJob = scheduler.getTriggersOfJob(jobKey);if (Objects.nonNull(triggersOfJob) && triggersOfJob.size() > 0) {scheduler.resumeJob(jobKey);} else {JobDetail jobDetail = JobBuilder.newJob(FirstJob.class).withIdentity(jobKey).usingJobData("userName", "zhangsan") // 此处可以添加需要的调度参数,然后会把参数封装到JobExecutionContent中.build();CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobKey.getName(),jobKey.getGroup()) // 设置标识.usingJobData("address","123")  // 此处可以添加需要的调度参数,然后会把参数封装到JobExecutionContent中.withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?")).startNow().build();scheduler.scheduleJob(jobDetail,trigger);}scheduler.start();}

此处需要注意,如果使用把job信息记录在内存中(默认方式),job信息随着程序启停而结束,每次重新启动程序其实是心创建一个Job!

持久化

依赖

<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version>
</dependency>

配置文件

需要在项目的resource目录下创建quartz.properties文件,内容如下:

# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.
#org.quartz.scheduler.instanceName= DefaultQuartzScheduler
org.quartz.scheduler.rmi.export= false
org.quartz.scheduler.rmi.proxy= false
org.quartz.scheduler.wrapJobExecutionInUserTransaction= falseorg.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount= 10
org.quartz.threadPool.threadPriority= 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread= trueorg.quartz.jobStore.misfireThreshold= 60000#数据持久化 内存配置:org.quartz.simpl.RAMJobStore
org.quartz.jobStore.class= org.quartz.impl.jdbcjobstore.JobStoreTX#驱动代理为 标准的jdbc
org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate#数据库表前缀
org.quartz.jobStore.tablePrefix=QRTZ_#数据源 该数据源名称可以随意取,只需要和下面的配置项的数据源相同即可
org.quartz.jobStore.dataSource=quartz_test#JDBC驱动 驱动相关参数中quartz_test和上面配置的相同即可
org.quartz.dataSource.quartz_test.driver=com.mysql.cj.jdbc.Driver
org.quartz.dataSource.quartz_test.URL=jdbc:mysql://{your mysql ip}:3306/quartz
org.quartz.dataSource.quartz_test.user=xxxx
org.quartz.dataSource.quartz_test.password=xxxx

配置自己的数据库地址、用户名、密码即可

执行ddl建表

DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS;
DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE;
DROP TABLE IF EXISTS QRTZ_LOCKS;
DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_TRIGGERS;
DROP TABLE IF EXISTS QRTZ_JOB_DETAILS;
DROP TABLE IF EXISTS QRTZ_CALENDARS;CREATE TABLE QRTZ_JOB_DETAILS(SCHED_NAME VARCHAR(120) NOT NULL,JOB_NAME  VARCHAR(100) NOT NULL,JOB_GROUP VARCHAR(100) NOT NULL,DESCRIPTION VARCHAR(250) NULL,JOB_CLASS_NAME   VARCHAR(250) NOT NULL,IS_DURABLE VARCHAR(1) NOT NULL,IS_NONCONCURRENT VARCHAR(1) NOT NULL,IS_UPDATE_DATA VARCHAR(1) NOT NULL,REQUESTS_RECOVERY VARCHAR(1) NOT NULL,JOB_DATA BLOB NULL,PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
);CREATE TABLE QRTZ_TRIGGERS(SCHED_NAME VARCHAR(120) NOT NULL,TRIGGER_NAME VARCHAR(100) NOT NULL,TRIGGER_GROUP VARCHAR(100) NOT NULL,JOB_NAME  VARCHAR(100) NOT NULL,JOB_GROUP VARCHAR(100) NOT NULL,DESCRIPTION VARCHAR(250) NULL,NEXT_FIRE_TIME BIGINT(13) NULL,PREV_FIRE_TIME BIGINT(13) NULL,PRIORITY INTEGER NULL,TRIGGER_STATE VARCHAR(16) NOT NULL,TRIGGER_TYPE VARCHAR(8) NOT NULL,START_TIME BIGINT(13) NOT NULL,END_TIME BIGINT(13) NULL,CALENDAR_NAME VARCHAR(100) NULL,MISFIRE_INSTR SMALLINT(2) NULL,JOB_DATA BLOB NULL,PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP)
);CREATE TABLE QRTZ_SIMPLE_TRIGGERS(SCHED_NAME VARCHAR(120) NOT NULL,TRIGGER_NAME VARCHAR(100) NOT NULL,TRIGGER_GROUP VARCHAR(100) NOT NULL,REPEAT_COUNT BIGINT(7) NOT NULL,REPEAT_INTERVAL BIGINT(12) NOT NULL,TIMES_TRIGGERED BIGINT(10) NOT NULL,PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);CREATE TABLE QRTZ_CRON_TRIGGERS(SCHED_NAME VARCHAR(120) NOT NULL,TRIGGER_NAME VARCHAR(100) NOT NULL,TRIGGER_GROUP VARCHAR(100) NOT NULL,CRON_EXPRESSION VARCHAR(100) NOT NULL,TIME_ZONE_ID VARCHAR(80),PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);CREATE TABLE QRTZ_SIMPROP_TRIGGERS(          SCHED_NAME VARCHAR(120) NOT NULL,TRIGGER_NAME VARCHAR(100) NOT NULL,TRIGGER_GROUP VARCHAR(100) NOT NULL,STR_PROP_1 VARCHAR(512) NULL,STR_PROP_2 VARCHAR(512) NULL,STR_PROP_3 VARCHAR(512) NULL,INT_PROP_1 INT NULL,INT_PROP_2 INT NULL,LONG_PROP_1 BIGINT NULL,LONG_PROP_2 BIGINT NULL,DEC_PROP_1 NUMERIC(13,4) NULL,DEC_PROP_2 NUMERIC(13,4) NULL,BOOL_PROP_1 VARCHAR(1) NULL,BOOL_PROP_2 VARCHAR(1) NULL,PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP) REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);CREATE TABLE QRTZ_BLOB_TRIGGERS(SCHED_NAME VARCHAR(120) NOT NULL,TRIGGER_NAME VARCHAR(100) NOT NULL,TRIGGER_GROUP VARCHAR(100) NOT NULL,BLOB_DATA BLOB NULL,PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
);CREATE TABLE QRTZ_CALENDARS(SCHED_NAME VARCHAR(120) NOT NULL,CALENDAR_NAME  VARCHAR(100) NOT NULL,CALENDAR BLOB NOT NULL,PRIMARY KEY (SCHED_NAME,CALENDAR_NAME)
);CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS(SCHED_NAME VARCHAR(120) NOT NULL,TRIGGER_GROUP  VARCHAR(100) NOT NULL, PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP)
);CREATE TABLE QRTZ_FIRED_TRIGGERS(SCHED_NAME VARCHAR(120) NOT NULL,ENTRY_ID VARCHAR(95) NOT NULL,TRIGGER_NAME VARCHAR(100) NOT NULL,TRIGGER_GROUP VARCHAR(100) NOT NULL,INSTANCE_NAME VARCHAR(100) NOT NULL,FIRED_TIME BIGINT(13) NOT NULL,SCHED_TIME BIGINT(13) NOT NULL,PRIORITY INTEGER NOT NULL,STATE VARCHAR(16) NOT NULL,JOB_NAME VARCHAR(100) NULL,JOB_GROUP VARCHAR(100) NULL,IS_NONCONCURRENT VARCHAR(1) NULL,REQUESTS_RECOVERY VARCHAR(1) NULL,PRIMARY KEY (SCHED_NAME,ENTRY_ID)
);CREATE TABLE QRTZ_SCHEDULER_STATE(SCHED_NAME VARCHAR(120) NOT NULL,INSTANCE_NAME VARCHAR(100) NOT NULL,LAST_CHECKIN_TIME BIGINT(13) NOT NULL,CHECKIN_INTERVAL BIGINT(13) NOT NULL,PRIMARY KEY (SCHED_NAME,INSTANCE_NAME)
);CREATE TABLE QRTZ_LOCKS(SCHED_NAME VARCHAR(120) NOT NULL,LOCK_NAME  VARCHAR(40) NOT NULL, PRIMARY KEY (SCHED_NAME,LOCK_NAME)
);commit;

核心代码&定式调度

同内存中创建定时任务一样即可

quartz结合springboot

依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

添加quartz和springboot整合依赖即可

ddl建表

同上

配置文件

在springboot的配置文件application.yml中配置如下:

spring:quartz:job-store-type: jdbcoverwrite-existing-jobs: truejdbc:schema: classpath:quartz_test.sqlproperties:-org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX-org.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate-org.quartz.jobStore.tablePrefix: QRTZ_-org.quartz.jobStore.dataSource: quartz_test-org.quartz.dataSource.quartz_test.driver: com.mysql.cj.jdbc.Driver-org.quartz.dataSource.quartz_test.URL: jdbc:mysql://xxxxx:3306/quartz_test-org.quartz.dataSource.quartz_test.user: xxxx-org.quartz.dataSource.quartz_test.password: xxxxx-org.quartz.scheduler.instanceName: DefaultQuartzScheduler-org.quartz.scheduler.rmi.export: false-org.quartz.scheduler.rmi.proxy: false-org.quartz.scheduler.wrapJobExecutionInUserTransaction: false-org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool-org.quartz.threadPool.threadCount: 10-org.quartz.threadPool.threadPriority: 5-org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true-org.quartz.jobStore.misfireThreshold: 60000

代码配置

在spring的容器环境下,任务Job可以实现原始的Job,也可以继承QuartzJobBean。如果使用后者,可以获取更多的容器信息

@Slf4j
public class JobBean extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {log.info("this is springboot quartz job!");}
}

然后添加任务管理类:

package com.lyc.quartz.boot.core;import lombok.AllArgsConstructor;
import org.quartz.*;
import org.quartz.impl.matchers.GroupMatcher;
import org.springframework.stereotype.Component;import java.util.*;@Component
@AllArgsConstructor
public class YcQuartzManager {private final Scheduler scheduler;// add job with no parampublic void addJob(Class<? extends Job> clazz, String jobName, String jobGroupName, String cronExpression) throws SchedulerException {addJob(clazz,jobName,jobGroupName,cronExpression,null);}// add job with parampublic void addJob(Class<? extends Job> clazz, String jobName, String jobGroupName, String cronExpression, Map<String, Object> argMap) throws SchedulerException {// build jobJobDetail jobDetail = JobBuilder.newJob(clazz).withIdentity(jobName, jobGroupName).build();// build cron ExpressionCronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);//cron triggerCronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, jobGroupName).withSchedule(scheduleBuilder).build();if (Objects.nonNull(argMap)) {trigger.getJobDataMap().putAll(argMap);}scheduler.scheduleJob(jobDetail, trigger);// schedulescheduler.start();}// pauseJob withIdentitypublic void pauseJob(String jobName, String jobGroupName) throws SchedulerException {scheduler.pauseJob(JobKey.jobKey(jobName, jobGroupName));}// resumeJob withIdentitypublic void resumeJob(String jobName, String jobGroupName) throws SchedulerException {scheduler.resumeJob(JobKey.jobKey(jobName, jobGroupName));}public void updateJob(String jobName, String jobGroupName, String cronExpression) throws SchedulerException {updateJob(jobName,jobGroupName,cronExpression,null);}public void updateJob(String jobName, String jobGroupName, String cronExpression, Map<String, Object> argMap) throws SchedulerException {TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroupName);CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);if (Objects.nonNull(cronExpression)) {// build cron ExpressionCronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);// build cron triggertrigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();}if(Objects.nonNull(argMap)) {// param updatetrigger.getJobDataMap().putAll(argMap);}scheduler.rescheduleJob(triggerKey, trigger);}public void updateJob(String jobName, String jobGroupName, Map<String, Object> argMap) throws SchedulerException {updateJob(jobName,jobGroupName,null,argMap);}// delete job withpublic void deleteJob(String jobName, String jobGroupName) throws SchedulerException {scheduler.pauseTrigger(TriggerKey.triggerKey(jobName, jobGroupName));scheduler.unscheduleJob(TriggerKey.triggerKey(jobName, jobGroupName));scheduler.deleteJob(JobKey.jobKey(jobName, jobGroupName));}// start jobspublic void startAllJobs() {try {scheduler.start();} catch (Exception e) {throw new RuntimeException(e);}}// shutdown Jobspublic void shutdownAllJobs() {try {if (!scheduler.isShutdown()) {scheduler.shutdown();}} catch (Exception e) {throw new RuntimeException(e);}}// job listpublic List<Map<String, Object>> getAllJob() throws SchedulerException {GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);List<Map<String, Object>> jobList = new ArrayList<>();for (JobKey jobKey : jobKeys) {List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);for (Trigger trigger : triggers) {Map<String, Object> job = new HashMap<>();job.put("jobName", jobKey.getName());job.put("jobGroupName", jobKey.getGroup());job.put("trigger", trigger.getKey());Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());job.put("jobStatus", triggerState.name());if (trigger instanceof CronTrigger) {CronTrigger cronTrigger = (CronTrigger) trigger;String cronExpression = cronTrigger.getCronExpression();job.put("cronExpression", cronExpression);}jobList.add(job);}}return jobList;}
}

就可以实现对任务的crud了

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

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

相关文章

wamp3 安装新的php版本

1&#xff1a;进入地址&#xff1a;Wampserver - Files and addons 下载需要的版本的php 2&#xff1a;运行下载好的文件&#xff0c;例&#xff1a;wampserver3_x64_addon_php7.2.34.exe 3&#xff1a;重启wamp&#xff0c;然后左击&#xff0c;顺序&#xff1a;php/Version…

SpringBoot使用xxl-job分布式任务调度平台定时检测RabbitMQ的消息队列自动发出钉钉警告消息

文章目录 SpringBoot使用xxl-job分布式任务调度平台定时检测RabbitMQ的消息队列自动发出钉钉警告消息1、在pom.xml中导入xxl-job的maven依赖&#xff0c;可以看我这篇文章使用抽离出来的xxl-job的starter2、配置xxl-job的相关配置&#xff0c;若上一步使用了自己创建的starter则…

Python基于深度学习的车辆特征分析系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

RTT学习

定时器的管理方式 在系统启动时需要初始化定时器管理系统。 void rt_system_timer_init(void);如果需要使用SOFT_TIMER&#xff0c;则系统初始化时&#xff0c;应该调用 void rt_system_timer_thread_init(void);定时器控制块中含有定时器相关的重要参数&#xff0c;在定时器…

高标准化及可扩展的产品能力,助力声通科技运营效率不断提升

高标准化及可扩展的产品能力对企业发展具有重要意义&#xff0c;有助于企业提高运营效率、增强市场竞争力&#xff0c;并推动企业实现规模化发展。上海声通信息科技股份有限公司&#xff08;下文称&#xff1a;声通科技或公司&#xff09;作为我国领先的企业级全栈交互式人工智…

ViM-UNet:用于生物医学细分的 Vision Mamba

ViM-UNet&#xff1a;用于生物医学细分的 Vision Mamba 摘要IntroductionMethod and Experiments结果与讨论 ViM-UNet: Vision Mamba for Biomedical Segmentation 摘要 卷积神经网络&#xff08;CNNs&#xff09;&#xff0c;尤其是UNet&#xff0c;是生物医学分割的默认架构…

Java报表是什么?盘点2023最实用的四款Java报表

从字面义就可以推知&#xff0c;Java报表指的是在Java环境下开发或使用的报表工具。Java语言因其功能强大和简单易用的特点&#xff0c;是静态面向对象编程语言的代表&#xff0c;在Java环境开发使用的这些报表工具&#xff0c;可以通过提供可视化操作界面制作报表&#xff0c;…

如果补货机器人也开始搬砖

过去几年&#xff0c;如果一位顾客的欲购商品疑似缺货&#xff0c;“请稍等&#xff0c;我去后台查一下”便是最常听到的一句话。随着过去几年劳动力短缺的加剧&#xff0c;货架并不总像许多人习惯的那样满满当当。为减轻不断补货的负担&#xff0c;使员工可以将精力集中于其他…

LINUX网卡一般性问题分析

一、网卡相关概念 网卡&#xff1a;网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件。 网络模型&#xff1a;OSI网络模型、TCP/IP网络模型 LINUX网络收发流程&#xff1a; 1. 内核分配一个主内存地址段&#xff08;DMA缓冲区)&#xff0c;网卡设备可以在…

【微信小程序之分包】

微信小程序之分包 什么是分包分包的好处分包前的结构图分包后的结构图分包的加载规则分包的体积限制使用分包打包原则引用原则独立分包独立分包的配置方法独立分包的引用原则分包预下载配置分包的预下载分包预下载限制 什么是分包 分包指的是把一个完整小程序项目&#xff0c;…

大模型LLM基于本地ollama平台的RAG数据增强的文档问答系统调试

环境&#xff1a;python 3.10.13 1. 加载文档 import bs4 from langchain_community.document_loaders import WebBaseLoader# Only keep post title, headers, and content from the full HTML. bs4_strainer bs4.SoupStrainer(class_("post-title", "post-…

SpringBoot 中获取yml文件的值

获取yml配置文件的值 获取yml配置的值&#xff0c;可以用Value注解去获取 Value("${键名}")使用方法&#xff1a;例如配置文件存放一个学生的信息&#xff1a; student:name: lisiage: 13获取该学生的的name Value("${student.name}")获取yml的值 还可…

2024-14.python前端+Django

第四篇 web前端 第1章 、Web的基本概念 前端基础总共分为三部分&#xff1a;html、css和js。 1.3、HTTP协议 1.3.1 、http协议简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于万维网&#xff08;WWW:World Wide Web &am…

AI人工智能老师大模型讲师叶梓 OneLLM:开创性的多模态大型语言模型技术

在人工智能领域&#xff0c;多模态大型语言模型&#xff08;MLLM&#xff09;的研究一直是一个热门话题。近期&#xff0c;一种名为OneLLM的创新技术引起了业界的广泛关注。OneLLM通过其独特的统一框架&#xff0c;实现了多种不同模态与自然语言的高效对齐&#xff0c;为多模态…

6-129 统计二叉树叶子结点的个数(Python语言描述)

本题要求计算二叉树中有多少片树叶,输出格式见样例。 函数接口定义: #树叶统计 def leafCount(T)其中二叉树类的定义如下: #二叉树的存储-二叉链表 class BinaryTree:#1.构造方法def __init__(self,newValue):self.key = newValue #树根self.left = None #左子…

操作系统—GCC与编译全流程

文章目录 GCC与编译全流程1.GCC是什么&#xff1f;2.编译全流程(1).GCC到底做了哪些事情&#xff1f;(2).预处理I.预处理会做什么II.预处理器主要包含什么&#xff1f;III.宏的一些魔法 (3).编译I.基本流程II.编译优化III.一点例子 (4).汇编(5).链接(6).说到这里&#xff0c;为…

解剖this指针

目录 this指针的理解 1. this指针的用处 2.this指针的使用 3.this指针的使用 this指针来源 this指针的理解 通常在class定义时要用到类型变量自身时&#xff0c;因为这时候还不知道变量名&#xff08;为了通用也不可能固定实际的变量名&#xff09;&#xff0c;就用this这样…

在 CentOS 上安装 Docker 和 Docker Compose

在 CentOS 上安装 Docker 和 Docker Compose 的步骤如下&#xff1a; 首先&#xff0c;安装 Docker&#xff1a; 卸载旧版本的 Docker&#xff1a; sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker…

Java面试 Day03

接口和抽象类有什么区别static和final有什么区别JVM加载类如何索引优化MySQL采用什么结构存储索引 为什么搜索算法有了解吗线程同步的几个方案&#xff0c;以及原理final关键词JVM调优&#xff0c;OOM经历隔离级别&#xff0c;InnoDB中几个隔离级别的原理Linux常用命令Redis可靠…

windows网络驱动开发

基石&#xff1a;WFP 1、简介 Windows过滤平台&#xff08;Windows Filtering Platform, WFP&#xff09;&#xff0c;是从Vista系统后新增的一套系统API和服务。开发者可以在WFP框架已划分的不同分层中进行过滤、重定向、修改网络数据包&#xff0c;以实现防火墙、入侵检测系…