Quartz任务调度在NetCore中的持久化到数据库

NetCore中经常用到的任务调度就是Hangfire,但是在工作中发现Hangfire还是有一些不满意的地方,比如不持久秒级任务调度,不支持大量文件二进制在后台运行。由于这些问题,自己就开始着手研究学习Quartz在NetCore中的使用,简单的使用看文档都能解决,但是Quartz任务存储到相应的数据库本人找了很久大多都是关于Java的,也有一些零散的关于Quartz.Net在NetCore平台下的持久化存储。但是最终都没能搞定,于是决定自己慢慢摸索和动手实践,自己结合官方文档Quartz.Net以及Java平台下的Quartz持久化到各数据库需要的sqlQuartz持久化数据库所需sql语句一步步实现了它。下面我就带大家走进使用Quartz.Net以及其在NetCore平台下的相关包实现Job Trigger Schedule持久化到数据库。
由于本人是在MySql下面就行持久化,这里就以MySql为例子。

引入在Net平台下使用Quartz所需包

在NuGet下搜索即可:
1)Quartz.Net 主要的包
为了更好使用依赖注入对Quartz的持久化以及一些属性的配置,以及使用依赖注入的方式使用Quartz
2)Quartz.AspNetCore
3)Quartz.Extensions.DependencyInjection
4)Quartz.Serialization.Json 主要是对数据进行序列化
2/3/4你分别可以参考Quartz.Net官网的一下地址:
AspNetCore集成Quartz
Microsoft DI集成Quartz
Quartz数据序列化

Quartz持久化MySql数据库所需表的语句以及相关表及字段的解析

注意如果直接从上面的github中获取的sql语句有坑有坑有坑,血一样的教训,需要自己修改一些东西,比如我在使用mysql时,它的bool值是采用varchar字段存储需要手动改为bit,即可以手动把为varchar(1)的都改为bit(1),这样才能正常持久化。
以下是我修改后能正常持久化的sql语句可以直接使用。

#
# In your Quartz properties file, you'll need to set
# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#
#
# By: Ron Cordell - roncordell
#  I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM.

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;

#存储的是job的详细信息 
CREATE TABLE QRTZ_JOB_DETAILS(
SCHED_NAME VARCHAR(120) NOT NULL,#调度名称
JOB_NAME VARCHAR(190) NOT NULL,#job名称
JOB_GROUP VARCHAR(190) NOT NULL,#job组
DESCRIPTION VARCHAR(250) NULL,#描述
JOB_CLASS_NAME VARCHAR(250) NOT NULL,#job的类名 实现IJob接口
IS_DURABLE bit(1) NOT NULL,#是否持久化 默认为0 下同
IS_NONCONCURRENT bit(1) NOT NULL,#是否不并发
IS_UPDATE_DATA bit(1) NOT NULL,#是否更新
REQUESTS_RECOVERY bit(1) NOT NULL,#是否请求恢复 就是说当强制停止之后 是否保护现场 当再次启动时接着执行
JOB_DATA BLOB NULL, #job上的数据
PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
ENGINE=InnoDB;

#触发器信息
CREATE TABLE QRTZ_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,#调度名称
TRIGGER_NAME VARCHAR(190) NOT NULL,#触发器名称 
TRIGGER_GROUP VARCHAR(190) NOT NULL,#触发器组
JOB_NAME VARCHAR(190) NOT NULL,#job名称
JOB_GROUP VARCHAR(190) NOT NULL,#job组
DESCRIPTION VARCHAR(250) NULL,#描述
NEXT_FIRE_TIME BIGINT(13) NULL,#下一次触发时间 毫秒数的时间
PREV_FIRE_TIME BIGINT(13) NULL,#上一次触发时间
PRIORITY INTEGER NULL,#优先级 默认为5
TRIGGER_STATE VARCHAR(16) NOT NULL,#触发器的状态 WAITING,PAUSED,ACQUIRED分别为:等待,暂停,运行中
TRIGGER_TYPE VARCHAR(8) NOT NULL,#触发器类型:simple和cron
START_TIME BIGINT(13) NOT NULL,#开始触发时间
END_TIME BIGINT(13) NULL,#结束触发时间
CALENDAR_NAME VARCHAR(190) NULL,#日历名称
MISFIRE_INSTR SMALLINT(2) NULL,
JOB_DATA BLOB NULL,#job数据
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))
ENGINE=InnoDB;

#简单触发器信息
CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,#调度名称
TRIGGER_NAME VARCHAR(190) NOT NULL,#触发器名称
TRIGGER_GROUP VARCHAR(190) 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))
ENGINE=InnoDB;

