Quartz.net持久化与集群部署开发详解
支持集群高可用的開發(fā)方案
Quartz.net的數(shù)據(jù)庫表結(jié)構(gòu)
如果支持集群與持久化,單靠本機(jī)的內(nèi)存和xml來保存計算任務(wù)調(diào)度的各種狀態(tài)值,可想而知,是困難的。所以支持?jǐn)?shù)據(jù)庫這樣的解決方案,OpenSymphony組織怎么可能會給遺漏。
官方提供的各種數(shù)據(jù)庫腳本:https://github.com/quartznet/quartznet/tree/master/database/tables
下面我給大家展示下quartz任務(wù)調(diào)度的MS SQLSERVER表結(jié)構(gòu)
創(chuàng)建表結(jié)構(gòu)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部分我們擴(kuò)展開發(fā)常用到的表及字段說明
1、QRTZ_JOB_DETAILS:存儲的是job的詳細(xì)信息,包括:[DESCRIPTION]描述,[IS_DURABLE]是否持久化,[JOB_DATA]持久化對象等基本信息。
2、QRTZ_TRIGGERS:觸發(fā)器信息,包含:job的名,組外鍵,[DESCRIPTION]觸發(fā)器的描述等基本信息,還有[START_TIME]開始執(zhí)行時間,[END_TIME]結(jié)束執(zhí)行時間,[PREV_FIRE_TIME]上次執(zhí)行時間,[NEXT_FIRE_TIME]下次執(zhí)行時間,[TRIGGER_TYPE]觸發(fā)器類型:simple和cron,[TRIGGER_STATE]執(zhí)行狀態(tài):WAITING,PAUSED,ACQUIRED分別為:等待,暫停,運(yùn)行中。
3、QRTZ_CRON_TRIGGERS:保存cron表達(dá)式。
4、QRTZ_SCHEDULER_STATE:存儲集群中note實(shí)例信息,quartz會定時讀取該表的信息判斷集群中每個實(shí)例的當(dāng)前狀態(tài),INSTANCE_NAME:之前配置文件中org.quartz.scheduler.instanceId配置的名字,就會寫入該字段,如果設(shè)置為AUTO,quartz會根據(jù)物理機(jī)名和當(dāng)前時間產(chǎn)生一個名字。??[LAST_CHECKIN_TIME]上次檢查時間,[CHECKIN_INTERVAL]檢查間隔時間。
5、QRTZ_PAUSED_TRIGGER_GRPS:暫停的任務(wù)組信息。
6、QRTZ_LOCKS,悲觀鎖發(fā)生的記錄信息。
7、QRTZ_FIRED_TRIGGERS,正在運(yùn)行的觸發(fā)器信息。
8、QRTZ_SIMPLE_TRIGGERS,簡單的出發(fā)器詳細(xì)信息。
9、QRTZ_BLOB_TRIGGERS,觸發(fā)器存為二進(jìn)制大對象類型(用于Quartz用戶自己觸發(fā)數(shù)據(jù)庫定制自己的觸發(fā)器,然而JobStore不明白怎么存放實(shí)例的時候)。
.net程序配置quartz數(shù)據(jù)庫參數(shù)
//1.首先創(chuàng)建一個作業(yè)調(diào)度池var properties = new NameValueCollection();//存儲類型properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";//表明前綴properties["quartz.jobStore.tablePrefix"] = "QRTZ_";//驅(qū)動類型properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz"; //數(shù)據(jù)源名稱properties["quartz.jobStore.dataSource"] = "myDS";//連接字符串properties["quartz.dataSource.myDS.connectionString"] = Config.QuartzConnStr;//sqlserver版本properties["quartz.dataSource.myDS.provider"] = "SqlServer-20";//最大鏈接數(shù)//properties["quartz.dataSource.myDS.maxConnections"] = "5";// First we must get a reference to a schedulerISchedulerFactory sf = new StdSchedulerFactory(properties);IScheduler sched = sf.GetScheduler();上面便是創(chuàng)建一個調(diào)度器,以及配置與quartz數(shù)據(jù)庫的詳細(xì)參數(shù)。有啦數(shù)據(jù)庫后你會很興奮,直接寫t-sql操作數(shù)據(jù)庫多么便捷啊,并且所有的任務(wù)調(diào)度信息都一目了然,這里我要告訴你的事,你不需要直接寫sql語句,quart提供的類庫就能自動對數(shù)據(jù)庫進(jìn)行填充,以完成對任務(wù)調(diào)度的管理操作。
quartz.net任務(wù)調(diào)度的各種操作方法
首先我要說下,我前面有一篇文章對quartz.net做個基本的操作描述,這里也只貼代碼,僅供參考。
1、添加任務(wù)計劃,并制定要觸發(fā)的執(zhí)行類
#region 檢查是否存在if (IsExistJob(m.JobGroupName, m.JobName)){return false;}#endregion#region 添加任務(wù)計劃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 關(guān)聯(lián)運(yùn)行接口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);#endregion2、移除執(zhí)行計劃
scheduler = GetScheduler(); var trigger = new TriggerKey(jobGroup, jobName); scheduler.PauseTrigger(trigger);//停止觸發(fā)器 scheduler.UnscheduleJob(trigger); //移除觸發(fā)器 var result = scheduler.DeleteJob(JobKey.Create(jobName,jobGroup));3、暫停指定任務(wù)計劃
scheduler = GetScheduler(); scheduler.PauseJob(JobKey.Create(jobName, jobGroup));4、暫停所有的任務(wù)計劃
scheduler = GetScheduler();scheduler.PauseAll();
5、開啟指定的任務(wù)計劃
scheduler = GetScheduler();if (!scheduler.IsStarted){scheduler.Start();}//scheduler.ResumeTrigger(new TriggerKey(jobName, jobGroup)); scheduler.ResumeJob(JobKey.Create(jobName, jobGroup));6、開啟所有的任務(wù)計劃
scheduler = GetScheduler(); if (!scheduler.IsStarted) {scheduler.Start(); } //scheduler.ResumeTrigger(new TriggerKey(jobName, jobGroup)); scheduler.ResumeAll();7、調(diào)度啟動狀態(tài),如果調(diào)度的狀態(tài)沒有開啟,即便觸發(fā)器的狀態(tài)為等待執(zhí)行,執(zhí)行中,也是無效的。
scheduler = GetScheduler(); if (scheduler.IsStarted) {return "開啟"; } else {return "關(guān)閉"; }8、是否集群?
//是否集群 //properties["quartz.jobStore.clustered"] = "false"; //properties["quartz.scheduler.instanceId"] = "AUTO";檢驗下結(jié)果:
我在兩臺服務(wù)器上部署,設(shè)置一個任務(wù)計劃,每2秒出發(fā)一次,2臺機(jī)器同時跑,沒有重復(fù)執(zhí)行,且一臺服務(wù)器down掉仍可準(zhǔn)確無誤的運(yùn)行,給圖。
?
轉(zhuǎn)載于:https://www.cnblogs.com/lhxsoft/p/6601045.html
總結(jié)
以上是生活随笔為你收集整理的Quartz.net持久化与集群部署开发详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jquery 悬浮验证框架 jQuery
- 下一篇: 非常有用的css使用总结