支持集群高可用的开发方案

Quartz.net的数据库表结构

如果支持集群与持久化,单靠本机的内存和xml来保存计算任务调度的各种状态值,可想而知,是困难的。所以支持数据库这样的解决方案,OpenSymphony组织怎么可能会给遗漏。

官方提供的各种数据库脚本:https://github.com/quartznet/quartznet/tree/master/database/tables

下面我给大家展示下quartz任务调度的MS SQLSERVER表结构

创建表结构T-SQL脚本

USE [enter_db_name_here]
GOIF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
ALTER TABLE [dbo].[QRTZ_TRIGGERS] DROP CONSTRAINT FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS
GOIF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
ALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] DROP CONSTRAINT FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS
GOIF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
ALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] DROP CONSTRAINT FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS
GOIF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISFOREIGNKEY') = 1)
ALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] DROP CONSTRAINT FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS
GOIF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_QRTZ_JOB_LISTENERS_QRTZ_JOB_DETAILS]') AND parent_object_id = OBJECT_ID(N'[dbo].[QRTZ_JOB_LISTENERS]'))
ALTER TABLE [dbo].[QRTZ_JOB_LISTENERS] DROP CONSTRAINT [FK_QRTZ_JOB_LISTENERS_QRTZ_JOB_DETAILS]IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_QRTZ_TRIGGER_LISTENERS_QRTZ_TRIGGERS]') AND parent_object_id = OBJECT_ID(N'[dbo].[QRTZ_TRIGGER_LISTENERS]'))
ALTER TABLE [dbo].[QRTZ_TRIGGER_LISTENERS] DROP CONSTRAINT [FK_QRTZ_TRIGGER_LISTENERS_QRTZ_TRIGGERS]IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_CALENDARS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
DROP TABLE [dbo].[QRTZ_CALENDARS]
GOIF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_CRON_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
DROP TABLE [dbo].[QRTZ_CRON_TRIGGERS]
GOIF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_BLOB_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
DROP TABLE [dbo].[QRTZ_BLOB_TRIGGERS]
GOIF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_FIRED_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
DROP TABLE [dbo].[QRTZ_FIRED_TRIGGERS]
GOIF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_PAUSED_TRIGGER_GRPS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
DROP TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS]
GOIF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_JOB_LISTENERS]') AND type in (N'U'))
DROP TABLE [dbo].[QRTZ_JOB_LISTENERS]IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_SCHEDULER_STATE]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
DROP TABLE [dbo].[QRTZ_SCHEDULER_STATE]
GOIF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_LOCKS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
DROP TABLE [dbo].[QRTZ_LOCKS]
GO
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[QRTZ_TRIGGER_LISTENERS]') AND type in (N'U'))
DROP TABLE [dbo].[QRTZ_TRIGGER_LISTENERS]IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_JOB_DETAILS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
DROP TABLE [dbo].[QRTZ_JOB_DETAILS]
GOIF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_SIMPLE_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
DROP TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS]
GOIF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_SIMPROP_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
DROP TABLE [dbo].QRTZ_SIMPROP_TRIGGERS
GOIF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[QRTZ_TRIGGERS]') AND OBJECTPROPERTY(id, N'ISUSERTABLE') = 1)
DROP TABLE [dbo].[QRTZ_TRIGGERS]
GOCREATE TABLE [dbo].[QRTZ_CALENDARS] ([SCHED_NAME] [NVARCHAR] (100)  NOT NULL ,[CALENDAR_NAME] [NVARCHAR] (200)  NOT NULL ,[CALENDAR] [IMAGE] NOT NULL
)
GOCREATE TABLE [dbo].[QRTZ_CRON_TRIGGERS] ([SCHED_NAME] [NVARCHAR] (100)  NOT NULL ,[TRIGGER_NAME] [NVARCHAR] (150)  NOT NULL ,[TRIGGER_GROUP] [NVARCHAR] (150)  NOT NULL ,[CRON_EXPRESSION] [NVARCHAR] (120)  NOT NULL ,[TIME_ZONE_ID] [NVARCHAR] (80)
)
GOCREATE TABLE [dbo].[QRTZ_FIRED_TRIGGERS] ([SCHED_NAME] [NVARCHAR] (100)  NOT NULL ,[ENTRY_ID] [NVARCHAR] (95)  NOT NULL ,[TRIGGER_NAME] [NVARCHAR] (150)  NOT NULL ,[TRIGGER_GROUP] [NVARCHAR] (150)  NOT NULL ,[INSTANCE_NAME] [NVARCHAR] (200)  NOT NULL ,[FIRED_TIME] [BIGINT] NOT NULL ,[SCHED_TIME] [BIGINT] NOT NULL ,[PRIORITY] [INTEGER] NOT NULL ,[STATE] [NVARCHAR] (16)  NOT NULL,[JOB_NAME] [NVARCHAR] (150)  NULL ,[JOB_GROUP] [NVARCHAR] (150)  NULL ,[IS_NONCONCURRENT] BIT  NULL ,[REQUESTS_RECOVERY] BIT  NULL
)
GOCREATE TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] ([SCHED_NAME] [NVARCHAR] (100)  NOT NULL ,[TRIGGER_GROUP] [NVARCHAR] (150)  NOT NULL
)
GOCREATE TABLE [dbo].[QRTZ_SCHEDULER_STATE] ([SCHED_NAME] [NVARCHAR] (100)  NOT NULL ,[INSTANCE_NAME] [NVARCHAR] (200)  NOT NULL ,[LAST_CHECKIN_TIME] [BIGINT] NOT NULL ,[CHECKIN_INTERVAL] [BIGINT] NOT NULL
)
GOCREATE TABLE [dbo].[QRTZ_LOCKS] ([SCHED_NAME] [NVARCHAR] (100)  NOT NULL ,[LOCK_NAME] [NVARCHAR] (40)  NOT NULL
)
GOCREATE TABLE [dbo].[QRTZ_JOB_DETAILS] ([SCHED_NAME] [NVARCHAR] (100)  NOT NULL ,[JOB_NAME] [NVARCHAR] (150)  NOT NULL ,[JOB_GROUP] [NVARCHAR] (150)  NOT NULL ,[DESCRipTION] [NVARCHAR] (250) NULL ,[JOB_CLASS_NAME] [NVARCHAR] (250)  NOT NULL ,[IS_DURABLE] BIT  NOT NULL ,[IS_NONCONCURRENT] BIT  NOT NULL ,[IS_UPDATE_DATA] BIT  NOT NULL ,[REQUESTS_RECOVERY] BIT  NOT NULL ,[JOB_DATA] [IMAGE] NULL
)
GOCREATE TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] ([SCHED_NAME] [NVARCHAR] (100)  NOT NULL ,[TRIGGER_NAME] [NVARCHAR] (150)  NOT NULL ,[TRIGGER_GROUP] [NVARCHAR] (150)  NOT NULL ,[REPEAT_COUNT] [INTEGER] NOT NULL ,[REPEAT_INTERVAL] [BIGINT] NOT NULL ,[TIMES_TRIGGERED] [INTEGER] NOT NULL
)
GOCREATE TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ([SCHED_NAME] [NVARCHAR] (100)  NOT NULL ,[TRIGGER_NAME] [NVARCHAR] (150)  NOT NULL ,[TRIGGER_GROUP] [NVARCHAR] (150)  NOT NULL ,[STR_PROP_1] [NVARCHAR] (512) NULL,[STR_PROP_2] [NVARCHAR] (512) NULL,[STR_PROP_3] [NVARCHAR] (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 NULL,[BOOL_PROP_2] BIT NULL,
)
GOCREATE TABLE [dbo].[QRTZ_BLOB_TRIGGERS] ([SCHED_NAME] [NVARCHAR] (100)  NOT NULL ,[TRIGGER_NAME] [NVARCHAR] (150)  NOT NULL ,[TRIGGER_GROUP] [NVARCHAR] (150)  NOT NULL ,[BLOB_DATA] [IMAGE] NULL
)
GOCREATE TABLE [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME] [NVARCHAR] (100)  NOT NULL ,[TRIGGER_NAME] [NVARCHAR] (150)  NOT NULL ,[TRIGGER_GROUP] [NVARCHAR] (150)  NOT NULL ,[JOB_NAME] [NVARCHAR] (150)  NOT NULL ,[JOB_GROUP] [NVARCHAR] (150)  NOT NULL ,[DESCRIPTION] [NVARCHAR] (250) NULL ,[NEXT_FIRE_TIME] [BIGINT] NULL ,[PREV_FIRE_TIME] [BIGINT] NULL ,[PRIORITY] [INTEGER] NULL ,[TRIGGER_STATE] [NVARCHAR] (16)  NOT NULL ,[TRIGGER_TYPE] [NVARCHAR] (8)  NOT NULL ,[START_TIME] [BIGINT] NOT NULL ,[END_TIME] [BIGINT] NULL ,[CALENDAR_NAME] [NVARCHAR] (200)  NULL ,[MISFIRE_INSTR] [INTEGER] NULL ,[JOB_DATA] [IMAGE] NULL
)
GOALTER TABLE [dbo].[QRTZ_CALENDARS] WITH NOCHECK ADDCONSTRAINT [PK_QRTZ_CALENDARS] PRIMARY KEY  CLUSTERED([SCHED_NAME],[CALENDAR_NAME])
GOALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] WITH NOCHECK ADDCONSTRAINT [PK_QRTZ_CRON_TRIGGERS] PRIMARY KEY  CLUSTERED([SCHED_NAME],[TRIGGER_NAME],[TRIGGER_GROUP])
GOALTER TABLE [dbo].[QRTZ_FIRED_TRIGGERS] WITH NOCHECK ADDCONSTRAINT [PK_QRTZ_FIRED_TRIGGERS] PRIMARY KEY  CLUSTERED([SCHED_NAME],[ENTRY_ID])
GOALTER TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] WITH NOCHECK ADDCONSTRAINT [PK_QRTZ_PAUSED_TRIGGER_GRPS] PRIMARY KEY  CLUSTERED([SCHED_NAME],[TRIGGER_GROUP])
GOALTER TABLE [dbo].[QRTZ_SCHEDULER_STATE] WITH NOCHECK ADDCONSTRAINT [PK_QRTZ_SCHEDULER_STATE] PRIMARY KEY  CLUSTERED([SCHED_NAME],[INSTANCE_NAME])
GOALTER TABLE [dbo].[QRTZ_LOCKS] WITH NOCHECK ADDCONSTRAINT [PK_QRTZ_LOCKS] PRIMARY KEY  CLUSTERED([SCHED_NAME],[LOCK_NAME])
GOALTER TABLE [dbo].[QRTZ_JOB_DETAILS] WITH NOCHECK ADDCONSTRAINT [PK_QRTZ_JOB_DETAILS] PRIMARY KEY  CLUSTERED([SCHED_NAME],[JOB_NAME],[JOB_GROUP])
GOALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] WITH NOCHECK ADDCONSTRAINT [PK_QRTZ_SIMPLE_TRIGGERS] PRIMARY KEY  CLUSTERED([SCHED_NAME],[TRIGGER_NAME],[TRIGGER_GROUP])
GOALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] WITH NOCHECK ADDCONSTRAINT [PK_QRTZ_SIMPROP_TRIGGERS] PRIMARY KEY  CLUSTERED([SCHED_NAME],[TRIGGER_NAME],[TRIGGER_GROUP])
GOALTER TABLE [dbo].[QRTZ_TRIGGERS] WITH NOCHECK ADDCONSTRAINT [PK_QRTZ_TRIGGERS] PRIMARY KEY  CLUSTERED([SCHED_NAME],[TRIGGER_NAME],[TRIGGER_GROUP])
GOALTER TABLE [dbo].QRTZ_BLOB_TRIGGERS WITH NOCHECK ADDCONSTRAINT [PK_QRTZ_BLOB_TRIGGERS] PRIMARY KEY  CLUSTERED([SCHED_NAME],[TRIGGER_NAME],[TRIGGER_GROUP])
GOALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] ADDCONSTRAINT [FK_QRTZ_CRON_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY([SCHED_NAME],[TRIGGER_NAME],[TRIGGER_GROUP]) REFERENCES [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME],[TRIGGER_NAME],[TRIGGER_GROUP]) ON DELETE CASCADE
GOALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] ADDCONSTRAINT [FK_QRTZ_SIMPLE_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY([SCHED_NAME],[TRIGGER_NAME],[TRIGGER_GROUP]) REFERENCES [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME],[TRIGGER_NAME],[TRIGGER_GROUP]) ON DELETE CASCADE
GOALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ADDCONSTRAINT [FK_QRTZ_SIMPROP_TRIGGERS_QRTZ_TRIGGERS] FOREIGN KEY([SCHED_NAME],[TRIGGER_NAME],[TRIGGER_GROUP]) REFERENCES [dbo].[QRTZ_TRIGGERS] ([SCHED_NAME],[TRIGGER_NAME],[TRIGGER_GROUP]) ON DELETE CASCADE
GOALTER TABLE [dbo].[QRTZ_TRIGGERS] ADDCONSTRAINT [FK_QRTZ_TRIGGERS_QRTZ_JOB_DETAILS] FOREIGN KEY([SCHED_NAME],[JOB_NAME],[JOB_GROUP]) REFERENCES [dbo].[QRTZ_JOB_DETAILS] ([SCHED_NAME],[JOB_NAME],[JOB_GROUP])
GOCREATE 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)
GO