#corn表达式触发器信息
CREATE TABLE QRTZ_CRON_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(190) NOT NULL,
TRIGGER_GROUP VARCHAR(190) NOT NULL,
CRON_EXPRESSION VARCHAR(120) NOT NULL,
TIME_ZONE_ID VARCHAR(80), #时区Id
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))
ENGINE=InnoDB;

#
CREATE TABLE QRTZ_SIMPROP_TRIGGERS
  (
    SCHED_NAME VARCHAR(120) NOT NULL,
    TRIGGER_NAME VARCHAR(190) NOT NULL,
    TRIGGER_GROUP VARCHAR(190) 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 bit(1) NULL,
    BOOL_PROP_2 bit(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))
ENGINE=InnoDB;

#触发器存为二进制大对象类型 用于Quartz用户自己触发数据库定制自己的触发器
CREATE TABLE QRTZ_BLOB_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(190) NOT NULL,
TRIGGER_GROUP VARCHAR(190) NOT NULL,
BLOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;

#
CREATE TABLE QRTZ_CALENDARS (
SCHED_NAME VARCHAR(120) NOT NULL,
CALENDAR_NAME VARCHAR(190) NOT NULL,
CALENDAR BLOB NOT NULL,
PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
ENGINE=InnoDB;

#暂停触发的任务组信息
CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_GROUP VARCHAR(190) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_GROUP))
ENGINE=InnoDB;

#正在运行执行的触发器信息
CREATE TABLE QRTZ_FIRED_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
ENTRY_ID VARCHAR(95) NOT NULL,
TRIGGER_NAME VARCHAR(190) NOT NULL,
TRIGGER_GROUP VARCHAR(190) NOT NULL,
INSTANCE_NAME VARCHAR(190) 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(190) NULL,
JOB_GROUP VARCHAR(190) NULL,
IS_NONCONCURRENT bit(1) NULL,
REQUESTS_RECOVERY bit(1) NULL,
PRIMARY KEY (SCHED_NAME,ENTRY_ID))
ENGINE=InnoDB;

#调度器状态信息 #存储集群中note实例信息,quartz会定时读取该表的信息判断集群中每个实例的当前状态,INSTANCE_NAME:配置文件中quartz.scheduler.instanceName配置的名字,就会写入该字段,如##果设置为AUTO,quartz会根据物理机名和当前时间产生一个名字
CREATE TABLE QRTZ_SCHEDULER_STATE (
SCHED_NAME VARCHAR(120) NOT NULL,
INSTANCE_NAME VARCHAR(190) NOT NULL,
LAST_CHECKIN_TIME BIGINT(13) NOT NULL,#上次检查时间
CHECKIN_INTERVAL BIGINT(13) NOT NULL,#检查间隔时间
PRIMARY KEY (SCHED_NAME,INSTANCE_NAME))
ENGINE=InnoDB;

#悲观锁发生的记录信息
CREATE TABLE QRTZ_LOCKS (
SCHED_NAME VARCHAR(120) NOT NULL,
LOCK_NAME VARCHAR(40) NOT NULL,
PRIMARY KEY (SCHED_NAME,LOCK_NAME))
ENGINE=InnoDB;

CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY ON QRTZ_JOB_DETAILS(SCHED_NAME,REQUESTS_RECOVERY);
CREATE INDEX IDX_QRTZ_J_GRP ON QRTZ_JOB_DETAILS(SCHED_NAME,JOB_GROUP);

CREATE INDEX IDX_QRTZ_T_J ON QRTZ_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_JG ON QRTZ_TRIGGERS(SCHED_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_T_C ON QRTZ_TRIGGERS(SCHED_NAME,CALENDAR_NAME);
CREATE INDEX IDX_QRTZ_T_G ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
CREATE INDEX IDX_QRTZ_T_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_N_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_N_G_STATE ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_GROUP,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME ON QRTZ_TRIGGERS(SCHED_NAME,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_ST ON QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_STATE,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME);
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP ON QRTZ_TRIGGERS(SCHED_NAME,MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);

CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME);
CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,INSTANCE_NAME,REQUESTS_RECOVERY);
CREATE INDEX IDX_QRTZ_FT_J_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_FT_JG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,JOB_GROUP);
CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP);
CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);

commit;

运行上面的sql语句后会生成如下图这些表:
在这里插入图片描述

实现Net中Quartz持久化到数据库

在appsettings.js中配置调度器实例名称

这里以调度器实例名称作为演示,实际调度器实例名称可以在下面的代码中指定

//配置Quartz节点
  "Quartz": {
    "quartz.scheduler.instanceName": "Quartz ASP.NET Core Sample Scheduler"
	//其他节点也可配置 具体去Quartz.Net官网查看
  }

在Startup.cs中配置Quartz相关信息

在Startup的ConfigureServices方法中。

