This post is one of those back to basics posts and is inspired by a comment left by Jan on one of the Getting Started posts. Today we’ll take a look at how to schedule a job programmatically in Quartz.Net 1.0. I’ll follow up with a post on how to schedule a job programmatically in Quartz.Net 2.0 as well.
Scheduling Jobs in Quartz.Net
There are two ways you can schedule a job to run on Quartz.Net. The first way is to schedule it using the plugin that reads an xml file containing the job and scheduling information. If you want more information on how to schedule jobs using the xml plugin, take a look at this post.You can also schedule jobs by interacting directly with the scheduler API. The Quartz.Net scheduler supports remote access via the .Net remoting facility, so this method of scheduling jobs is available to you regardless of whether the scheduler is running as a standalone windows service or whether it is embedded in your application. The remote scheduler does have some limitations, but we will not run into them while scheduling jobs. Let’s take a look at how we can schedule jobs using the scheduler API.
Scheduling Jobs via the Scheduler API
In a nutshell, these are the steps you would follow to schedule a job using the API:- Get a reference to the scheduler object. How you do this will depend on whether you are running a standalone or embedded scheduler.
- Create a JobDetail object and set all the necessary properties. At a minimum you must set the Name, the Group and JobType. Please note that because the type of JobType is Type, the dll containing the JobType MUST be available to the code that is scheduling the job AS WELL as to the scheduler.
- Create a Trigger object (Trigger itself is an abstract class, so you will actually be creating one of these concrete types: SimpleTrigger, CronTrigger or NthIncludedDayTrigger) and set all the necessary properties. At a minimum you must set the Name, and the Group. The JobGroup and the JobName are also necessary as they are what links the JobDetail you created in the previous step with the Trigger you are creating now. However, you do not need to set these properties right now. Read on to step 4 to understand why.
- Call the ScheduleJob method on your scheduler object passing in your Trigger and your Job. If you call this overload of the ScheduleJob method, then the scheduler will link your trigger and your job, so there is no need for you to set the link explicitly.
Code Example
I’d like to close out this post with a code sample that implements the steps outlined above.public void ScheduleOneTimeJob(Type jobType, JobDataMap dataMap){string name = DateTime.Now.ToString("yyyyMMddHHmmss"));string group = "OneTimeJobs";// create job
JobDetail jobDetail = new JobDetail(name, group, jobType);
jobDetail.Description = "One time job.";
jobDetail.JobDataMap = dataMap;// create trigger
SimpleTrigger trigger = new SimpleTrigger();
trigger.Name = name;trigger.Group = group;trigger.StartTimeUtc = DateTime.UtcNow;trigger.RepeatCount = 0;trigger.RepeatInterval = TimeSpan.Zero;// get reference to scheduler (remote or local) and schedule job
GetScheduler().ScheduleJob(jobDetail, trigger);}
This sample code demonstrates one way of creating and scheduling a job that runs once, immediately.
In Quartz.Net 2.0 the scheduler API has changed significantly, so we will cover that topic in another post.
2 comments:
Do you have any examples of the jobs files under 2.0
My jobs file isn't working
true
PrivateDataUploadTimelinessJob
PerformanceTimeliness
Sample job for Quartz Server
Isis.Jobs.DataTimeliness.PerformanceTimeliness.PrivateDataUploadTimelinessJob, Isis.Jobs
true
false
timelinessTrigger
PerformanceTimeliness
Simple trigger to simply fire sample job
PrivateDataUploadTimelinessJob
PerformanceTimeliness
SmartPolicy
0 0/1 * * * ?
ExposureEntryValidationJob
DataValidation
Sample job for Quartz Server
Isis.Jobs.DataValidation.ExposureValidation.ExposureEntryAcceptableVarianceJob, Isis.Jobs
true
false
exposureTrigger
DataValidation
Simple trigger to simply fire sample job
ExposureEntryValidationJob
DataValidation
SmartPolicy
0 0/1 * * * ?
Throwing the following error:
rror scheduling jobs: The element 'job' in namespace 'http://quartznet.sourceforge.net/JobSchedulingData' has invalid child element 'job-detail' in namespace 'http://quartznet.sourceforge.net/JobSchedulingData'. List of possible elements expected: 'name' in namespace 'http://quartznet.sourceforge.net/JobSchedulingData'.
The element 'job' in namespace 'http://quartznet.sourceforge.net/JobSchedulingData' has invalid child element 'job-detail' in namespace 'http://quartznet.sourceforge.net/JobSchedulingData'. List of possible elements expected: 'name' in namespace 'http://quartznet.sourceforge.net/JobSchedulingData'.
I'm writing a post describing the new file format, but meanwhile take a look at this file: https://github.com/lahma/quartznet/blob/master/server/Quartz.Server/quartz_jobs.xml.
Post a Comment