+ All Categories
Home > Documents > Asynchronous Job Processing Using Quartz.Net Jay Vilalta [email protected].

Asynchronous Job Processing Using Quartz.Net Jay Vilalta [email protected].

Date post: 16-Dec-2015
Category:
Upload: jamir-snow
View: 218 times
Download: 0 times
Share this document with a friend
Popular Tags:
30
Asynchronous Job Processing Using Quartz.Net Jay Vilalta [email protected]
Transcript
Page 1: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Asynchronous Job ProcessingUsing Quartz.Net

Jay [email protected]

Page 2: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

What Is Quartz.Net

• Scheduler (think task scheduler)• Queue for asynchronous jobs• C# port of Quartz (java)• Apache license

Page 3: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Why Use Quartz.Net

• Scale out• Redundancy• Smart handling of failures• Job chaining (poor man’s workflow)• Custom scheduling

Page 4: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

How Can I Run It

• Embedded in your application• As a stand alone windows service

Page 5: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

The Basics

• Scheduler• Jobs• Triggers

Page 6: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Scheduler

• Runs jobs• Manages the scheduling

Page 7: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Jobs

• Do the work• Some built-in• Mostly roll you own• Implement IJob

Page 8: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Built-in Jobs

• FileScanJob: monitors last modified date• NativeJob: runs executables or batch files• NoOpJob: does nothing• SendMailJob: sends emails

Page 9: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Jobs - Examplepublic class MyJob : IJob { public void Execute(JobExecutionContext context) { try { int count= context.MergedJobDataMap.GetIntegerFromString(“count"); for (int i = 0; i < count; i++) { //do something useful } } catch (ApplicationException ex) { throw new JobExecutionException("Something happened", ex, false); } }}

Page 10: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Triggers

• Tell the scheduler when jobs should run• Some built-in– Simple Trigger– Cron Trigger– NthIncludedDayTrigger

• Custom Triggers

Page 11: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Simple Trigger

• Start Time• Repeat Count• Repeat Interval

Page 12: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Cron Trigger

• Similar to UNIX cron• Start Time• Cron Expression– “0 15 10 ? * *”– “0 0,15,30,45 * ? * *”

Page 13: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Custom Triggers

• No example this time• Implementing a trigger is not trivial• Must implement 11 methods• Must be able to determine next fire time

Page 14: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Scheduling

• Associate a job to a trigger• Multiple triggers can be set• When the trigger fires, the job runs

scheduler.ScheduleJob(jobDetail, trigger);

Page 15: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Advanced Features

• Listeners• Special Jobs• Remote management• Clustering• Plug-ins• Unit testing

Page 16: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Listeners

• Job Listeners• Trigger Listeners• Scheduler Listeners• Job and trigger listeners can be global

Page 17: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Job Listener Example

public class JobHistoryListener : IJobListener{

public void JobExecutionVetoed(…)public void JobToBeExecuted(…)public void JobWasExecuted(…)

}

Page 18: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Trigger Listener Example

public class MyTriggerListener:ITriggerListener{ public string Name public void TriggerComplete(…) public void TriggerFired(…) public void TriggerMisfired(…) public bool VetoJobExecution(…)}

Page 19: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Special Jobs

• Stateful Jobs• Interruptible Jobs

Page 20: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Stateful Jobs

• Only one can run at a time• Allow you to save/restore state• You must manage state yourself• Implement IStatefulJob

Page 21: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Interruptible Jobs

• Mechanism to interrupt long running jobs• You must implement yourself• Implement IInterruptableJob

Page 22: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Remote Management

• Scheduler can be managed remotely• Exposed via Remoting• Most scheduler functions available

Page 23: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

JobFactory

• Instantiates jobs• Default factory creates a new instance• Create your own if you use DI or IoC container

Page 24: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Job Stores

• RAMJobStore• AdoJobStore– MySql– Oracle– Postgres– SQL Lite– SQL Server

Page 25: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Clustering

• Load balancing• Job Failover• Caveat: clocks synchronized within a second

Page 26: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Plug-ins

• JobInitializationPlugin• LoggingJobHistoryPlugin• LoggingTriggerHistoryPlugin• ShutdownHookPlugin

Page 27: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Plug-ins Stub

public class SamplePlugin : ISchedulerPlugin { public void Initialize(string name, IScheduler sched) public void Shutdown() public void Start() }

Page 28: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Unit Testing

• You can / should unit test your quartz classes• Use a mocking framework• Mock the Scheduler (IScheduler)• Mock a calendar (ICalendar)• Use mocks to create your context

Page 29: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Sample Unit Test[Test] public void ExecuteTests() { JobDetail detail = new JobDetail(); IScheduler scheduler = new Mock<IScheduler>().Object; ICalendar calendar = new Mock<ICalendar>().Object; IJob job = new NoOpJob(); detail.Name = "Test"; detail.JobDataMap.Add("SOMETHING", "ELSE"); TriggerFiredBundle bundle =

new TriggerFiredBundle(detail, new SimpleTrigger(), calendar, false, null, null, null, null); JobExecutionContext context = new JobExecutionContext(scheduler, bundle, job); JobHistoryListener listener = new JobHistoryListener(); listener.JobToBeExecuted(context); listener.JobWasExecuted(context, null); //methods return void so need to get creative to determine if execution was successful } }

Page 30: Asynchronous Job Processing Using Quartz.Net Jay Vilalta jay.vilalta@gmail.com.

Resources

Project Home: http://quartznet.sourceforge.net/

Mailing List:http://groups.google.com/group/quartznet

Getting Started:http://jvilalta.blogspot.com


Recommended