//appsettings.js中配置的Quartz节点读取
services.Configure<QuartzOptions>(Configuration.GetSection("Quartz"));
//可以设置一些QuartzOptions的其他信息
services.Configure<QuartzOptions>(options =>
            {
                options.Scheduling.IgnoreDuplicates = true; // default: false
                options.Scheduling.OverWriteExistingData = true; // default: true
            });
 
 			//添加Quartz
            services.AddQuartz(q =>
            {
            	//使用持久化存储
                q.UsePersistentStore(s =>
                {
                    s.UseProperties = true;
                    s.RetryInterval = TimeSpan.FromSeconds(15);
                    s.UseMySql(mysql =>
                    {
                        mysql.ConnectionString = "server=localhost;uid=root;pwd=wy.023;port=3306;database=mydb;Allow User Variables=True";
                        // this is the default
                        mysql.TablePrefix = "qrtz_";
                    });
                    s.UseJsonSerializer();
                    s.UseClustering(c =>
                    {
                        c.CheckinMisfireThreshold = TimeSpan.FromSeconds(20);
                        c.CheckinInterval = TimeSpan.FromSeconds(10);
                    });
                });
                q.UseMicrosoftDependencyInjectionJobFactory();
                q.UseDefaultThreadPool(tp =>
                {
                    tp.MaxConcurrency = 10;
                });

				//添加一个循环任务
                JobDataMap jobDataMap = new JobDataMap();
                jobDataMap.Put("haha", "hahahaha");
                q.ScheduleJob<FirstQuartzJob>(trigger => trigger
                .WithIdentity("Combined Configuration Trigger")
                .StartAt(DateBuilder.EvenSecondDate(DateTimeOffset.UtcNow.AddSeconds(7)))
                .WithCronSchedule("0/1 * * * * ?")
                .WithDescription("my awesome trigger configured for a job with single call")
                .UsingJobData(jobDataMap)
                );
            });


            services.AddQuartzServer(options =>
            {
                // when shutting down we want jobs to complete gracefully
                options.WaitForJobsToComplete = true;
            });


//FirstQuartzJob.cs类
/// <summary>
    /// quartzjob 
    /// </summary>
    public class FirstQuartzJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            var result=context.JobDetail.JobDataMap.ContainsKey("haha");
            if(result)
                System.IO.File.AppendAllText(@"D:\Quartz.txt", DateTime.Now + context.JobDetail.JobDataMap.GetString("haha")+ Environment.NewLine);
            else
                //向c:\Quartz.txt写入当前时间并换行
                System.IO.File.AppendAllText(@"D:\Quartz.txt", DateTime.Now + Environment.NewLine);
            
        }
    }

自此集成完毕。运行程序之后,你可以在以下的数据表中看到这些数据:

调度器信息
在这里插入图片描述
job详情
在这里插入图片描述
由于job已经持久化存储到数据库中, 当我们即使把代码中的调度FirstQuartz注释掉,再次启动程序依然会执行。这就足以表明已经持久化了。

在执行中的触发器表
在这里插入图片描述
由于这里我关闭程序时处于EXECUTING执行状态,所以处于执行状态,实际上你可以这样测试一下,当程序在Execute方法中执行时,你打上断点你会发现此时程序处于执行中。如果是一个立即执行一次的触发性任务,job绑定并开始触发调度会先进入这个表中,当执行完成后会从这个表中删除这条记录,在后面的触发性任务中演示

cron表达式触发器,上面FirstQuartzJob我们是使用的一个cron表达式触发器,所以在这里会存储在cron表达式表中
在这里插入图片描述

在Controller中执行立即触发的任务

这你只是我觉得方便的写法,其他写法可根据自己和参考Quartz.Net官网自己去发现

[ApiController]
    [Route("[controller]/[action]")]
    public class HomeController : ControllerBase
    {
       //注入调度工厂
        private readonly ISchedulerFactory schedulerFactory;

        public HomeController(ISchedulerFactory schedulerFactory)
        {
            this.schedulerFactory = schedulerFactory;
        
        }

        public async Task Index()
        {

            //触发性任务会持久化到fired_triggers表中,执行完了会从该表中移除
            scheduler = await schedulerFactory.GetScheduler();

            JobDataMap jobDataMap = new JobDataMap();
            jobDataMap.Put("haha", "ahahaahaha");
            IJobDetail jobDetail=JobBuilder.Create<FirstQuartzJob>().SetJobData(jobDataMap).WithIdentity("jobhahaha").Build();
            ITrigger trigger = TriggerBuilder.Create().StartNow().Build();
            await scheduler.ScheduleJob(jobDetail, trigger);
           

        }

    }

