quartz持久化到mysql报错_【Quartz】持久化到数据库【五】

前言

我们做到这里已经对Quartz定时器组件已经是学会了基本的使用了。但是我们有没有想过任务开启之后万一断掉了,当机了我们怎么办,你是否还想继续执行原先的任务。我们普通的创建是把任务放在内存中存储,如果内存被释放掉,任务也就消失了,那怎么办哪,不得不说这个组件还是很厉害的。他已经帮我们想过了解方案---就是放到数据库。

Quartz插一嘴:

quartz在任务中分为两种:有状态和无状态执行。

有状态:对于同一个 trigger 来说,有状态的 job 不能被并行执行,只有上一次触发的任务被执行完之后,才能触发下一次执行。所有我自己理解为串行的顺序执行(自己怎么好记怎么理解 哈哈)

无状态:无状态任务一般指可以并发的任务,即任务之间是独立的,不会互相干扰。就是各自干各自的。

数据库概貌:

首先上一下sql脚本下载地址:sql数据库rar文件下载

表结构瞅一瞅:

5cab9351f26831dcd142f731feb6e819.png

下面是表代表的大致意思吧:

表名

描述

QRTZ_BLOB_TRIGGERS

作为 Blob 类型存储(用于 Quartz 用户用 JDBC 创建他们自己定制的 Trigger 类型,JobStore 并不知道如何存储实例的时候)

QRTZ_CALENDARS

以 Blob 类型存储 Quartz 的 Calendar 信息

QRTZ_CRON_TRIGGERS

存储 Cron Trigger,包括 Cron 表达式和时区信息

QRTZ_FIRED_TRIGGERS

存储与已触发的 Trigger 相关的状态信息,以及相联 Job 的执行信息

QRTZ_JOB_DETAILS

存储每一个已配置的 Job 的详细信息

QRTZ_LOCKS

存储程序的非观锁的信息(假如使用了悲观锁)

QRTZ_PAUSED_TRIGGER_GRPS

存储已暂停的 Trigger 组的信息

QRTZ_SCHEDULER_STATE

存储少量的有关 Scheduler 的状态信息,和别的 Scheduler 实例(假如是用于一个集群中)

QRTZ_SIMPLE_TRIGGERS

存储简单的 Trigger,包括重复次数,间隔,以及已触的次数

QRTZ_SIMPROP_TRIGGERS

QRTZ_TRIGGERS

存储已配置的 Trigger 的信息

代码部分:

工具都有了那就干活吧,既然我上面说了任务分为有状态和无状态,那正好借这个例子一起给介绍一下。首先还是我们的老朋友任务的创建:

这是一个无状态任务

public classServerJob : IJob

{private const string Count = "count";public virtual voidExecute(IJobExecutionContext context)

{

JobKey jobKey=context.JobDetail.Key;try{//如果任务是恢复的任务的话

if(context.Recovering)

{

WritTxt.WriteFile("serversql", jobKey+":恢复打印");

}else{

WritTxt.WriteFile("serversql", jobKey+":启动打印");

}

JobDataMap data=context.JobDetail.JobDataMap;intcount;if(data.ContainsKey(Count))

{

count=data.GetInt(Count);

}else{

count= 0;

}

count++;

data.Put(Count, count);

WritTxt.WriteFile("serversql", string.Format("结束: {0} done at {1}\n 累计数 #{2}", jobKey, DateTime.Now.ToString("r"), count));

}catch(Exception ex)

{

}

}

}

下面是一个有状态任务,因为本人比较懒所有就不写新任务了,直接继承了无状态任务事件。

[PersistJobDataAfterExecution] //代表当前任务是否有状态

[DisallowConcurrentExecution]//代表任务不允许并发

public classServerJobState : ServerJob

{

}

下面就是我们要说的重点了;数据库配置

只需要在实例化调度器前把我们的数据库配置传进去就好了。

///

///持久化属性///

NameValueCollection properties = newNameValueCollection();publicExampleServer()

{

properties["quartz.scheduler.instanceName"] = "TestScheduler";

properties["quartz.scheduler.instanceId"] = "instance_one";

properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";

properties["quartz.threadPool.threadCount"] = "5";

properties["quartz.threadPool.threadPriority"] = "Normal";

properties["quartz.jobStore.misfireThreshold"] = "60000";

properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";

properties["quartz.jobStore.useProperties"] = "false";

properties["quartz.jobStore.dataSource"] = "default";

properties["quartz.jobStore.tablePrefix"] = "QRTZ_";

properties["quartz.jobStore.clustered"] = "true";

properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz";

properties["quartz.dataSource.default.connectionString"] = "Server=(local);Database=quartz;Trusted_Connection=True;";

properties["quartz.dataSource.default.provider"] = "SqlServer-20";//First we must get a reference to a scheduler

ISchedulerFactory sf = newStdSchedulerFactory(properties);

Scheduler=sf.GetScheduler();

}

然后就是运行测试了,这里我用了不同的形式返回了调度器和调度工厂。这样子也挺好用的,可以把以前的那种方法改成这种。

///

///调度工厂///

private static StdSchedulerFactory SchedulerFactory { get; set; }///

///调度接口///

private static IScheduler Scheduler { get; set; }#region 0.测试

public voidRun()

{string schedId =Scheduler.SchedulerInstanceId;

IJobDetail job= JobBuilder.Create()

.WithIdentity("ServerJob", schedId)

.RequestRecovery()

.Build();

ITrigger trigger=TriggerBuilder.Create()

.WithIdentity("serverTrigger", schedId)

.WithCronSchedule("0/10 * * * * ?") //5秒执行一次

.Build();//已存在就不重复添加

try{

Scheduler.ScheduleJob(job, trigger);

}catch(Exception ex)

{

}

IJobDetail jobState= JobBuilder.Create()

.WithIdentity("ServerJobSatte", schedId)

.RequestRecovery()

.Build();

ITrigger triggerState=TriggerBuilder.Create()

.WithIdentity("serverTriggerSatte", schedId)

.WithCronSchedule("0/10 * * * * ?") //5秒执行一次

.Build();//已存在就不重复添加

try{

Scheduler.ScheduleJob(jobState, triggerState);

}catch(Exception ex)

{

}//启动

Scheduler.Start();

}#endregion

最后就是大结局了,让我们看下运行结果吧:

7ca91bb81ab559dab575d5b881f5e4ec.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值