View Code

部分我们扩展开发常用到的表及字段说明

1、QRTZ_JOB_DETAILS:存储的是job的详细信息,包括:[DESCRIPTION]描述,[IS_DURABLE]是否持久化,[JOB_DATA]持久化对象等基本信息。

2、QRTZ_TRIGGERS:触发器信息,包含:job的名,组外键,[DESCRIPTION]触发器的描述等基本信息,还有[START_TIME]开始执行时间,[END_TIME]结束执行时间,[PREV_FIRE_TIME]上次执行时间,[NEXT_FIRE_TIME]下次执行时间,[TRIGGER_TYPE]触发器类型:simple和cron,[TRIGGER_STATE]执行状态:WAITING,PAUSED,ACQUIRED分别为:等待,暂停,运行中。

3、QRTZ_CRON_TRIGGERS:保存cron表达式。

4、QRTZ_SCHEDULER_STATE:存储集群中note实例信息,quartz会定时读取该表的信息判断集群中每个实例的当前状态,INSTANCE_NAME:之前配置文件中org.quartz.scheduler.instanceId配置的名字,就会写入该字段,如果设置为AUTO,quartz会根据物理机名和当前时间产生一个名字。  [LAST_CHECKIN_TIME]上次检查时间,[CHECKIN_INTERVAL]检查间隔时间。

