分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

【转】Quartz.net持久化与集群部署开发详解

发布时间:2023-09-06 01:39责任编辑:顾先生关键词:暂无标签

转自:http://www.cnblogs.com/knowledgesea/p/5145239.html

序言

我前边有几篇文章有介绍过quartz的基本使用语法与类库。但是他的执行计划都是被写在本地的xml文件中。无法做集群部署,我让它看起来脆弱不堪,那是我的罪过。

但是quart.net是经过许多大项目的锤炼,走到啦今天,支持集群高可用的开发方案那是一定的,今天我就给小结下我的quartz.net开发升级过程。

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_DETAILSGOIF 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_TRIGGERSGOIF 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_TRIGGERSGOIF 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_TRIGGERSGOIF ?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]GOIF ?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_TRIGGERSGOIF 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 ADD ?CONSTRAINT [PK_QRTZ_CALENDARS] PRIMARY KEY ?CLUSTERED ?( ???[SCHED_NAME], ???[CALENDAR_NAME] ?) GOALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] WITH NOCHECK ADD ?CONSTRAINT [PK_QRTZ_CRON_TRIGGERS] PRIMARY KEY ?CLUSTERED ?( ???[SCHED_NAME], ???[TRIGGER_NAME], ???[TRIGGER_GROUP] ?) GOALTER TABLE [dbo].[QRTZ_FIRED_TRIGGERS] WITH NOCHECK ADD ?CONSTRAINT [PK_QRTZ_FIRED_TRIGGERS] PRIMARY KEY ?CLUSTERED ?( ???[SCHED_NAME], ???[ENTRY_ID] ?) GOALTER TABLE [dbo].[QRTZ_PAUSED_TRIGGER_GRPS] WITH NOCHECK ADD ?CONSTRAINT [PK_QRTZ_PAUSED_TRIGGER_GRPS] PRIMARY KEY ?CLUSTERED ?( ???[SCHED_NAME], ???[TRIGGER_GROUP] ?) GOALTER TABLE [dbo].[QRTZ_SCHEDULER_STATE] WITH NOCHECK ADD ?CONSTRAINT [PK_QRTZ_SCHEDULER_STATE] PRIMARY KEY ?CLUSTERED ?( ???[SCHED_NAME], ???[INSTANCE_NAME] ?) GOALTER TABLE [dbo].[QRTZ_LOCKS] WITH NOCHECK ADD ?CONSTRAINT [PK_QRTZ_LOCKS] PRIMARY KEY ?CLUSTERED ?( ???[SCHED_NAME], ???[LOCK_NAME] ?) GOALTER TABLE [dbo].[QRTZ_JOB_DETAILS] WITH NOCHECK ADD ?CONSTRAINT [PK_QRTZ_JOB_DETAILS] PRIMARY KEY ?CLUSTERED ?( ???[SCHED_NAME], ???[JOB_NAME], ???[JOB_GROUP] ?) GOALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] WITH NOCHECK ADD ?CONSTRAINT [PK_QRTZ_SIMPLE_TRIGGERS] PRIMARY KEY ?CLUSTERED ?( ???[SCHED_NAME], ???[TRIGGER_NAME], ???[TRIGGER_GROUP] ?) GOALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] WITH NOCHECK ADD ?CONSTRAINT [PK_QRTZ_SIMPROP_TRIGGERS] PRIMARY KEY ?CLUSTERED ?( ???[SCHED_NAME], ???[TRIGGER_NAME], ???[TRIGGER_GROUP] ?) GOALTER TABLE [dbo].[QRTZ_TRIGGERS] WITH NOCHECK ADD ?CONSTRAINT [PK_QRTZ_TRIGGERS] PRIMARY KEY ?CLUSTERED ?( ???[SCHED_NAME], ???[TRIGGER_NAME], ???[TRIGGER_GROUP] ?) GOALTER TABLE [dbo].QRTZ_BLOB_TRIGGERS WITH NOCHECK ADD ?CONSTRAINT [PK_QRTZ_BLOB_TRIGGERS] PRIMARY KEY ?CLUSTERED ?( ???[SCHED_NAME], ???[TRIGGER_NAME], ???[TRIGGER_GROUP] ?) GOALTER TABLE [dbo].[QRTZ_CRON_TRIGGERS] ADD ?CONSTRAINT [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 CASCADEGOALTER TABLE [dbo].[QRTZ_SIMPLE_TRIGGERS] ADD ?CONSTRAINT [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 CASCADEGOALTER TABLE [dbo].[QRTZ_SIMPROP_TRIGGERS] ADD ?CONSTRAINT [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 CASCADEGOALTER TABLE [dbo].[QRTZ_TRIGGERS] ADD ?CONSTRAINT [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 scheduler ???????????????ISchedulerFactory 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掉仍可准确无误的运行,给图。

总结

如果你在用quartz.net中有什么疑惑,或者有什么好的项目分享,欢迎加入右上角的群,我们一起学习进步。

【转】Quartz.net持久化与集群部署开发详解

原文地址:https://www.cnblogs.com/-sylar/p/8367642.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved