Quartz.NET--AdoJobStore作业存储

来源:互联网 发布:淘宝买蔬菜种子 编辑:程序博客网 时间:2024/06/01 09:13

Quartz提供两种基本作业存储类型。第一种类型叫做RAMJobStore,它利用通常的内存来持久化调度程序信息。这种作业存储类型最容易配置、构造和运行。Quartz.net缺省使用的就是RAMJobStore。对许多应用来说,这种作业存储已经足够了。

然而,因为调度程序信息是存储在被分配在内存里面,所以,当应用程序停止运行时,所有调度信息将被丢失。如果你需要在重新启动之间持久化调度信息,则将需要第二种类型的作业存储。为了修正这个问题,Quartz.NET 提供了 AdoJobStore。顾名思义,作业仓库通过 ADO.NET把所有数据放在数据库中。数据持久性的代价就是性能降低和复杂性的提高。它将所有的数据通过ADO.NET保存到数据库可中。它的配置要比RAMJobStore稍微复杂,同时速度也没有那么快。但是性能的缺陷不是非常差,尤其是如果你在数据库表的主键上建立索引。

AdoJobStore几乎可以在任何数据库上工作,它广泛地使用Oracle, MySQL, MS SQLServer2000, HSQLDB, PostreSQL以及 DB2。要使用AdoJobStore,首先必须创建一套Quartz使用的数据库表,可以在Quartzdatabase\tables找到创建库表的SQL脚本。如果没有找到你的数据库类型的脚本,那么找到一个已有的,修改成为你数据库所需要的。需要注意的一件事情就是所有Quartz库表名都以QRTZ_作为前缀(例如:表"QRTZ_TRIGGERS","QRTZ_JOB_DETAIL")。实际上,可以你可以将前缀设置为任何你想要的前缀,只要你告诉AdoJobStore那个前缀是什么即可(在你的Quartz属性文件中配置)。对于一个数据库中使用多个scheduler实例,那么配置不同的前缀可以创建多套库表,十分有用。

SQL Server代码连接如下所示:

            //AdoJobStoreRunner            NameValueCollection properties = new NameValueCollection();            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.driverDelegateType"] = "Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz";            properties["quartz.jobStore.useProperties"] = "false";            properties["quartz.jobStore.dataSource"] = "default";            properties["quartz.jobStore.tablePrefix"] = "QRTZ_";            properties["quartz.jobStore.clustered"] = "true";            // if running MS SQL Server we need this            properties["quartz.jobStore.selectWithLockSQL"] = "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = @lockName";            properties["quartz.dataSource.default.connectionString"] = "server=local;database=quartz;user id=sa;pwd=sa;pooling=false;";            properties["quartz.dataSource.default.provider"] = "SqlServer-20";


            ISchedulerFactory sf = new StdSchedulerFactory(properties);            IScheduler sched = sf.GetScheduler();            string schedId = sched.SchedulerInstanceId;            int count = 1;            for (int i = 0; i < 10; i++)            {                //作业                 IJobDetail job = JobBuilder                        .Create<Job1>()                        .WithIdentity("计算作业" + i.ToString(), "组1")                        .RequestRecovery() // ask scheduler to re-execute this job if it was in progress when the scheduler went down...                        .Build();                DateTimeOffset runTime = DateBuilder.EvenMinuteDate(DateTimeOffset.UtcNow);                ITrigger trigger = TriggerBuilder.Create()                    .WithIdentity("trigger" + i.ToString(), "group1")                    .StartAt(runTime)                    .Build();                //关联任务和触发器                 sched.ScheduleJob(job, trigger);                        }            //开始任务             sched.Start();

<configuration>  <configSections>    <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />  </configSections>  <quartz>    <add key="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler" />    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />    <add key="quartz.threadPool.threadCount" value="10" />    <add key="quartz.threadPool.threadPriority" value="2" />    <add key="quartz.jobStore.misfireThreshold" value="60000" />    <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />  </quartz></configuration>



原创粉丝点击