5、QRTZ_PAUSED_TRIGGER_GRPS:暂停的任务组信息。

6、QRTZ_LOCKS,悲观锁发生的记录信息。

7、QRTZ_FIRED_TRIGGERS,正在运行的触发器信息。

8、QRTZ_SIMPLE_TRIGGERS,简单的出发器详细信息。

9、QRTZ_BLOB_TRIGGERS,触发器存为二进制大对象类型(用于Quartz用户自己触发数据库定制自己的触发器,然而JobStore不明白怎么存放实例的时候)。

.net程序配置quartz数据库参数

                //1.首先创建一个作业调度池var properties = new NameValueCollection();//存储类型properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";//表明前缀properties["quartz.jobStore.tablePrefix"] = "QRTZ_";//驱动类型properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz";                //数据源名称properties["quartz.jobStore.dataSource"] = "myDS";//连接字符串properties["quartz.dataSource.myDS.connectionString"] = Config.QuartzConnStr;//sqlserver版本properties["quartz.dataSource.myDS.provider"] = "SqlServer-20";//最大链接数//properties["quartz.dataSource.myDS.maxConnections"] = "5";// First we must get a reference to a schedulerISchedulerFactory sf = new StdSchedulerFactory(properties);IScheduler sched = sf.GetScheduler();

