Presentation is loading. Please wait.

Presentation is loading. Please wait.

Asynchronous Job Processing Using Quartz.Net Jay Vilalta

Similar presentations

Presentation on theme: "Asynchronous Job Processing Using Quartz.Net Jay Vilalta"— Presentation transcript:

1 Asynchronous Job Processing Using Quartz.Net Jay Vilalta

2 What Is Quartz.Net Scheduler (think task scheduler) Queue for asynchronous jobs C# port of Quartz (java) Apache license

3 Why Use Quartz.Net Scale out Redundancy Smart handling of failures Job chaining (poor man’s workflow) Custom scheduling

4 How Can I Run It Embedded in your application As a stand alone windows service

5 The Basics Scheduler Jobs Triggers

6 Scheduler Runs jobs Manages the scheduling

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

8 Built-in Jobs FileScanJob: monitors last modified date NativeJob: runs executables or batch files NoOpJob: does nothing SendMailJob: sends emails

9 Jobs - Example public 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); }

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

11 Simple Trigger Start Time Repeat Count Repeat Interval

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

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

14 Scheduling Associate a job to a trigger Multiple triggers can be set When the trigger fires, the job runs scheduler.ScheduleJob(jobDetail, trigger);

15 Advanced Features Listeners Special Jobs Remote management Clustering Plug-ins Unit testing

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

17 Job Listener Example public class JobHistoryListener : IJobListener { public void JobExecutionVetoed(…) public void JobToBeExecuted(…) public void JobWasExecuted(…) }

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

19 Special Jobs Stateful Jobs Interruptible Jobs

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

21 Interruptible Jobs Mechanism to interrupt long running jobs You must implement yourself Implement IInterruptableJob

22 Remote Management Scheduler can be managed remotely Exposed via Remoting Most scheduler functions available

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

24 Job Stores RAMJobStore AdoJobStore – MySql – Oracle – Postgres – SQL Lite – SQL Server

25 Clustering Load balancing Job Failover Caveat: clocks synchronized within a second

26 Plug-ins JobInitializationPlugin LoggingJobHistoryPlugin LoggingTriggerHistoryPlugin ShutdownHookPlugin

27 Plug-ins Stub public class SamplePlugin : ISchedulerPlugin { public void Initialize(string name, IScheduler sched) public void Shutdown() public void Start() }

28 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

29 Sample Unit Test [Test] public void ExecuteTests() { JobDetail detail = new JobDetail(); IScheduler scheduler = new Mock ().Object; ICalendar calendar = new Mock ().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 }

30 Resources Project Home: Mailing List: Getting Started:

Download ppt "Asynchronous Job Processing Using Quartz.Net Jay Vilalta"

Similar presentations

Ads by Google