【Quartz】持久化到数据库【五】

时间:2022-09-02 20:45:19

  前言

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

  Quartz插一嘴:

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

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

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

数据库概貌:

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

表结构瞅一瞅:

【Quartz】持久化到数据库【五】

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

表名

描述

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 class ServerJob : IJob
{
private const string Count = "count";
public virtual void Execute(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;
int count;
if (data.ContainsKey(Count))
{
count = data.GetInt(Count);
}
else
{
count = ;
}
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 class ServerJobState : ServerJob
{
}

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

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

/// <summary>
/// 持久化属性
/// </summary>
NameValueCollection properties = new NameValueCollection();
public ExampleServer()
{
properties["quartz.scheduler.instanceName"] = "TestScheduler";
properties["quartz.scheduler.instanceId"] = "instance_one";
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.threadPool.threadCount"] = "";
properties["quartz.threadPool.threadPriority"] = "Normal";
properties["quartz.jobStore.misfireThreshold"] = "";
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 = new StdSchedulerFactory(properties);
Scheduler = sf.GetScheduler();
}

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

 /// <summary>
/// 调度工厂
/// </summary>
private static StdSchedulerFactory SchedulerFactory { get; set; } /// <summary>
/// 调度接口
/// </summary>
private static IScheduler Scheduler { get; set; } #region 0.测试
public void Run()
{
string schedId = Scheduler.SchedulerInstanceId;
IJobDetail job = JobBuilder.Create<ServerJob>()
.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<ServerJobState>()
.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

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

【Quartz】持久化到数据库【五】

【Quartz】持久化到数据库【五】的更多相关文章

  1. quartz 持久化 数据库表

    此处只包括配置数据库操作 quartz 持久化数据库表格字段解释建表,SQL语句在dbTables文件夹中可以找到,介绍下我们开发主要使用到的表: (版本不一样,可能数据库表也不一样,这里使用2.2. ...

  2. SpringBoot2&period;x集成Quartz实现定时任务管理(持久化到数据库)

    1. Quartz简介   Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目.   Quartz是一个完全由Java编写的开源作业调度框架,为在Java应 ...

  3. SpringBoot整合Quartz定时任务(持久化到数据库)

    背景 最近在做项目,项目中有个需求:需要使用定时任务,这个定时任务需要即时生效.查看Quartz官网之后发现:Quartz提供两种基本作业存储类型: RAMJobStore :RAM也就是内存,默认情 ...

  4. Spring Quartz 持久化解决方案

    Quartz是实现了序列化接口的,包括接口,所以可以使用标准方式序列化到数据库. 而Spring2.5.6在集成Quartz时却未能考虑持久化问题. Spring对JobDetail进行了封装,却未实 ...

  5. quartz定时任务(数据库需要的表)

    Quartz将Job保存在数据库中所需表的说明 QRTZ_CALENDARS 以 Blob 类型存储 Quartz 的 Calendar 信息 QRTZ_CRON_TRIGGERS 存储 Cron T ...

  6. Jena将owl文件持久化到数据库中

    package cn.edu.shu.db; import java.io.File; import java.io.FileInputStream; import java.io.IOExcepti ...

  7. ActiveMQ&lpar;4&rpar; ActiveMQ JDBC 持久化 Mysql 数据库

    ActiveMQ 消息持久化机制: ActiveMQ 消息的持久化机制有 JDBC.AMQ.KahaDB 和 LevelDB,其中本示例版本(5.15.2)默认机制为 KahaDB.无论哪种持久化机制 ...

  8. Quartz持久化到mongodb

    springboot中集成quzrtz ,持久到mongodb 1.pom引用 <?xml version="1.0" encoding="UTF-8"? ...

  9. 【Quartz】将定时任务持久化到数据库

    之前的文章所做的demo是将定时任务的信息保存在内存中的,见以下配置 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 如果,我们需要在 ...

随机推荐

  1. Droid4x快照还原

    一.问题描述 1. Droid4x还原快照可以通过VirtualBox 先还原快照 2. virtualbox 还原快照之后 如果没有用virtualbox启动 并关闭     而是直接启动Droid ...

  2. 使用Notepad&plus;&plus;代替笨拙的Arduino IDE

    Arduino自带的IDE 太不好用了,下面是用强大,轻量级,免费,开源,丰富插件的的Notepad++编辑器来打造Arduino开发环境 . 配置过程对新生来说可能有些繁琐,但是我尽力写的很详细了, ...

  3. CUDA编程

    目录: 1.什么是CUDA 2.为什么要用到CUDA 3.CUDA环境搭建 4.第一个CUDA程序 5. CUDA编程 5.1. 基本概念 5.2. 线程层次结构 5.3. 存储器层次结构 5.4. ...

  4. Javascript 学习笔记 无缝滚动

    效果 : 鼠标移入图片 停止滚动, 鼠标移出自动滚动 可以调整向左或右方向滚动 <style type="text/css"> * { margin:; padding ...

  5. 如何用Word编辑参考文献------这是引用一位大师的

    如何用Word编辑参考文献修改文献是一件非常痛苦的事情,虽然现在也有很多软件可以编排参考文献,其实word本身就可以. 采用合适的编辑方法会方便地做到整齐,规范,自动排序和交叉引用.1.以尾注的方式插 ...

  6. Java的五子棋实现

    Java 五子棋 注:除机器人算法外其余借鉴于MLDN. package MyFiveChess; import robot.*; import java.awt.*; import javax.sw ...

  7. sns&period;pairplot

    sklearn实战-乳腺癌细胞数据挖掘(博客主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&a ...

  8. VS2010与Qt5&period;1&period;0集成&lpar;非源码方式&rpar;

    早就听说qt可以集成到VS中,就是一直没尝试过.一直在使用qt creator,也没觉得它有什么不好.可最近VS用多了,我发现一个qt creator中很不好的毛病,就是代码自动完成时,creator ...

  9. MySQL数据库之索引

    1 引言 在没有索引的情况下,如果要寻找特定行,数据库可能要遍历整个数据库,使用索引后,数据库可以根据索引找出这一行,极大提高查询效率.本文是对MySQL数据库中索引使用的总结. 2 索引简介 索引是 ...

  10. PHP获取指定函数定义在哪个文件中及行号

    当调试开源的代码时,希望查看某个函数的定义,那么就需要定位其位置.特别是有的项目中,函数会有多个地方都有定义,那么如果我想知道当前调用的这个函数是在哪里定义的,可以用下面这个方法. function ...