上面便是创建一个调度器,以及配置与quartz数据库的详细参数。有啦数据库后你会很兴奋,直接写t-sql操作数据库多么便捷啊,并且所有的任务调度信息都一目了然,这里我要告诉你的事,你不需要直接写sql语句,quart提供的类库就能自动对数据库进行填充,以完成对任务调度的管理操作。

quartz.net任务调度的各种操作方法

首先我要说下,我前面有一篇文章对quartz.net做个基本的操作描述,这里也只贴代码,仅供参考。

1、添加任务计划,并制定要触发的执行类

                    #region 检查是否存在if (IsExistJob(m.JobGroupName, m.JobName)){return false;}#endregion#region 添加任务计划if (m.StarTime == null){m.StarTime = DateTime.Now;}DateTimeOffset starRunTime = DateBuilder.NextGivenSecondDate(m.StarTime, 1);if (m.EndTime == null){m.EndTime = DateTime.MaxValue.AddDays(-1);}DateTimeOffset endRunTime = DateBuilder.NextGivenSecondDate(m.EndTime, 1);scheduler = GetScheduler();IJobDetail job = JobBuilder.Create<QuartzFunction>().WithIdentity(m.JobName, m.JobGroupName).WithDescription(m.JobDescribe).Build();ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create().StartAt(starRunTime).EndAt(endRunTime).WithIdentity(m.JobName, m.JobGroupName).WithCronSchedule(m.CronStr).WithDescription(m.JobDescribe).Build();scheduler.ScheduleJob(job, trigger);scheduler.Start();#endregion#region 关联运行接口var api = new A_RunJobTriggerEntity();api.ApiCode = m.ApiCode;api.ApiType = m.ApiType;api.ApiUrl = m.ApiUrl;api.AppID = m.AppID;api.CreateTime = DateTime.Now;api.JobDescribe = m.JobDescribe;api.ServiceCode = m.ServiceCode;api.Token = m.Token;api.TriggerGroup = m.JobGroupName;api.TriggerName = m.JobName;new ARunJobRelationManage().Insert(api);#endregion