至此实现完毕,欢迎给位指出不足。下一步准备实现界面化Quartz,类似Hangfire一样。。。敬请期待。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Quartz是一种广泛使用的开源调度器,可用于安排和执行重复的任务。它可以持久化数据库以保证调度任务的持久化和可靠性。 要将Quartz持久化数据库,需要配置Quartz的数据存储设置。具体步骤如下: 1. 首先,需要在项目添加Quartz的相关依赖库。 2. 然后,在Quartz的配置文件指定要使用的数据存储方式。这可以通过设置以下属性来完成: ``` org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.dataSource = myDS org.quartz.jobStore.tablePrefix = QRTZ_ ``` 这些属性指定了使用JDBC JobStore来管理Quartz作业,以及使用指定的数据源和表前缀。 3. 接下来,需要在项目配置数据源。这可以通过在项目的配置文件添加以下内容来完成: ``` <bean id="myDS" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost/quartz"/> <property name="username" value="root"/> <property name="password" value=""/> <property name="maxActive" value="100"/> <property name="maxIdle" value="30"/> </bean> ``` 这将创建一个基本的数据源,以连接到MySQL数据库,并指定要使用的用户名和密码。 4. 最后,需要在Quartz的配置文件设置以下属性,以启用持久化: ``` org.quartz.jobStore.isClustered = false org.quartz.jobStore.useProperties = false org.quartz.jobStore.misfireThreshold = 60000 org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate ``` 这些属性将启用持久化,并指定Quartz的一些行为,例如任务执行延迟和驱动程序代理类。 完成上述步骤后,Quartz就会将作业和触发器存储在指定的数据库,以便在应用程序重新启动时继续执行。 ### 回答2: Quartz是一个开源的任务调度框架,可以实现定时任务的管理和执行。对于需要持久化数据库的任务,Quartz提供了一种方便的方式来实现。 首先,我们需要创建一个数据库表来存储Quartz的相关信息,例如任务名称、任务分组、触发器类型、任务描述、触发器表达式等。可以使用SQL脚本来创建这个表,也可以使用Quartz提供的API来自动创建。 在Quartz的配置文件,我们需要指定数据库及相关信息。这个配置文件可以是一个.properties文件或者一个.xml文件。其,我们需要配置数据库的连接信息,例如数据库的URL、用户名和密码。还需要配置Quartz使用的数据库驱动程序。 在任务调度的代码,我们可以使用Quartz提供的API来创建和管理任务。首先,我们需要创建一个Job类来定义要执行的任务。然后,创建一个JobDetail对象,并指定要执行的Job类。接下来,创建一个触发器(Trigger)对象,并设置触发器的相关属性,例如触发时间、重复次数等。 在Quartz的配置文件,我们还可以配置任务调度的相关策略,例如任务调度的线程池大小、任务触发器的优先级、任务的持久化等。通过设置任务的持久化为true,Quartz会将任务的相关信息持久化数据库。 当我们启动Quartz任务调度器时,Quartz会根据配置的触发器信息,自动调度和执行任务。执行过程Quartz会将任务的相关执行信息存储到数据库。这些信息包括任务的执行时间、执行状态、执行结果等。 通过Quartz持久化功能,我们可以保证即使在应用程序重启或者服务器宕机的情况下,定时任务仍然能够准确地执行。这对于一些重要的定时任务来说非常关键,可以提高系统的可靠性和稳定性。 ### 回答3: Quartz是一个开源的作业调度框架,它允许开发人员在Java应用程序配置和管理作业的执行。Quartz持久化功能允许将作业和调度信息保存到数据库,以确保在应用程序重启或故障恢复后作业可以正确地继续执行。 在Quartz持久化过程,主要涉及到两个核心概念:作业存储和触发器存储。 作业存储是用于存储作业相关信息的数据库表,包括作业名称、作业组、作业类、作业描述等。通过将作业信息存储到数据库,可以确保即使应用程序停止运行,作业的配置信息仍然可以保留。 触发器存储是用于存储触发器相关信息的数据库表,包括触发器名称、触发器组、触发器类型、触发器运行时间等。通过将触发器信息存储到数据库,可以确保触发器的调度信息可以被恢复,从而保证作业能够按照预定的时间和频率执行。 Quartz提供了多种数据库持久化方案,包括使用JDBC进行持久化、使用JPA进行持久化等。开发人员可以根据自己的需求选择最适合的方案进行配置。 此外,Quartz还提供了相应的API和工具,使得将作业和触发器信息持久化数据库变得简单和方便。开发人员可以通过编写代码或者配置文件来实现持久化的相关功能。 总之,Quartz持久化功能可以确保作业和调度信息能够持久保存到数据库,从而保证在应用程序重启或故障恢复后作业可以正确地继续执行。这样可以提高应用程序的可靠性和稳定性,同时也提供了方便的管理和配置方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值