2、移除执行计划

scheduler = GetScheduler();
var trigger = new TriggerKey(jobGroup, jobName);
scheduler.PauseTrigger(trigger);//停止触发器
scheduler.UnscheduleJob(trigger); //移除触发器
var result = scheduler.DeleteJob(JobKey.Create(jobName,jobGroup));

3、暂停指定任务计划

scheduler = GetScheduler();
scheduler.PauseJob(JobKey.Create(jobName, jobGroup));

4、暂停所有的任务计划

scheduler = GetScheduler();scheduler.PauseAll();

5、开启指定的任务计划

 scheduler = GetScheduler();if (!scheduler.IsStarted){scheduler.Start();}//scheduler.ResumeTrigger(new TriggerKey(jobName, jobGroup));              scheduler.ResumeJob(JobKey.Create(jobName, jobGroup));

6、开启所有的任务计划

scheduler = GetScheduler();
if (!scheduler.IsStarted)
{scheduler.Start();
}
//scheduler.ResumeTrigger(new TriggerKey(jobName, jobGroup));
scheduler.ResumeAll();

7、调度启动状态,如果调度的状态没有开启,即便触发器的状态为等待执行,执行中,也是无效的。

scheduler = GetScheduler();
if (scheduler.IsStarted)
{return "开启";
}
else
{return "关闭";
}

8、是否集群

//是否集群
//properties["quartz.jobStore.clustered"] = "false";
//properties["quartz.scheduler.instanceId"] = "AUTO";

检验下结果:

我在两台服务器上部署,设置一个任务计划,每2秒出发一次,2台机器同时跑,没有重复执行,且一台服务器down掉仍可准确无误的运行,给图。

转载于:https://www.cnblogs.com/lhxsoft/p/6601045.html

Quartz.net持久化与集群部署开发详解相关推荐

  1. Hadoop HA集群部署 - A - 详解

    理论简介:  HA 概念以及作用     HA(High Available), 高可用性群集,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点.通常把正在执行业务 ...

  2. 运维工程师必备之负载 均衡集群及LVS详解

    原文地址:运维工程师必备之负载 均衡集群及LVS详解作者:蚁巡运维平台 来源: chrinux 的BLOG 时间: 2013-07-01 14:00 此博文主要介绍集群和负载均衡的基本理论和类别,内容 ...

  3. 04_Flink-HA高可用、Standalone集群模式、Flink-Standalone集群重要参数详解、集群节点重启及扩容、启动组件、Flink on Yarn、启动命令等

    1.4.Flink集群安装部署standalone+yarn 1.4.1.Standalone集群模式 1.4.2.Flink-Standalone集群重要参数详解 1.4.3.集群节点重启及扩容 1 ...

  4. Windows下搭建Tomcat集群的配置详解

    < Windows下搭建Tomcat集群基础入门详解 > 前言 在搭建 < Apache + Tomcat 实现Web服务器集群 > 前我们还需要实现 Tomcat集群实现Se ...

  5. Linux 高可用(HA)集群之Pacemaker详解

    大纲 说明:本来我不想写这篇博文的,因为前几篇博文都有介绍pacemaker,但是我觉得还是得写一下,试想应该会有博友需要,特别是pacemaker 1.1.8(CentOS 6.4)以后,pacem ...

  6. redis cluster 集群 安装 配置 详解

    redis cluster 集群 安装 配置 详解 张映 发表于 2015-05-01 分类目录: nosql 标签:cluster, redis, 安装, 配置, 集群 Redis 集群是一个提供在 ...

  7. Kafka单机、集群模式安装详解(二)

    本文环境如下: 操作系统:CentOS 6 32位 JDK版本:1.8.0_77 32位 Kafka版本:0.9.0.1(Scala 2.11) 接上篇 Kafka单机.集群模式安装详解(一) 6. ...

  8. nc 模拟服务器_NC集群服务器使用详解

    NC 集群服务器使用详解 NC220 发版时,对中间件做了一项重大改进,对集群服务器应用提供了全面解决方案 的支持, 使产品更加能够适应集团企业的大规模应用. 本文力争以通俗的语言, 描述集群服 务器 ...

  9. [转]Hadoop集群_WordCount运行详解--MapReduce编程模型

    Hadoop集群_WordCount运行详解--MapReduce编程模型 下面这篇文章写得非常好,有利于初学mapreduce的入门 http://www.nosqldb.cn/1369099810 ...

最新文章

  1. Redis的一些“锁”事
  2. 探秘重编译(Recompilations)(1/2)
  3. py爬取英文文档学习单词
  4. 刷题一个4ms的程序,代码如何优化到3ms再到2ms?
  5. 中国增材制造市场投资前景与发展投资战略调研报告2022-2028年版
  6. NDK Socket编程:面向连接的通信(tcp)
  7. Renascence架构原理——最优化算法
  8. spring学习(38):注入set类型
  9. kettle 先删除后插入_Kettle:使用触发器和快照表进行增量数据同步
  10. 这是我见过最全面的Python装饰器详解 没有学不会这种说法
  11. 工具--常见eclipse配置导入web工程(tomcat容器)步骤
  12. oracle sequences优化_Oracle优化(恒生内部常规分享)
  13. Android中的动画详解系列【2】——飞舞的蝴蝶
  14. 三极管什么时候工作在饱和区
  15. Oracle 锁表问题查询处理
  16. 计算机考试反思1000,高一期中考试反思1000字,高一学生期中考试总结
  17. keil警告提示: last line of file ends without a newline
  18. 关于大三学生的请教回复
  19. 如何实现超大文件(60G)传输给别人?
  20. 培训python排行榜

热门文章

  1. P2831 愤怒的小鸟
  2. Qt5.8 在windows下mingw静态编译
  3. 代码实现把字符串反转
  4. setAdapter(adapter)空指针nullPointer 解决办法
  5. 转 mvc项目中,解决引用jquery文件后智能提示失效的办法
  6. 一条python语句实现BGR图像转RGB图像
  7. 利用OpenCV的compareHist函数作直方图的相似度对比的源程序
  8. linux内核网络协议栈--发送流程及函数(十)
  9. php7.2 开启mcy扩展,phper必知必会(二)
  10. 为什么重写equals一定要重写hashCode方法?