Quartz.NET 2.0 has finally been released. Quartz.NET 2.0 introduces a new more interfaced based model of operating with the API, lots of performance improvements and bug fixes to issues found in 1.0.x line.
BREAKING CHANGES
.NET 1.1 and 2.0 support is dropped
Quartz.NET now needs .NET version 3.5 SP1 or later to run due to use of new language features and classes
Many public interface methods have changed from returning arrays to generic IList or ISet interfaces
TriggerBuilder implementations and JobBuilder should now be used to create different job and trigger definitions
Introduced IJobDetail, IContrigger, ISimpleTrigger, ICalendarIntervalTrigger have far less members and especially mutators
When C5 collections were introduced as set-based implementation provider, ISet and ISortedSet interfaces were narrowed (IList inheritance removed)
string triggerName, string triggerGroup are now encapsulated in TriggerKey (has the same fields)
string jobName, string jobGroup are now encapsulated in JobKey (has the same fields)
JobInitializationPlugin is now deprecated in favor of XMLSchedulingDataProcessorPlugin, JobInitializationPlugin no longer included
Microsoft's Oracle drivers are no longer supported, use 10g or 11g ODP.NET drivers
Database schema has changed, you need to convert your 1.x schema to new version, sample migration script available in database folder
OTHER NOTABLE CHANGES
XMLSchedulingDataProcessorPlugin uses new XML format that allows more control over triggers but no support for calendars
There are extension methods for the new trigger builder that allow you to set trigger specifics
Client Profile is now supported and there are now separate DLLs for client profile
PropertySettingJobFactory is now the default JobFactory
To welcome year 2013 we are releasing new and improved version of Quart.NET!
+This release contains important bug fixes, new functionality and minor breaking changes.
C5 depedency is now internalized and allows you to use whatever version you want outside of Quartz.
Custom IJobFactory implementations now need to implement new method void ReturnJob(IJob job) for container managed cleanup.
NthIncludedDayTrigger was removed as it was accidentally left behind even though being legacy and replaced by DailyTimeIntervalTrigger.
NEW FEATURES
TimeZone support for calendars / Andrew Smith
Allow scheduling relative to replaced trigger with XML configuration
Add method to IJobFactory to destroy a job instance created by the factory breaking / minor breaking, added new required method
Internalize C5 dependency
Support for Oracle ODP 11.2 Release 4
Upgrade SQLite dependency to version 1.0.83
Upgrade to Common.Logging 2.1.2
FIXES
Scheduled Shutdown blocked even if waitForJobsToComplete is false
DailyTimeIntervalTriggerImpl should be serializable
InstanceID = "AUTO" may cause "String or binary data would be truncated" error on qrtz_fired_triggers.entry_id
PlugInExample doesn't execute any jobs
Recovering triggers have empty/incorrect JobDataMap
Make Quartz.NET work under medium trust when running .NET 3.5
tables_oracle.sql uses deprecated VARCHAR type
Improve error reporting for database connection failure
Scheduler Shutdown Freezes when There are Jobs Still Running
Use System.Version instead of FileVersionInfo to retive current Quartz version
DailyTimeIntervalTriggerImpl Validate broken
BREAKING CHANGES
Remove NthIncludedDayTrigger that was supposed to be removed in 2.0
Remove Visual Studio 2008 solutions and projects
Add support for DateTimeOffset and TimeSpan to JobDataMap / minor breaking - cleanup of API
Special thanks to Andrew Smith for working hard on TimeZone support. Credits go also to our vibrant community actively helping on mailing list and reporting issues and creating pull requests.
This release contains important bug fixes, new functionality and minor breaking changes.
UPGRADING
Please examine and run the database\schema_20_to_22_upgrade.sql script if you are using AdoJobStore
+this script adds a new column SCHED_TIME to table QRTZ_FIRED_TRIGGERS
+file contains the alter command for SQL Server and other database samples in comments
BREAKING CHANGES
database schema needs upgrade
add SchedulerStarting() method to ISchedulerListener interface
make the scheduler's TypeLoadHelper available to plugins when they are initialized
dbFailureRetryInterval parameter was removed from DirectSchedulerFactory APIs
NEW FEATURES
ability to override worker thread names (when using SimpleThreadPool)
add new IScheduler method: ScheduleJob(IJobDetail job, ISet trigger) to schedule multiple triggers for a job all at once
allow 'triggerless' initial storing of non-durable jobs.
improvements for job recovery information
package job_scheduling_data_2_0.xsd to nuget package's content folder
allow scheduler exported with remoting to be used from local machine only
support for Oracle managed ODP driver
FIXES
job ending with exception and trigger not going to fire again, trigger is incorrectly not removed from job store
XML schema supports multiple schedule elements but processor does not
DailyTimeIntervalTriggerPersistenceDelegate does not handle empty time interval properly
The whole website has moved to using GitHub pages. It should be now easier to contribute to documentation, the tutorial for version 2.x is currently in the works so stay tuned. You can fork and create pull requests from the gh-pages branch of the repository(opens new window).
There still might be some small glitches with links and content.
+
+
+
diff --git a/2014/01/07/tutorial-updated-with-2-x-api-changes/index.html b/2014/01/07/tutorial-updated-with-2-x-api-changes/index.html
new file mode 100644
index 000000000..3122e1b3a
--- /dev/null
+++ b/2014/01/07/tutorial-updated-with-2-x-api-changes/index.html
@@ -0,0 +1,56 @@
+
+
+
+
+
+ The tutorial has been updated to include 2.x API changes | Quartz.NET
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
With the latest switch to GitHub Pages it's been a joy to create content. There tutorial has now been split
+to two separate tutorials for Quartz.NET 1.x and 2.x respectively.
This is a minor release fixing couple of minor bugs.
FIXES
long properties incorrectly read as int in SimplePropertiesTriggerPersistenceDelegateSupport
RecoveringTriggerKey in JobExecutionContext has group and name wrong way around
Make SQL Server table create script Azure SQL compliant
Add missing clustered index for QRTZ_BLOB_TRIGGERS table
+** You need to manually add this to existing installation (tables created with old script), see ALTER TABLE [dbo].QRTZ_BLOB_TRIGGERS WITH NOCHECK ADD... in script
This is a bug fix release which has some critical fixes, especially for CalendarIntevalTrigger
+future date calculation and trigger's next fires not being processed in a timely fashion when AdoJobStore is used
+with DisallowConcurrentExecutionAttribute and trigger has short repeat interval.
This update is highly recommended for all users.
FIXES
StdAdoConstants.SqlSelectSchedulerStates does not filter on the SCHED_NAME column
This is the first alpha release from the long-awaited v3 branch. This is a big overhaul (and still in progress). Internals are being modernized whilst still trying to keep sane upgrade path.
A big thank you goes to Mike Rousos(opens new window) who really made it possible to get Quartz.NET working on .NET Core. Daniel Marbach(opens new window) also contributed a lot with ideas and code to async side. And of course never forgetting the community members that have provided feedback and fixes.
Right on the heels of [Quartz.NET 3.0 Alpha 1]({% post_url 2016-08-16-quartznet-3.0-alpha1-released %}) we now have
+a small maintenance version. With version 2.4 we are slowing things down with 2.x series and concentrate effors on v3 development.
NEW FEATURE
Add SQL limit support for MySQLDelegate
Removed dbFailureRetryInterval since it is no longer used
Update Common Logging to v3.3.1
FIXES
Batch acquisition can cause early firing of triggers
Should not rely on C5.TreeSet<T> on HolidayCalendar field serialization
This is the second alpha of v3. This release fixes problems with schedule signaling when AdoJobStore is in use.
+This release removes the last bits of Quartz's usage of thread local storage and thus makes async-based operations a lot safer.
FIXES
fix scheduler signaling not working with AdoJobStore due to thread local storage
thread local state removed altogether
quartz.serializer.type was required even though non-serializing RAMJobStore was in use
JSON serialization incorrectly called serialization callbacks
BREAKING CHANGES
IStatefulJob was removed, been obsolete since 2.x
ISemaphore interface now passes Guid requestorId that defines lock owner instead of implicit thread name
KNOWN ISSUES
Issues with time zone ids between Windows and Linux, they use different ids for the same zone
This release contains mainly bug fixes but because there's a behavioral change in
+DST handling (for the better) that warrants for a minor version number increment.
This is the third alpha of v3. APIs have had some love in form of adding CancellationToken support and
+using more IReadOnlyCollection<T>s more concisely. Unfortunately we still don't have the story done for
+remote management support (HTTP API).
When using AdoJobStore: make sure to run both 2.6 and 3.0 SQL migration scripts if you are upgrading from 2.5, otherwise just 3.0 migration script
NEW FEATURE
support for .NET Standard 2.0 preview (#486)
support for MySQL on .NET Standard via provider 'MySql' (#493)
The wait is over, Quartz.NET 3.0 is here with .NET Core support and async/await!
A big thank you goes to Mike Rousos(opens new window) who really made it possible to get Quartz.NET working on .NET Core.
+Daniel Marbach(opens new window) also contributed a lot with ideas and code to async side.
+And of course never forgetting the community members that have provided feedback and fixes.
This is a bug fix release that fixes cron expression parsing bug and reverts IRemotableQuartzScheduler
+interface back to its original form without Tasks and CancellationTokens - so that's it's actually usable
+through .NET Remoting infrastructure. Now zip packing is also back and includes Quartz.Server.
FIXES
Create zip package as part of release, including Quartz.Server (#572)
A specific CronExpression fails with "Input string was not in a correct format." (#568)
Cannot use remoting due to Task and CancellationToken signatures (#571)
This release fixes a nasty memory leak caused by QuartzSchedulerThread sharing its CancellationTokenSource with calls it makes.
+Everyone using 3.x is advised to upgrade.
FIXES
Memory leak caused by CancellationTokenSource sharing (#600)
tables_oracle.sql should use NUMBER(19) instead of NUMBER(13) for long properties (#598)
This release fixes a nasty bug with JSON calendar database serialization and .NET Core SQL Server client libraries
+have been updated to mitigiate possible hangs when connection drops occur.
Also some other minor bugs have been also addressed.
You should now be able to debug into Quartz.NET sources with added SourceLink support.
NEW FEATURE
Add SourceLink support (#642)
Make JobInterrupted method virtual in class SchedulerListenerSupport (#631)
FIXES
Trigger group can be left as paused when all triggers have been removed (#641)
PlatformNotSupportedException on RaspberryPi (Windows IoT) (#630)
JSON serialisation returning defaults for derived calendar settings (#634)
.NET Core version not able to recover from DB connection drops (#637)
This release brings .NET Core 2.1 version of example server and adds new plugin
+Quartz.Plugins.TimeZoneConverter which allows usage of TimeZoneConverter library(opens new window) to get consistent time zone id parsing between
+Linux and Windows.
There are also some bug fixes related to AdoJobStore.
NEW FEATURE
Add .NET Core 2.1 version of example server (#682)
The wait is almost over, after more than two years of hiatus, Quartz.NET 3.1 beta 1 is here with exciting new features. This release concentrates on performance and bringing support to de facto Microsoft libraries like dependency injection and ASP.NET Core hosting.
# Support for ASP.NET Core Dependency Injection and Hosted Services
A big change on the persistent store side is that now SQL queries use parametrized scheduler name, which allows database server to reuse query plans and use indexes more optimally. This will help especially clusters which have large number of nodes. The SQL server indexes were also revisited and their amount reduced by using smarter covering indexes.
The wait is almost over, after more than two years of hiatus, Quartz.NET 3.1 beta 2 is here with exciting new features.
+This release builds on top of beta 1 adding more fixes and improvements. Read the beta 1 release notes to know more.
The wait is almost over, after more than two years of hiatus, Quartz.NET 3.1 beta 2 is here with exciting new features.
+This release builds on top of beta 1 and beta 2 adding more fixes and improvements.
* Upgrade MySqlConnector to 1.0 (namespace has changed) (#890)
+* Support Microsoft.Extensions.Logging.Abstractions (#756)
+* Support Microsoft.Data.SQLite with full framework (#893)
+* Support custom calendar JSON serialization (#697)
+
FIXES
* Remove internal dependencies from examples (#742)
+* Properly assign MaxConcurrency in CreateVolatileScheduler (#726)
+
This release concentrates on performance and bringing support for standard integrations.
+Quartz 3.1 supports netstandard2.0 and net461 targets (for integrations they may be different).
First version of integration is able transmit job execution (Started, Ended, Exception) information to exporters. With this infrastructure is should also be easier to implement job history
+using battle-tested log backends for storing data. The example ASP.NET Core application(opens new window) integrates
+with Jaeger and transmits this data.
# Better Indexes for SQL Server and smarter parametrized queries
A big change on the persistent store side is that now SQL queries use parametrized scheduler name, which allows database server to reuse query plans and use indexes more optimally.
+This will help especially clusters which have large number of nodes. The SQL server indexes were also revisited and their amount reduced by using smarter covering indexes.
There is also a very important bug fix present for lock handling on retries. There was a possibility for a deadlock in cluster's database lock handling in some situations.
# Microsoft.Data.SqlClient as SQL Server connection library
Quartz now uses Microsoft.Data.SqlClient(opens new window) as the connection library for SQL Server as it's the one going to get new features.
+It is dependency for Quartz library (for now) so you shouldn't need to do any manual install steps.
# Upgrade MySqlConnector to 1.0 (namespace has changed)
You need to use the latest MySqlConnector 1.0.0(opens new window) in order to use with default Quartz configuration.
+As the namespace for library has changed it's not backwards compatible.
+If you need to use the old version, you should manually register DB provider with the old details.
No known issues. Documentation might require additions and community contributions are welcomed. Edits should be easy now with the new publishing framework.
minimum supported .NET Full Framework is now 4.6.1
changed SQL commands format in Quartz.Impl.AdoJobStore.JobStoreSupport (see also #818(opens new window)). Affected are only schedulers that use customized configurations of SQL commands in Quartz.Impl.AdoJobStore.JobStoreSupport, e.g. SelectWithLockSQL. Migration example:
<!-- Quartz <=3.0.7 -->
+<itemkey="quartz.jobStore.selectWithLockSQL">SELECT * FROM {0}LOCKS WITH (UPDLOCK,ROWLOCK) WHERE SCHED_NAME = {1} AND LOCK_NAME = @lockName</item>
+<!-- Quartz >=3.1.0 -->
+<itemkey="quartz.jobStore.selectWithLockSQL">SELECT * FROM {0}LOCKS WITH (UPDLOCK,ROWLOCK) WHERE SCHED_NAME = @schedulerName AND LOCK_NAME = @lockName</item>
+
NEW FEATURE
Microsoft DI integration via package Quartz.Extensions.DependencyInjection (also allows bridging to Microsoft Logging)
DI configuration now supports adding scheduler, job and trigger listeners (#877)
DI configuration now processes appsettings.json section "Quartz" looking for key value pairs (#877)
Add diagnostics source and OpenTelemetry support (#901)
Use Microsoft.Data.SqlClient as SQL Server connection library (#839)
ASP.NET Core / Hosting integration and health checks via revisited NuGet package Quartz.AspNetCore (thank you zlzforever for contributing the work)
Introduced a config parameter ClusterCheckinMisfireThreshold (#692)
Giving meaningful names to examples folders (#701)
// we can use options pattern to support hooking your own configuration
+// because we don't use service registration api
+// we need to manally ensure the job is present in DI
+services.AddTransient<ExampleJob>();
+
+services.Configure<SampleOptions>(Configuration.GetSection("Sample"));
+services.AddOptions<QuartzOptions>()
+ .Configure<IOptions<SampleOptions>>((options, dep)=>
+ {
+ if(!string.IsNullOrWhiteSpace(dep.Value.CronSchedule))
+ {
+ var jobKey =newJobKey("options-custom-job","custom");
+ options.AddJob<ExampleJob>(j => j.WithIdentity(jobKey));
+ options.AddTrigger(trigger => trigger
+ .WithIdentity("options-custom-trigger","custom")
+ .ForJob(jobKey)
+ .WithCronSchedule(dep.Value.CronSchedule));
+ }
+ });
+
+
Now Quartz no longer has hard dependency on Microsoft.Data.SqlClient package.
+Full framework defaults now back to same behavior as it was with Quartz 3.0 (using built-in System.Data.SqlClient driver).
You can use either one of the two providers, SqlServer (default) or SystemDataSqlClient. Former uses System.Data.SqlClient and latter
+the new Microsoft.Data.SqlClient package(opens new window).
+If you choose to use the new package, make sure you have the NuGet package installed.
There was an important fix for SQL Server where varying text parameter sizes caused query plan cache pollution. Now when no parameter size is
+defined for string parameter, default value of 4000 will be used. This problem has been present since the beginning.
This is a maintenance release containing mostly bug fixes.
MS dependency injection job factory configuration was unified and you can now configure relevant options
+like whether to create a separate scope with using just the UseMicrosoftDependencyInjectionJobFactory and its callback.
+Now scoped jobs also get their properties set from job data map.
Pre-configuring Quartz options from appsettings.json with services.Configure<QuartzOptions>(Configuration.GetSection("Quartz"));
+now also works as expected.
This release is a maintenance release with couple of bug fixes. The most important fix for this release is that
+now Quartz distinguishes between external code task cancellation (say HttpClient) and job cancellation triggered by using
+the Quartz API's Interrupt method. Earlier Quartz incorrectly considered also other OperationCanceledExceptions as clean instead of being errors.
This release addresses problems with using Quartz with .NET Full Framework lower than 4.7.2. ValueTask loading
+could fail due the dependencies brought with activity source support. Now activity sources are only supported when
+using .NET Framework >= 4.7.2 and netstandard >= 2.0. This also raises requirement the same way for package
+Quartz.OpenTelemetry.Instrumentation.
This release also improves trigger acquisition performance when using persistent job store, mostly by reducing network round-trips.
+The semaphore implementations were also re-written to gain more performance.
Also some bug fixes included, thanks to all contributors!
This release returns the possibility to resolve jobs from Microsoft DI container. Now container is checked first and if not found then
+ActivatorUtilities is used to construct the type with constructor injection support. Now both AllowDefaultConstructor and CreateScope have
+been obsoleted as behavior is now either via DI construction or ActivatorUtilities and scope is always created to prevent resource leaks / double disposal.
Also a problem with host name resolution under WSL2 scenario was fixed.
FIXES
Try resolving jobs from service provider before resorting to ActivatorUtilities (#1159)
Can't get hostname on WSL2+docker host network (#1158)
+
+
+
diff --git a/android-icon-144x144.png b/android-icon-144x144.png
new file mode 100644
index 000000000..93ee8cb09
Binary files /dev/null and b/android-icon-144x144.png differ
diff --git a/android-icon-192x192.png b/android-icon-192x192.png
new file mode 100644
index 000000000..17c89e03a
Binary files /dev/null and b/android-icon-192x192.png differ
diff --git a/android-icon-36x36.png b/android-icon-36x36.png
new file mode 100644
index 000000000..7296a464c
Binary files /dev/null and b/android-icon-36x36.png differ
diff --git a/android-icon-48x48.png b/android-icon-48x48.png
new file mode 100644
index 000000000..15877c663
Binary files /dev/null and b/android-icon-48x48.png differ
diff --git a/android-icon-72x72.png b/android-icon-72x72.png
new file mode 100644
index 000000000..66a15d830
Binary files /dev/null and b/android-icon-72x72.png differ
diff --git a/android-icon-96x96.png b/android-icon-96x96.png
new file mode 100644
index 000000000..9403db8c9
Binary files /dev/null and b/android-icon-96x96.png differ
diff --git a/apple-icon-114x114.png b/apple-icon-114x114.png
new file mode 100644
index 000000000..2b540f31d
Binary files /dev/null and b/apple-icon-114x114.png differ
diff --git a/apple-icon-120x120.png b/apple-icon-120x120.png
new file mode 100644
index 000000000..5a1189d39
Binary files /dev/null and b/apple-icon-120x120.png differ
diff --git a/apple-icon-144x144.png b/apple-icon-144x144.png
new file mode 100644
index 000000000..93ee8cb09
Binary files /dev/null and b/apple-icon-144x144.png differ
diff --git a/apple-icon-152x152.png b/apple-icon-152x152.png
new file mode 100644
index 000000000..22cadc3db
Binary files /dev/null and b/apple-icon-152x152.png differ
diff --git a/apple-icon-180x180.png b/apple-icon-180x180.png
new file mode 100644
index 000000000..99e319822
Binary files /dev/null and b/apple-icon-180x180.png differ
diff --git a/apple-icon-57x57.png b/apple-icon-57x57.png
new file mode 100644
index 000000000..be10295a8
Binary files /dev/null and b/apple-icon-57x57.png differ
diff --git a/apple-icon-60x60.png b/apple-icon-60x60.png
new file mode 100644
index 000000000..ca2afb5e3
Binary files /dev/null and b/apple-icon-60x60.png differ
diff --git a/apple-icon-72x72.png b/apple-icon-72x72.png
new file mode 100644
index 000000000..66a15d830
Binary files /dev/null and b/apple-icon-72x72.png differ
diff --git a/apple-icon-76x76.png b/apple-icon-76x76.png
new file mode 100644
index 000000000..516d9eed3
Binary files /dev/null and b/apple-icon-76x76.png differ
diff --git a/apple-icon-precomposed.png b/apple-icon-precomposed.png
new file mode 100644
index 000000000..6214e2e61
Binary files /dev/null and b/apple-icon-precomposed.png differ
diff --git a/apple-icon.png b/apple-icon.png
new file mode 100644
index 000000000..6214e2e61
Binary files /dev/null and b/apple-icon.png differ
diff --git a/assets/css/0.styles.af8ca635.css b/assets/css/0.styles.af8ca635.css
new file mode 100644
index 000000000..146bf7efe
--- /dev/null
+++ b/assets/css/0.styles.af8ca635.css
@@ -0,0 +1 @@
+code[class*=language-],pre[class*=language-]{color:#ccc;background:none;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}.theme-default-content code{color:#476582;padding:.25rem .5rem;margin:0;font-size:.85em;background-color:rgba(27,31,35,.05);border-radius:3px}.theme-default-content code .token.deleted{color:#ec5975}.theme-default-content code .token.inserted{color:#3eaf7c}.theme-default-content pre,.theme-default-content pre[class*=language-]{line-height:1.4;padding:1.25rem 1.5rem;margin:.85rem 0;background-color:#282c34;border-radius:6px;overflow:auto}.theme-default-content pre[class*=language-] code,.theme-default-content pre code{color:#fff;padding:0;background-color:transparent;border-radius:0}div[class*=language-]{position:relative;background-color:#282c34;border-radius:6px}div[class*=language-] .highlight-lines{-webkit-user-select:none;user-select:none;padding-top:1.3rem;position:absolute;top:0;left:0;width:100%;line-height:1.4}div[class*=language-] .highlight-lines .highlighted{background-color:rgba(0,0,0,.66)}div[class*=language-] pre,div[class*=language-] pre[class*=language-]{background:transparent;position:relative;z-index:1}div[class*=language-]:before{position:absolute;z-index:3;top:.8em;right:1em;font-size:.75rem;color:hsla(0,0%,100%,.4)}div[class*=language-]:not(.line-numbers-mode) .line-numbers-wrapper{display:none}div[class*=language-].line-numbers-mode .highlight-lines .highlighted{position:relative}div[class*=language-].line-numbers-mode .highlight-lines .highlighted:before{content:" ";position:absolute;z-index:3;left:0;top:0;display:block;width:3.5rem;height:100%;background-color:rgba(0,0,0,.66)}div[class*=language-].line-numbers-mode pre{padding-left:4.5rem;vertical-align:middle}div[class*=language-].line-numbers-mode .line-numbers-wrapper{position:absolute;top:0;width:3.5rem;text-align:center;color:hsla(0,0%,100%,.3);padding:1.25rem 0;line-height:1.4}div[class*=language-].line-numbers-mode .line-numbers-wrapper br{-webkit-user-select:none;user-select:none}div[class*=language-].line-numbers-mode .line-numbers-wrapper .line-number{position:relative;z-index:4;-webkit-user-select:none;user-select:none;font-size:.85em}div[class*=language-].line-numbers-mode:after{content:"";position:absolute;z-index:2;top:0;left:0;width:3.5rem;height:100%;border-radius:6px 0 0 6px;border-right:1px solid rgba(0,0,0,.66);background-color:#282c34}div[class~=language-js]:before{content:"js"}div[class~=language-ts]:before{content:"ts"}div[class~=language-html]:before{content:"html"}div[class~=language-md]:before{content:"md"}div[class~=language-vue]:before{content:"vue"}div[class~=language-css]:before{content:"css"}div[class~=language-sass]:before{content:"sass"}div[class~=language-scss]:before{content:"scss"}div[class~=language-less]:before{content:"less"}div[class~=language-stylus]:before{content:"stylus"}div[class~=language-go]:before{content:"go"}div[class~=language-java]:before{content:"java"}div[class~=language-c]:before{content:"c"}div[class~=language-sh]:before{content:"sh"}div[class~=language-yaml]:before{content:"yaml"}div[class~=language-py]:before{content:"py"}div[class~=language-docker]:before{content:"docker"}div[class~=language-dockerfile]:before{content:"dockerfile"}div[class~=language-makefile]:before{content:"makefile"}div[class~=language-javascript]:before{content:"js"}div[class~=language-typescript]:before{content:"ts"}div[class~=language-markup]:before{content:"html"}div[class~=language-markdown]:before{content:"md"}div[class~=language-json]:before{content:"json"}div[class~=language-ruby]:before{content:"rb"}div[class~=language-python]:before{content:"py"}div[class~=language-bash]:before{content:"sh"}div[class~=language-php]:before{content:"php"}.custom-block .custom-block-title{font-weight:600;margin-bottom:-.4rem}.custom-block.danger,.custom-block.tip,.custom-block.warning{padding:.1rem 1.5rem;border-left-width:.5rem;border-left-style:solid;margin:1rem 0}.custom-block.tip{background-color:#f3f5f7;border-color:#42b983}.custom-block.warning{background-color:rgba(255,229,100,.3);border-color:#e7c000;color:#6b5900}.custom-block.warning .custom-block-title{color:#b29400}.custom-block.warning a{color:#2c3e50}.custom-block.danger{background-color:#ffe6e6;border-color:#c00;color:#4d0000}.custom-block.danger .custom-block-title{color:#900}.custom-block.danger a{color:#2c3e50}.custom-block.details{display:block;position:relative;border-radius:2px;margin:1.6em 0;padding:1.6em;background-color:#eee}.custom-block.details h4{margin-top:0}.custom-block.details figure:last-child,.custom-block.details p:last-child{margin-bottom:0;padding-bottom:0}.custom-block.details summary{outline:none;cursor:pointer}.arrow{display:inline-block;width:0;height:0}.arrow.up{border-bottom:6px solid #ccc}.arrow.down,.arrow.up{border-left:4px solid transparent;border-right:4px solid transparent}.arrow.down{border-top:6px solid #ccc}.arrow.right{border-left:6px solid #ccc}.arrow.left,.arrow.right{border-top:4px solid transparent;border-bottom:4px solid transparent}.arrow.left{border-right:6px solid #ccc}.theme-default-content:not(.custom){max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.theme-default-content:not(.custom){padding:2rem}}@media (max-width:419px){.theme-default-content:not(.custom){padding:1.5rem}}.table-of-contents .badge{vertical-align:middle}body,html{padding:0;margin:0;background-color:#fff}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:16px;color:#2c3e50}.page{padding-left:20rem}.navbar{z-index:20;right:0;height:3.6rem;background-color:#fff;box-sizing:border-box;border-bottom:1px solid #eaecef}.navbar,.sidebar-mask{position:fixed;top:0;left:0}.sidebar-mask{z-index:9;width:100vw;height:100vh;display:none}.sidebar{font-size:16px;background-color:#fff;width:20rem;position:fixed;z-index:10;margin:0;top:3.6rem;left:0;bottom:0;box-sizing:border-box;border-right:1px solid #eaecef;overflow-y:auto}.theme-default-content:not(.custom)>:first-child{margin-top:3.6rem}.theme-default-content:not(.custom) a:hover{text-decoration:underline}.theme-default-content:not(.custom) p.demo{padding:1rem 1.5rem;border:1px solid #ddd;border-radius:4px}.theme-default-content:not(.custom) img{max-width:100%}.theme-default-content.custom{padding:0;margin:0}.theme-default-content.custom img{max-width:100%}a{font-weight:500;text-decoration:none}a,p a code{color:#3eaf7c}p a code{font-weight:400}kbd{background:#eee;border:.15rem solid #ddd;border-bottom:.25rem solid #ddd;border-radius:.15rem;padding:0 .15em}blockquote{font-size:1rem;color:#999;border-left:.2rem solid #dfe2e5;margin:1rem 0;padding:.25rem 0 .25rem 1rem}blockquote>p{margin:0}ol,ul{padding-left:1.2em}strong{font-weight:600}h1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.25}.theme-default-content:not(.custom)>h1,.theme-default-content:not(.custom)>h2,.theme-default-content:not(.custom)>h3,.theme-default-content:not(.custom)>h4,.theme-default-content:not(.custom)>h5,.theme-default-content:not(.custom)>h6{margin-top:-3.1rem;padding-top:4.6rem;margin-bottom:0}.theme-default-content:not(.custom)>h1:first-child,.theme-default-content:not(.custom)>h2:first-child,.theme-default-content:not(.custom)>h3:first-child,.theme-default-content:not(.custom)>h4:first-child,.theme-default-content:not(.custom)>h5:first-child,.theme-default-content:not(.custom)>h6:first-child{margin-top:-1.5rem;margin-bottom:1rem}.theme-default-content:not(.custom)>h1:first-child+.custom-block,.theme-default-content:not(.custom)>h1:first-child+p,.theme-default-content:not(.custom)>h1:first-child+pre,.theme-default-content:not(.custom)>h2:first-child+.custom-block,.theme-default-content:not(.custom)>h2:first-child+p,.theme-default-content:not(.custom)>h2:first-child+pre,.theme-default-content:not(.custom)>h3:first-child+.custom-block,.theme-default-content:not(.custom)>h3:first-child+p,.theme-default-content:not(.custom)>h3:first-child+pre,.theme-default-content:not(.custom)>h4:first-child+.custom-block,.theme-default-content:not(.custom)>h4:first-child+p,.theme-default-content:not(.custom)>h4:first-child+pre,.theme-default-content:not(.custom)>h5:first-child+.custom-block,.theme-default-content:not(.custom)>h5:first-child+p,.theme-default-content:not(.custom)>h5:first-child+pre,.theme-default-content:not(.custom)>h6:first-child+.custom-block,.theme-default-content:not(.custom)>h6:first-child+p,.theme-default-content:not(.custom)>h6:first-child+pre{margin-top:2rem}h1:focus .header-anchor,h1:hover .header-anchor,h2:focus .header-anchor,h2:hover .header-anchor,h3:focus .header-anchor,h3:hover .header-anchor,h4:focus .header-anchor,h4:hover .header-anchor,h5:focus .header-anchor,h5:hover .header-anchor,h6:focus .header-anchor,h6:hover .header-anchor{opacity:1}h1{font-size:2.2rem}h2{font-size:1.65rem;padding-bottom:.3rem;border-bottom:1px solid #eaecef}h3{font-size:1.35rem}a.header-anchor{font-size:.85em;float:left;margin-left:-.87em;padding-right:.23em;margin-top:.125em;opacity:0}a.header-anchor:focus,a.header-anchor:hover{text-decoration:none}.line-number,code,kbd{font-family:source-code-pro,Menlo,Monaco,Consolas,Courier New,monospace}ol,p,ul{line-height:1.7}hr{border:0;border-top:1px solid #eaecef}table{border-collapse:collapse;margin:1rem 0;display:block;overflow-x:auto}tr{border-top:1px solid #dfe2e5}tr:nth-child(2n){background-color:#f6f8fa}td,th{border:1px solid #dfe2e5;padding:.6em 1em}.theme-container.sidebar-open .sidebar-mask{display:block}.theme-container.no-navbar .theme-default-content:not(.custom)>h1,.theme-container.no-navbar h2,.theme-container.no-navbar h3,.theme-container.no-navbar h4,.theme-container.no-navbar h5,.theme-container.no-navbar h6{margin-top:1.5rem;padding-top:0}.theme-container.no-navbar .sidebar{top:0}@media (min-width:720px){.theme-container.no-sidebar .sidebar{display:none}.theme-container.no-sidebar .page{padding-left:0}}@media (max-width:959px){.sidebar{font-size:15px;width:16.4rem}.page{padding-left:16.4rem}}@media (max-width:719px){.sidebar{top:0;padding-top:3.6rem;transform:translateX(-100%);transition:transform .2s ease}.page{padding-left:0}.theme-container.sidebar-open .sidebar{transform:translateX(0)}.theme-container.no-navbar .sidebar{padding-top:0}}@media (max-width:419px){h1{font-size:1.9rem}.theme-default-content div[class*=language-]{margin:.85rem -1.5rem;border-radius:0}}#nprogress{pointer-events:none}#nprogress .bar{background:#3eaf7c;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;box-shadow:0 0 10px #3eaf7c,0 0 5px #3eaf7c;opacity:1;transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;box-sizing:border-box;border-color:#3eaf7c transparent transparent #3eaf7c;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.go-to-top[data-v-5fd4ef0c]{cursor:pointer;position:fixed;bottom:2rem;right:2.5rem;width:2rem;color:#3eaf7c;z-index:1}.go-to-top[data-v-5fd4ef0c]:hover{color:#72cda4}@media (max-width:959px){.go-to-top[data-v-5fd4ef0c]{display:none}}.fade-enter-active[data-v-5fd4ef0c],.fade-leave-active[data-v-5fd4ef0c]{transition:opacity .3s}.fade-enter[data-v-5fd4ef0c],.fade-leave-to[data-v-5fd4ef0c]{opacity:0}.icon.outbound{color:#aaa;display:inline-block;vertical-align:middle;position:relative;top:-1px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.home{padding:3.6rem 2rem 0;max-width:960px;margin:0 auto;display:block}.home .hero{text-align:center}.home .hero img{max-width:100%;max-height:280px;display:block;margin:3rem auto 1.5rem}.home .hero h1{font-size:3rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.8rem auto}.home .hero .description{max-width:35rem;font-size:1.6rem;line-height:1.3;color:#6a8bad}.home .hero .action-button{display:inline-block;font-size:1.2rem;color:#fff;background-color:#3eaf7c;padding:.8rem 1.6rem;border-radius:4px;transition:background-color .1s ease;box-sizing:border-box;border-bottom:1px solid #389d70}.home .hero .action-button:hover{background-color:#4abf8a}.home .features{border-top:1px solid #eaecef;padding:1.2rem 0;margin-top:2.5rem;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:stretch;justify-content:space-between}.home .feature{flex-grow:1;flex-basis:30%;max-width:30%}.home .feature h2{font-size:1.4rem;font-weight:500;border-bottom:none;padding-bottom:0;color:#3a5169}.home .feature p{color:#4e6e8e}.home .footer{padding:2.5rem;border-top:1px solid #eaecef;text-align:center;color:#4e6e8e}@media (max-width:719px){.home .features{flex-direction:column}.home .feature{max-width:100%;padding:0 2.5rem}}@media (max-width:419px){.home{padding-left:1.5rem;padding-right:1.5rem}.home .hero img{max-height:210px;margin:2rem auto 1.2rem}.home .hero h1{font-size:2rem}.home .hero .action,.home .hero .description,.home .hero h1{margin:1.2rem auto}.home .hero .description{font-size:1.2rem}.home .hero .action-button{font-size:1rem;padding:.6rem 1.2rem}.home .feature h2{font-size:1.25rem}}.algolia-search-wrapper>span{vertical-align:middle}.algolia-search-wrapper .algolia-autocomplete{line-height:normal}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu{background-color:#fff;border:1px solid #999;border-radius:4px;font-size:16px;margin:6px 0 0;padding:4px;text-align:left}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu:before{border-color:#999}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu [class*=ds-dataset-]{border:none;padding:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestions{margin-top:0}.algolia-search-wrapper .algolia-autocomplete .ds-dropdown-menu .ds-suggestion{border-bottom:1px solid #eaecef}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#2c815b}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion{border-color:#eaecef;padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header{padding:5px 10px;margin-top:0;background:#3eaf7c;color:#fff;font-weight:600}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--highlight{background:hsla(0,0%,100%,.6)}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--wrapper{padding:0}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--title{font-weight:600;margin-bottom:0;color:#2c3e50}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{vertical-align:top;padding:5px 7px 5px 5px;border-color:#eaecef;background:#f1f3f5}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{display:none}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column-text{color:#555}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-footer{border-color:#eaecef}.algolia-search-wrapper .algolia-autocomplete .ds-cursor .algolia-docsearch-suggestion--content{background-color:#e7edf3!important;color:#2c3e50}@media (min-width:719px){.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{float:none;width:150px;min-width:150px;display:table-cell}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{float:none;display:table-cell;width:100%;vertical-align:top}.algolia-search-wrapper .algolia-autocomplete .algolia-docsearch-suggestion .ds-dropdown-menu{min-width:515px!important}}@media (max-width:719px){.algolia-search-wrapper .ds-dropdown-menu{min-width:calc(100vw - 4rem)!important;max-width:calc(100vw - 4rem)!important}.algolia-search-wrapper .algolia-docsearch-suggestion--wrapper{padding:5px 7px 5px 5px!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column{padding:0!important;background:#fff!important}.algolia-search-wrapper .algolia-docsearch-suggestion--subcategory-column-text:after{content:" > ";font-size:10px;line-height:14.4px;display:inline-block;width:5px;margin:-3px 3px 0;vertical-align:middle}}.search-box{display:inline-block;position:relative;margin-right:1rem}.search-box input{cursor:text;width:10rem;height:2rem;color:#4e6e8e;display:inline-block;border:1px solid #cfd4db;border-radius:2rem;font-size:.9rem;line-height:2rem;padding:0 .5rem 0 2rem;outline:none;transition:all .2s ease;background:#fff url(/assets/img/search.83621669.svg) .6rem .5rem no-repeat;background-size:1rem}.search-box input:focus{cursor:auto;border-color:#3eaf7c}.search-box .suggestions{background:#fff;width:20rem;position:absolute;top:2rem;border:1px solid #cfd4db;border-radius:6px;padding:.4rem;list-style-type:none}.search-box .suggestions.align-right{right:0}.search-box .suggestion{line-height:1.4;padding:.4rem .6rem;border-radius:4px;cursor:pointer}.search-box .suggestion a{white-space:normal;color:#5d82a6}.search-box .suggestion a .page-title{font-weight:600}.search-box .suggestion a .header{font-size:.9em;margin-left:.25em}.search-box .suggestion.focused{background-color:#f3f4f5}.search-box .suggestion.focused a{color:#3eaf7c}@media (max-width:959px){.search-box input{cursor:pointer;width:0;border-color:transparent;position:relative}.search-box input:focus{cursor:text;left:0;width:10rem}}@media (-ms-high-contrast:none){.search-box input{height:2rem}}@media (max-width:959px) and (min-width:719px){.search-box .suggestions{left:0}}@media (max-width:719px){.search-box{margin-right:0}.search-box input{left:1rem}.search-box .suggestions{right:0}}@media (max-width:419px){.search-box .suggestions{width:calc(100vw - 4rem)}.search-box input:focus{width:8rem}}.sidebar-button{cursor:pointer;display:none;width:1.25rem;height:1.25rem;position:absolute;padding:.6rem;top:.6rem;left:1rem}.sidebar-button .icon{display:block;width:1.25rem;height:1.25rem}@media (max-width:719px){.sidebar-button{display:block}}.dropdown-enter,.dropdown-leave-to{height:0!important}.dropdown-wrapper{cursor:pointer}.dropdown-wrapper .dropdown-title,.dropdown-wrapper .mobile-dropdown-title{display:block;font-size:.9rem;font-family:inherit;cursor:inherit;padding:inherit;line-height:1.4rem;background:transparent;border:none;font-weight:500;color:#2c3e50}.dropdown-wrapper .dropdown-title:hover,.dropdown-wrapper .mobile-dropdown-title:hover{border-color:transparent}.dropdown-wrapper .dropdown-title .arrow,.dropdown-wrapper .mobile-dropdown-title .arrow{vertical-align:middle;margin-top:-1px;margin-left:.4rem}.dropdown-wrapper .mobile-dropdown-title{display:none;font-weight:600}.dropdown-wrapper .mobile-dropdown-title font-size inherit:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item{color:inherit;line-height:1.7rem}.dropdown-wrapper .nav-dropdown .dropdown-item h4{margin:.45rem 0 0;border-top:1px solid #eee;padding:1rem 1.5rem .45rem 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper{padding:0;list-style:none}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem-wrapper .dropdown-subitem{font-size:.9em}.dropdown-wrapper .nav-dropdown .dropdown-item a{display:block;line-height:1.7rem;position:relative;border-bottom:none;font-weight:400;margin-bottom:0;padding:0 1.5rem 0 1.25rem}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active,.dropdown-wrapper .nav-dropdown .dropdown-item a:hover{color:#3eaf7c}.dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{content:"";width:0;height:0;border-left:5px solid #3eaf7c;border-top:3px solid transparent;border-bottom:3px solid transparent;position:absolute;top:calc(50% - 2px);left:9px}.dropdown-wrapper .nav-dropdown .dropdown-item:first-child h4{margin-top:0;padding-top:0;border-top:0}@media (max-width:719px){.dropdown-wrapper.open .dropdown-title{margin-bottom:.5rem}.dropdown-wrapper .dropdown-title{display:none}.dropdown-wrapper .mobile-dropdown-title{display:block}.dropdown-wrapper .nav-dropdown{transition:height .1s ease-out;overflow:hidden}.dropdown-wrapper .nav-dropdown .dropdown-item h4{border-top:0;margin-top:0;padding-top:0}.dropdown-wrapper .nav-dropdown .dropdown-item>a,.dropdown-wrapper .nav-dropdown .dropdown-item h4{font-size:15px;line-height:2rem}.dropdown-wrapper .nav-dropdown .dropdown-item .dropdown-subitem{font-size:14px;padding-left:1rem}}@media (min-width:719px){.dropdown-wrapper{height:1.8rem}.dropdown-wrapper.open .nav-dropdown,.dropdown-wrapper:hover .nav-dropdown{display:block!important}.dropdown-wrapper.open:blur{display:none}.dropdown-wrapper .nav-dropdown{display:none;height:auto!important;box-sizing:border-box;max-height:calc(100vh - 2.7rem);overflow-y:auto;position:absolute;top:100%;right:0;background-color:#fff;padding:.6rem 0;border:1px solid;border-color:#ddd #ddd #ccc;text-align:left;border-radius:.25rem;white-space:nowrap;margin:0}}.nav-links{display:inline-block}.nav-links a{line-height:1.4rem;color:inherit}.nav-links a.router-link-active,.nav-links a:hover{color:#3eaf7c}.nav-links .nav-item{position:relative;display:inline-block;margin-left:1.5rem;line-height:2rem}.nav-links .nav-item:first-child{margin-left:0}.nav-links .repo-link{margin-left:1.5rem}@media (max-width:719px){.nav-links .nav-item,.nav-links .repo-link{margin-left:0}}@media (min-width:719px){.nav-links a.router-link-active,.nav-links a:hover{color:#2c3e50}.nav-item>a:not(.external).router-link-active,.nav-item>a:not(.external):hover{margin-bottom:-2px;border-bottom:2px solid #46bd87}}.navbar{padding:.7rem 1.5rem;line-height:2.2rem}.navbar a,.navbar img,.navbar span{display:inline-block}.navbar .logo{height:2.2rem;min-width:2.2rem;margin-right:.8rem;vertical-align:top}.navbar .site-name{font-size:1.3rem;font-weight:600;color:#2c3e50;position:relative}.navbar .links{padding-left:1.5rem;box-sizing:border-box;background-color:#fff;white-space:nowrap;font-size:.9rem;position:absolute;right:1.5rem;top:.7rem;display:flex}.navbar .links .search-box{flex:0 0 auto;vertical-align:top}@media (max-width:719px){.navbar{padding-left:4rem}.navbar .can-hide{display:none}.navbar .links{padding-left:1.5rem}.navbar .site-name{width:calc(100vw - 9.4rem);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}}.page-edit{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-edit{padding:2rem}}@media (max-width:419px){.page-edit{padding:1.5rem}}.page-edit{padding-top:1rem;padding-bottom:1rem;overflow:auto}.page-edit .edit-link{display:inline-block}.page-edit .edit-link a{color:#4e6e8e;margin-right:.25rem}.page-edit .last-updated{float:right;font-size:.9em}.page-edit .last-updated .prefix{font-weight:500;color:#4e6e8e}.page-edit .last-updated .time{font-weight:400;color:#767676}@media (max-width:719px){.page-edit .edit-link{margin-bottom:.5rem}.page-edit .last-updated{font-size:.8em;float:none;text-align:left}}.page-nav{max-width:740px;margin:0 auto;padding:2rem 2.5rem}@media (max-width:959px){.page-nav{padding:2rem}}@media (max-width:419px){.page-nav{padding:1.5rem}}.page-nav{padding-top:1rem;padding-bottom:0}.page-nav .inner{min-height:2rem;margin-top:0;border-top:1px solid #eaecef;padding-top:1rem;overflow:auto}.page-nav .next{float:right}.page{padding-bottom:2rem;display:block}.sidebar-group .sidebar-group{padding-left:.5em}.sidebar-group:not(.collapsable) .sidebar-heading:not(.clickable){cursor:auto;color:inherit}.sidebar-group.is-sub-group{padding-left:0}.sidebar-group.is-sub-group>.sidebar-heading{font-size:.95em;line-height:1.4;font-weight:400;padding-left:2rem}.sidebar-group.is-sub-group>.sidebar-heading:not(.clickable){opacity:.5}.sidebar-group.is-sub-group>.sidebar-group-items{padding-left:1rem}.sidebar-group.is-sub-group>.sidebar-group-items>li>.sidebar-link{font-size:.95em;border-left:none}.sidebar-group.depth-2>.sidebar-heading{border-left:none}.sidebar-heading{color:#2c3e50;transition:color .15s ease;cursor:pointer;font-size:1.1em;font-weight:700;padding:.35rem 1.5rem .35rem 1.25rem;width:100%;box-sizing:border-box;margin:0;border-left:.25rem solid transparent}.sidebar-heading.open,.sidebar-heading:hover{color:inherit}.sidebar-heading .arrow{position:relative;top:-.12em;left:.5em}.sidebar-heading.clickable.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-heading.clickable:hover{color:#3eaf7c}.sidebar-group-items{transition:height .1s ease-out;font-size:.95em;overflow:hidden}.sidebar .sidebar-sub-headers{padding-left:1rem;font-size:.95em}a.sidebar-link{font-size:1em;font-weight:400;display:inline-block;color:#2c3e50;border-left:.25rem solid transparent;padding:.35rem 1rem .35rem 1.25rem;line-height:1.4;width:100%;box-sizing:border-box}a.sidebar-link:hover{color:#3eaf7c}a.sidebar-link.active{font-weight:600;color:#3eaf7c;border-left-color:#3eaf7c}.sidebar-group a.sidebar-link{padding-left:2rem}.sidebar-sub-headers a.sidebar-link{padding-top:.25rem;padding-bottom:.25rem;border-left:none}.sidebar-sub-headers a.sidebar-link.active{font-weight:500}.sidebar ul{padding:0;margin:0;list-style-type:none}.sidebar a{display:inline-block}.sidebar .nav-links{display:none;border-bottom:1px solid #eaecef;padding:.5rem 0 .75rem}.sidebar .nav-links a{font-weight:600}.sidebar .nav-links .nav-item,.sidebar .nav-links .repo-link{display:block;line-height:1.25rem;font-size:1.1em;padding:.5rem 0 .5rem 1.5rem}.sidebar>.sidebar-links{padding:1.5rem 0}.sidebar>.sidebar-links>li>a.sidebar-link{font-size:1.1em;line-height:1.7;font-weight:700}.sidebar>.sidebar-links>li:not(:first-child){margin-top:.75rem}@media (max-width:719px){.sidebar .nav-links{display:block}.sidebar .nav-links .dropdown-wrapper .nav-dropdown .dropdown-item a.router-link-active:after{top:calc(1rem - 2px)}.sidebar>.sidebar-links{padding:1rem 0}}.badge[data-v-15b7b770]{display:inline-block;font-size:14px;height:18px;line-height:18px;border-radius:3px;padding:0 6px;color:#fff}.badge.green[data-v-15b7b770],.badge.tip[data-v-15b7b770],.badge[data-v-15b7b770]{background-color:#42b983}.badge.error[data-v-15b7b770]{background-color:#da5961}.badge.warn[data-v-15b7b770],.badge.warning[data-v-15b7b770],.badge.yellow[data-v-15b7b770]{background-color:#e7c000}.badge+.badge[data-v-15b7b770]{margin-left:5px}.theme-code-block[data-v-759a7d02]{display:none}.theme-code-block__active[data-v-759a7d02]{display:block}.theme-code-block>pre[data-v-759a7d02]{background-color:orange}.theme-code-group__nav[data-v-deefee04]{margin-bottom:-35px;background-color:#282c34;padding-bottom:22px;border-top-left-radius:6px;border-top-right-radius:6px;padding-left:10px;padding-top:10px}.theme-code-group__ul[data-v-deefee04]{margin:auto 0;padding-left:0;display:inline-flex;list-style:none}.theme-code-group__nav-tab[data-v-deefee04]{border:0;padding:5px;cursor:pointer;background-color:transparent;font-size:.85em;line-height:1.4;color:hsla(0,0%,100%,.9);font-weight:600}.theme-code-group__nav-tab-active[data-v-deefee04]{border-bottom:1px solid #42b983}.pre-blank[data-v-deefee04]{color:#42b983}.searchbox{display:inline-block;position:relative;width:200px;height:32px!important;white-space:nowrap;box-sizing:border-box;visibility:visible!important}.searchbox .algolia-autocomplete{display:block;width:100%;height:100%}.searchbox__wrapper{width:100%;height:100%;z-index:999;position:relative}.searchbox__input{display:inline-block;box-sizing:border-box;transition:box-shadow .4s ease,background .4s ease;border:0;border-radius:16px;box-shadow:inset 0 0 0 1px #ccc;background:#fff!important;padding:0 26px 0 32px;width:100%;height:100%;vertical-align:middle;white-space:normal;font-size:12px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.searchbox__input::-webkit-search-cancel-button,.searchbox__input::-webkit-search-decoration,.searchbox__input::-webkit-search-results-button,.searchbox__input::-webkit-search-results-decoration{display:none}.searchbox__input:hover{box-shadow:inset 0 0 0 1px #b3b3b3}.searchbox__input:active,.searchbox__input:focus{outline:0;box-shadow:inset 0 0 0 1px #aaa;background:#fff}.searchbox__input:-ms-input-placeholder{color:#aaa}.searchbox__input::-moz-placeholder{color:#aaa}.searchbox__input::placeholder{color:#aaa}.searchbox__submit{position:absolute;top:0;margin:0;border:0;border-radius:16px 0 0 16px;background-color:rgba(69,142,225,0);padding:0;width:32px;height:100%;vertical-align:middle;text-align:center;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;right:inherit;left:0}.searchbox__submit:before{display:inline-block;margin-right:-4px;height:100%;vertical-align:middle;content:""}.searchbox__submit:active,.searchbox__submit:hover{cursor:pointer}.searchbox__submit:focus{outline:0}.searchbox__submit svg{width:14px;height:14px;vertical-align:middle;fill:#6d7e96}.searchbox__reset{display:block;position:absolute;top:8px;right:8px;margin:0;border:0;background:none;cursor:pointer;padding:0;font-size:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;fill:rgba(0,0,0,.5)}.searchbox__reset.hide{display:none}.searchbox__reset:focus{outline:0}.searchbox__reset svg{display:block;margin:4px;width:8px;height:8px}.searchbox__input:valid~.searchbox__reset{display:block;-webkit-animation-name:sbx-reset-in;animation-name:sbx-reset-in;-webkit-animation-duration:.15s;animation-duration:.15s}@-webkit-keyframes sbx-reset-in{0%{transform:translate3d(-20%,0,0);opacity:0}to{transform:none;opacity:1}}@keyframes sbx-reset-in{0%{transform:translate3d(-20%,0,0);opacity:0}to{transform:none;opacity:1}}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu{right:0!important;left:inherit!important}.algolia-autocomplete.algolia-autocomplete-right .ds-dropdown-menu:before{right:48px}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu{left:0!important;right:inherit!important}.algolia-autocomplete.algolia-autocomplete-left .ds-dropdown-menu:before{left:48px}.algolia-autocomplete .ds-dropdown-menu{top:-6px;border-radius:4px;margin:6px 0 0;padding:0;text-align:left;height:auto;position:relative;background:transparent;border:none;z-index:999;max-width:600px;min-width:500px;box-shadow:0 1px 0 0 rgba(0,0,0,.2),0 2px 3px 0 rgba(0,0,0,.1)}.algolia-autocomplete .ds-dropdown-menu:before{display:block;position:absolute;content:"";width:14px;height:14px;background:#fff;z-index:1000;top:-7px;border-top:1px solid #d9d9d9;border-right:1px solid #d9d9d9;transform:rotate(-45deg);border-radius:2px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions{position:relative;z-index:1000;margin-top:8px}.algolia-autocomplete .ds-dropdown-menu .ds-suggestions a:hover{text-decoration:none}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion{cursor:pointer}.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion.suggestion-layout-simple,.algolia-autocomplete .ds-dropdown-menu .ds-suggestion.ds-cursor .algolia-docsearch-suggestion:not(.suggestion-layout-simple) .algolia-docsearch-suggestion--content{background-color:rgba(69,142,225,.05)}.algolia-autocomplete .ds-dropdown-menu [class^=ds-dataset-]{position:relative;border:1px solid #d9d9d9;background:#fff;border-radius:4px;overflow:auto;padding:0 8px 8px}.algolia-autocomplete .ds-dropdown-menu *{box-sizing:border-box}.algolia-autocomplete .algolia-docsearch-suggestion{display:block;position:relative;padding:0 8px;background:#fff;color:#02060c;overflow:hidden}.algolia-autocomplete .algolia-docsearch-suggestion--highlight{color:#174d8c;background:rgba(143,187,237,.1);padding:.1em .05em}.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl0 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--category-header .algolia-docsearch-suggestion--category-header-lvl1 .algolia-docsearch-suggestion--highlight,.algolia-autocomplete .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{padding:0 0 1px;background:inherit;box-shadow:inset 0 -2px 0 0 rgba(69,142,225,.8);color:inherit}.algolia-autocomplete .algolia-docsearch-suggestion--content{display:block;float:right;width:70%;position:relative;padding:5.33333px 0 5.33333px 10.66667px;cursor:pointer}.algolia-autocomplete .algolia-docsearch-suggestion--content:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;left:-1px}.algolia-autocomplete .algolia-docsearch-suggestion--category-header{position:relative;border-bottom:1px solid #ddd;display:none;margin-top:8px;padding:4px 0;font-size:1em;color:#33363d}.algolia-autocomplete .algolia-docsearch-suggestion--wrapper{width:100%;float:left;padding:8px 0 0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column{float:left;width:30%;text-align:right;position:relative;padding:5.33333px 10.66667px;color:#a4a7ae;font-size:.9em;word-wrap:break-word}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-column:before{content:"";position:absolute;display:block;top:0;height:100%;width:1px;background:#ddd;right:0}.algolia-autocomplete .algolia-docsearch-suggestion--subcategory-inline{display:none}.algolia-autocomplete .algolia-docsearch-suggestion--title{margin-bottom:4px;color:#02060c;font-size:.9em;font-weight:700}.algolia-autocomplete .algolia-docsearch-suggestion--text{display:block;line-height:1.2em;font-size:.85em;color:#63676d}.algolia-autocomplete .algolia-docsearch-suggestion--no-results{width:100%;padding:8px 0;text-align:center;font-size:1.2em}.algolia-autocomplete .algolia-docsearch-suggestion--no-results:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion code{padding:1px 5px;font-size:90%;border:none;color:#222;background-color:#ebebeb;border-radius:3px;font-family:Menlo,Monaco,Consolas,Courier New,monospace}.algolia-autocomplete .algolia-docsearch-suggestion code .algolia-docsearch-suggestion--highlight{background:none}.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__main .algolia-docsearch-suggestion--category-header,.algolia-autocomplete .algolia-docsearch-suggestion.algolia-docsearch-suggestion__secondary{display:block}@media (min-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:block}}@media (max-width:768px){.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column{display:inline-block;width:auto;float:left;padding:0;color:#02060c;font-size:.9em;font-weight:700;text-align:left;opacity:.5}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:before{display:none}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column:after{content:"|"}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content{display:inline-block;width:auto;text-align:left;float:left;padding:0}.algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--content:before{display:none}}.algolia-autocomplete .suggestion-layout-simple.algolia-docsearch-suggestion{border-bottom:1px solid #eee;padding:8px;margin:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content{width:100%;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--content:before{display:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header{margin:0;padding:0;display:block;width:100%;border:none}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl0,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1{opacity:.6;font-size:.85em}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--category-header-lvl1:before{background-image:url('data:image/svg+xml;utf8,');content:"";width:10px;height:10px;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--wrapper{width:100%;float:left;margin:0;padding:0}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--duplicate-content,.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--subcategory-inline{display:none!important}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title{margin:0;color:#458ee1;font-size:.9em;font-weight:400}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--title:before{content:"#";font-weight:700;color:#458ee1;display:inline-block}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text{margin:4px 0 0;display:block;line-height:1.4em;padding:5.33333px 8px;background:#f8f8f8;font-size:.85em;opacity:.8}.algolia-autocomplete .suggestion-layout-simple .algolia-docsearch-suggestion--text .algolia-docsearch-suggestion--highlight{color:#3f4145;font-weight:700;box-shadow:none}.algolia-autocomplete .algolia-docsearch-footer{width:134px;height:20px;z-index:2000;margin-top:10.66667px;float:right;font-size:0;line-height:0}.algolia-autocomplete .algolia-docsearch-footer--logo{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg width='168' height='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cpath d='M78.988.938h16.594a2.968 2.968 0 012.966 2.966V20.5a2.967 2.967 0 01-2.966 2.964H78.988a2.967 2.967 0 01-2.966-2.964V3.897A2.961 2.961 0 0178.988.938zm41.937 17.866c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 00-1.574-.199 5.7 5.7 0 00-.897.069 2.699 2.699 0 00-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 01-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 01-1.471-.636 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 011.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 011.82-.185 8.404 8.404 0 011.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 00-.384-.73 1.784 1.784 0 00-.724-.493 3.164 3.164 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 00-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 012.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 00-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 00-.814.24 1.46 1.46 0 00-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 01.233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 01-1.471-.635 3.085 3.085 0 01-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 012.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 00-.109-.875 1.873 1.873 0 00-.384-.731 1.784 1.784 0 00-.724-.492 3.165 3.165 0 00-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 00-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 012.073-.177zm-8.034-1.271a1.626 1.626 0 01-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 01-1.128 1.906 4.986 4.986 0 01-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 01-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 01-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 011.15-1.892 5.133 5.133 0 011.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 011.753 1.216 5.644 5.644 0 011.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 00-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 01-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 01-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 012.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17z' fill='%235468FF'/%3E%3Cpath d='M6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 00-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 01-.582-.271 13.67 13.67 0 01-.55-.287 4.275 4.275 0 01-.567-.351 6.92 6.92 0 01-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 01-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 00-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 00-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 00-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 01-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z' fill='%235D6494'/%3E%3Cpath d='M89.632 5.967v-.772a.978.978 0 00-.978-.977h-2.28a.978.978 0 00-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 011.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 00-1.382 0l-.465.465a.973.973 0 000 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 00-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 01-4.49-4.482 4.488 4.488 0 014.49-4.482 4.488 4.488 0 014.489 4.482 4.484 4.484 0 01-4.49 4.482m0-10.85a6.363 6.363 0 100 12.729 6.37 6.37 0 006.372-6.368 6.358 6.358 0 00-6.371-6.36' fill='%23FFF'/%3E%3C/g%3E%3C/svg%3E");background-repeat:no-repeat;background-position:50%;background-size:100%;overflow:hidden;text-indent:-9000px;padding:0!important;width:100%;height:100%;display:block}
\ No newline at end of file
diff --git a/assets/img/search.83621669.svg b/assets/img/search.83621669.svg
new file mode 100644
index 000000000..03d83913e
--- /dev/null
+++ b/assets/img/search.83621669.svg
@@ -0,0 +1 @@
+
diff --git a/assets/js/10.5459967e.js b/assets/js/10.5459967e.js
new file mode 100644
index 000000000..404a8d499
--- /dev/null
+++ b/assets/js/10.5459967e.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{378:function(n,o,l){"use strict";l.r(o);var u=l(26),e=Object(u.a)({},void 0,void 0,!1,null,null,null);o.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/100.70eedb6c.js b/assets/js/100.70eedb6c.js
new file mode 100644
index 000000000..6ec5e1478
--- /dev/null
+++ b/assets/js/100.70eedb6c.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[100],{474:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/101.e7dd71b5.js b/assets/js/101.e7dd71b5.js
new file mode 100644
index 000000000..ac35caaa2
--- /dev/null
+++ b/assets/js/101.e7dd71b5.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[101],{475:function(e,t,r){"use strict";r.r(t);var a=r(26),o=Object(a.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"quartz-net-configuration-reference"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-net-configuration-reference"}},[e._v("#")]),e._v(" Quartz.NET Configuration Reference")]),e._v(" "),r("p"),r("div",{staticClass:"table-of-contents"},[r("ul",[r("li",[r("a",{attrs:{href:"#main-configuration"}},[e._v("Main Configuration")]),r("ul",[r("li",[r("a",{attrs:{href:"#quartz-scheduler-instancename"}},[e._v("quartz.scheduler.instanceName")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-instanceid"}},[e._v("quartz.scheduler.instanceId")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-instanceidgenerator-type"}},[e._v("quartz.scheduler.instanceIdGenerator.type")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-threadname"}},[e._v("quartz.scheduler.threadName")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-makeschedulerthreaddaemon"}},[e._v("quartz.scheduler.makeSchedulerThreadDaemon")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-idlewaittime"}},[e._v("quartz.scheduler.idleWaitTime")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-dbfailureretryinterval"}},[e._v("quartz.scheduler.dbFailureRetryInterval")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-typeloadhelper-type"}},[e._v("quartz.scheduler.typeLoadHelper.type")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-jobfactory-type"}},[e._v("quartz.scheduler.jobFactory.type")])]),r("li",[r("a",{attrs:{href:"#quartz-context-key-some-key"}},[e._v("quartz.context.key.SOME_KEY")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-batchtriggeracquisitionmaxcount"}},[e._v("quartz.scheduler.batchTriggerAcquisitionMaxCount")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-batchtriggeracquisitionfireaheadtimewindow"}},[e._v("quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow")])])])]),r("li",[r("a",{attrs:{href:"#threadpool"}},[e._v("ThreadPool")]),r("ul",[r("li",[r("a",{attrs:{href:"#quartz-threadpool-type"}},[e._v("quartz.threadPool.type")])]),r("li",[r("a",{attrs:{href:"#quartz-threadpool-maxconcurrency"}},[e._v("quartz.threadPool.maxConcurrency")])]),r("li",[r("a",{attrs:{href:"#custom-threadpools"}},[e._v("Custom ThreadPools")])])])]),r("li",[r("a",{attrs:{href:"#listeners"}},[e._v("Listeners")])]),r("li",[r("a",{attrs:{href:"#plug-ins"}},[e._v("Plug-Ins")]),r("ul",[r("li",[r("a",{attrs:{href:"#sample-configuration-of-logging-trigger-history-plugin"}},[e._v("Sample configuration of Logging Trigger History Plugin")])]),r("li",[r("a",{attrs:{href:"#sample-configuration-of-xml-scheduling-data-processor-plugin"}},[e._v("Sample configuration of XML Scheduling Data Processor Plugin")])]),r("li",[r("a",{attrs:{href:"#sample-configuration-of-shutdown-hook-plugin"}},[e._v("Sample configuration of Shutdown Hook Plugin")])]),r("li",[r("a",{attrs:{href:"#sample-configuration-of-job-interrupt-monitor-plugin"}},[e._v("Sample configuration of Job Interrupt Monitor Plugin")])])])]),r("li",[r("a",{attrs:{href:"#remoting-server-and-client"}},[e._v("Remoting Server and Client")]),r("ul",[r("li",[r("a",{attrs:{href:"#quartz-scheduler-exporter-type"}},[e._v("quartz.scheduler.exporter.type")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-exporter-port"}},[e._v("quartz.scheduler.exporter.port")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-exporter-bindname"}},[e._v("quartz.scheduler.exporter.bindName")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-exporter-channeltype"}},[e._v("quartz.scheduler.exporter.channelType")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-exporter-channelname"}},[e._v("quartz.scheduler.exporter.channelName")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-exporter-typefilterlevel"}},[e._v("quartz.scheduler.exporter.typeFilterLevel")])]),r("li",[r("a",{attrs:{href:"#quartz-scheduler-exporter-rejectremoterequests"}},[e._v("quartz.scheduler.exporter.rejectRemoteRequests")])])])]),r("li",[r("a",{attrs:{href:"#ramjobstore"}},[e._v("RAMJobStore")]),r("ul",[r("li",[r("a",{attrs:{href:"#quartz-jobstore-misfirethreshold"}},[e._v("quartz.jobStore.misfireThreshold")])])])]),r("li",[r("a",{attrs:{href:"#jobstoretx-ado-net"}},[e._v("JobStoreTX (ADO.NET)")]),r("ul",[r("li",[r("a",{attrs:{href:"#quartz-jobstore-driverdelegatetype"}},[e._v("quartz.jobStore.driverDelegateType")])]),r("li",[r("a",{attrs:{href:"#quartz-jobstore-datasource"}},[e._v("quartz.jobStore.dataSource")])]),r("li",[r("a",{attrs:{href:"#quartz-jobstore-tableprefix"}},[e._v("quartz.jobStore.tablePrefix")])]),r("li",[r("a",{attrs:{href:"#quartz-jobstore-useproperties"}},[e._v("quartz.jobStore.useProperties")])]),r("li",[r("a",{attrs:{href:"#quartz-jobstore-misfirethreshold"}},[e._v("quartz.jobStore.misfireThreshold")])]),r("li",[r("a",{attrs:{href:"#quartz-jobstore-clustered"}},[e._v("quartz.jobStore.clustered")])]),r("li",[r("a",{attrs:{href:"#quartz-jobstore-clustercheckininterval"}},[e._v("quartz.jobStore.clusterCheckinInterval")])]),r("li",[r("a",{attrs:{href:"#quartz-jobstore-maxmisfirestohandleatatime"}},[e._v("quartz.jobStore.maxMisfiresToHandleAtATime")])]),r("li",[r("a",{attrs:{href:"#quartz-jobstore-selectwithlocksql"}},[e._v("quartz.jobStore.selectWithLockSQL")])]),r("li",[r("a",{attrs:{href:"#quartz-jobstore-txisolationlevelserializable"}},[e._v("quartz.jobStore.txIsolationLevelSerializable")])]),r("li",[r("a",{attrs:{href:"#quartz-jobstore-acquiretriggerswithinlock"}},[e._v("quartz.jobStore.acquireTriggersWithinLock")])]),r("li",[r("a",{attrs:{href:"#quartz-jobstore-lockhandler-type"}},[e._v("quartz.jobStore.lockHandler.type")])]),r("li",[r("a",{attrs:{href:"#customizing-stdrowlocksemaphore"}},[e._v("Customizing StdRowLockSemaphore")])]),r("li",[r("a",{attrs:{href:"#quartz-jobstore-driverdelegateinitstring"}},[e._v("quartz.jobStore.driverDelegateInitString")])])])]),r("li",[r("a",{attrs:{href:"#datasources-ado-net-jobstores"}},[e._v("DataSources (ADO.NET JobStores)")]),r("ul",[r("li",[r("a",{attrs:{href:"#quartz-datasource-name-provider"}},[e._v("quartz.dataSource.NAME.provider")])]),r("li",[r("a",{attrs:{href:"#quartz-datasource-name-connectionstring"}},[e._v("quartz.dataSource.NAME.connectionString")])]),r("li",[r("a",{attrs:{href:"#quartz-datasource-name-connectionstringname"}},[e._v("quartz.dataSource.NAME.connectionStringName")])]),r("li",[r("a",{attrs:{href:"#quartz-datasource-name-connectionprovider-type"}},[e._v("quartz.dataSource.NAME.connectionProvider.type")])])])]),r("li",[r("a",{attrs:{href:"#clustering"}},[e._v("Clustering")])])])]),r("p"),e._v(" "),r("p",[e._v("By default, "),r("code",[e._v("StdSchedulerFactory")]),e._v(" loads a properties file named "),r("code",[e._v("quartz.config")]),e._v(' from the "current working directory".\nIf that fails, then the '),r("code",[e._v("quartz.config")]),e._v(" file located (as an embedded resource) in the Quartz dll is loaded.\nIf you wish to use a file other than these defaults, you must define the system property "),r("code",[e._v("quartz.properties")]),e._v(" to point to the file you want.")]),e._v(" "),r("p",[e._v("Alternatively, you can explicitly initialize the factory by calling one of the "),r("code",[e._v("Initialize(xx)")]),e._v(" methods before calling "),r("code",[e._v("GetScheduler()")]),e._v(" on the "),r("code",[e._v("StdSchedulerFactory")]),e._v(".")]),e._v(" "),r("p",[e._v("Instances of the specified "),r("code",[e._v("IJobStore")]),e._v(", "),r("code",[e._v("IThreadPool")]),e._v(", and other SPI types will be created by name, and then any additional properties specified for them in the config file will be set on the instance by calling an equivalent property set method.\nFor example if the properties file contains the property "),r("code",[e._v("quartz.jobStore.myProp = 10")]),e._v(" then after the JobStore type has been instantiated, the setter of property "),r("code",[e._v("MyProp")]),e._v(" will be called on it.\nType conversion to primitive types (int, long, float, double, boolean, and string) are performed before calling the property’s setter method.")]),e._v(" "),r("p",[e._v("One property can reference another property’s value by specifying a value following the convention of "),r("code",[e._v("$@other.property.name")]),e._v(", for example, to reference the scheduler’s instance name as the value for some other property, you would use "),r("code",[e._v("$@quartz.scheduler.instanceName")]),e._v(".")]),e._v(" "),r("div",{staticClass:"custom-block tip"},[r("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),r("p",[e._v("You can also use code-based configuration which essentially builds these keys.")])]),e._v(" "),r("h2",{attrs:{id:"main-configuration"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#main-configuration"}},[e._v("#")]),e._v(" Main Configuration")]),e._v(" "),r("p",[e._v('These properties configure the identification of the scheduler, and various other "top level" settings.')]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("Property Name")]),e._v(" "),r("th",[e._v("Required")]),e._v(" "),r("th",[e._v("Type")]),e._v(" "),r("th",[e._v("Default Value")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("quartz.scheduler.instanceName")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("'QuartzScheduler'")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.instanceId")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("'NON_CLUSTERED'")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.instanceIdGenerator.type")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("Quartz.Simpl.SimpleInstanceIdGenerator, Quartz")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.threadName")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("instanceName + '_QuartzSchedulerThread'")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.makeSchedulerThreadDaemon")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("boolean")]),e._v(" "),r("td",[e._v("false")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.idleWaitTime")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("long")]),e._v(" "),r("td",[e._v("30000")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.dbFailureRetryInterval")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("long")]),e._v(" "),r("td",[e._v("15000")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.typeLoadHelper.type")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("Quartz.Simpl.SimpleTypeLoadHelper")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.jobFactory.type")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("Quartz.Simpl.PropertySettingJobFactory")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.context.key.SOME_KEY")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("none")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.wrapJobExecutionInUserTransaction")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("boolean")]),e._v(" "),r("td",[e._v("false")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.batchTriggerAcquisitionMaxCount")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("int")]),e._v(" "),r("td",[e._v("1")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("long")]),e._v(" "),r("td",[e._v("0")])])])]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-instancename"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-instancename"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.instanceName")])]),e._v(" "),r("p",[e._v("Can be any string, and the value has no meaning to the scheduler itself - but rather serves as a mechanism for client code to distinguish schedulers when multiple instances are used within the same program.\nIf you are using the clustering features, you must use the same name for every instance in the cluster that is 'logically' the same scheduler.")]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-instanceid"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-instanceid"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.instanceId")])]),e._v(" "),r("p",[e._v('Can be any string, but must be unique for all schedulers working as if they are the same \'logical\' Scheduler within a cluster.\nYou may use the value "AUTO" as the instanceId if you wish the Id to be generated for you.\nOr the value "SYS_PROP" if you want the value to come from the system property "quartz.scheduler.instanceId".')]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-instanceidgenerator-type"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-instanceidgenerator-type"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.instanceIdGenerator.type")])]),e._v(" "),r("p",[e._v('Only used if quartz.scheduler.instanceId is set to "AUTO". Defaults to "Quartz.Simpl.SimpleInstanceIdGenerator",\nwhich generates an instance id based upon host name and time stamp. Other '),r("code",[e._v("InstanceIdGenerator")]),e._v(" implementations include "),r("code",[e._v("SystemPropertyInstanceIdGenerator")]),e._v('\n(which gets the instance id from the system property "quartz.scheduler.instanceId", and '),r("code",[e._v("HostnameInstanceIdGenerator")]),e._v(" which uses the local host name ("),r("code",[e._v("Dns.GetHostEntry(Dns.GetHostName())")]),e._v(").\nYou can also implement the InstanceIdGenerator interface your self.")]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-threadname"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-threadname"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.threadName")])]),e._v(" "),r("p",[e._v("Can be any string that is a valid name for the main scheduler thread.\nIf this property is not specified, the thread will receive the scheduler’s name (\"quartz.scheduler.instanceName\") plus an the appended string '_QuartzSchedulerThread'.")]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-makeschedulerthreaddaemon"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-makeschedulerthreaddaemon"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.makeSchedulerThreadDaemon")])]),e._v(" "),r("p",[e._v("A boolean value ('true' or 'false') that specifies whether the main thread of the scheduler should be a daemon thread or not.\nSee also the "),r("code",[e._v("quartz.scheduler.makeSchedulerThreadDaemon")]),e._v(" property for tuning the "),r("code",[e._v("DefaultThreadPool")]),e._v(" if that is the thread pool implementation you are using (which is most likely the case).")]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-idlewaittime"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-idlewaittime"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.idleWaitTime")])]),e._v(" "),r("p",[e._v("Is the amount of time in milliseconds that the scheduler will wait before re-queries for available triggers when the scheduler is otherwise idle.\nNormally you should not have to 'tune' this parameter, unless you’re using XA transactions, and are having problems with delayed firings of triggers that should fire immediately.\nValues less than 5000 ms are not recommended as it will cause excessive database querying. Values less than 1000 are not legal.")]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-dbfailureretryinterval"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-dbfailureretryinterval"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.dbFailureRetryInterval")])]),e._v(" "),r("p",[e._v("Is the amount of time in milliseconds that the scheduler will wait between re-tries when it has detected a loss of connectivity within the JobStore (e.g. to the database).\nThis parameter is obviously not very meaningful when using RamJobStore.")]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-typeloadhelper-type"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-typeloadhelper-type"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.typeLoadHelper.type")])]),e._v(" "),r("p",[e._v('Defaults to the most robust approach, which is to use the "Quartz.Simpl.SimpleTypeLoadHelper" type - which just loads by using '),r("code",[e._v("Type.GetType()")]),e._v(".")]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-jobfactory-type"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-jobfactory-type"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.jobFactory.type")])]),e._v(" "),r("p",[e._v("The type name of the IJobFactory to use. A job factory is responsible for producing instances of "),r("code",[e._v("IJob")]),e._v(" implementations.\nThe default is 'Quartz.Simpl.PropertySettingJobFactory', which simply calls "),r("code",[e._v("Activator.CreateInstance")]),e._v(" with given type to produce a new instance each time execution is about to occur.\n"),r("code",[e._v("PropertySettingJobFactory")]),e._v(" also reflectively sets the job’s properties using the contents of the scheduler context and job and trigger JobDataMaps.")]),e._v(" "),r("h3",{attrs:{id:"quartz-context-key-some-key"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-context-key-some-key"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.context.key.SOME_KEY")])]),e._v(" "),r("p",[e._v('Represent a name-value pair that will be placed into the "scheduler context" as strings (see IScheduler.Context).\nSo for example, the setting "quartz.context.key.MyKey = MyValue" would perform the equivalent of '),r("code",[e._v('scheduler.Context.Put("MyKey", "MyValue")')]),e._v(".")]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-batchtriggeracquisitionmaxcount"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-batchtriggeracquisitionmaxcount"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.batchTriggerAcquisitionMaxCount")])]),e._v(" "),r("p",[e._v("The maximum number of triggers that a scheduler node is allowed to acquire (for firing) at once. Default value is 1.\nThe larger the number, the more efficient firing is (in situations where there are very many triggers needing to be fired all at once) -\nbut at the cost of possible imbalanced load between cluster nodes.")]),e._v(" "),r("p",[e._v('If the value of this property is set to > 1, and AdoJobStore is used, then the property "quartz.jobStore.acquireTriggersWithinLock" must be set to "true" to avoid data corruption.')]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-batchtriggeracquisitionfireaheadtimewindow"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-batchtriggeracquisitionfireaheadtimewindow"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow")])]),e._v(" "),r("p",[e._v("The amount of time in milliseconds that a trigger is allowed to be acquired and fired ahead of its scheduled fire time.\nDefaults to 0. The larger the number, the more likely batch acquisition of triggers to fire will be able to select and fire more than 1 trigger at a time -\nat the cost of trigger schedule not being honored precisely (triggers may fire this amount early).")]),e._v(" "),r("p",[e._v("This may be useful (for performance’s sake) in situations where the scheduler has very large numbers of triggers that need to be fired at or near the same time.")]),e._v(" "),r("h2",{attrs:{id:"threadpool"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#threadpool"}},[e._v("#")]),e._v(" ThreadPool")]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("Property Name")]),e._v(" "),r("th",[e._v("Required")]),e._v(" "),r("th",[e._v("Type")]),e._v(" "),r("th",[e._v("Default Value")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("quartz.threadPool.type")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("Quartz.Simpl.DefaultThreadPool")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.threadPool.maxConcurrency")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("int")]),e._v(" "),r("td",[e._v("10")])])])]),e._v(" "),r("h3",{attrs:{id:"quartz-threadpool-type"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-threadpool-type"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.threadPool.type")])]),e._v(" "),r("p",[e._v('Is the name of the ThreadPool implementation you wish to use.\nThe thread pool that ships with Quartz is "Quartz.Simpl.DefaultThreadPool", and should meet the needs of nearly every user.')]),e._v(" "),r("p",[e._v("It has very simple behavior and is very well tested. It dispatches tasks to .NET task queue and ensures that configured max amount of concurrent tasks limit is obeyed.\nYou should study "),r("a",{attrs:{href:"https://docs.microsoft.com/en-us/dotnet/standard/threading/the-managed-thread-pool",target:"_blank",rel:"noopener noreferrer"}},[e._v("CLR's managed thread pool"),r("OutboundLink")],1),e._v(" if you want to fine-tune thread pools on CLR level.")]),e._v(" "),r("h3",{attrs:{id:"quartz-threadpool-maxconcurrency"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-threadpool-maxconcurrency"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.threadPool.maxConcurrency")])]),e._v(" "),r("p",[e._v("This is the number of concurrent tasks that can be dispatched to CLR thread pool.\nIf you only have a few jobs that fire a few times a day, then 1 tasks is plenty!\nIf you have tens of thousands of jobs, with many firing every minute, then you probably want a max concurrency count more like 50 or 100 (this highly depends on the nature of the work that your jobs perform, and your systems resources!).\nAlso note CLR thread pool configuration separate from Quartz itself.")]),e._v(" "),r("h3",{attrs:{id:"custom-threadpools"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#custom-threadpools"}},[e._v("#")]),e._v(" Custom ThreadPools")]),e._v(" "),r("p",[e._v("If you use your own implementation of a thread pool, you can have properties set on it reflectively simply by naming the property as thus:")]),e._v(" "),r("p",[r("strong",[e._v("Setting Properties on a Custom ThreadPool")])]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("quartz.threadPool.type = MyLibrary.FooThreadPool, MyLibrary\nquartz.threadPool.somePropOfFooThreadPool = someValue\n")])])]),r("h2",{attrs:{id:"listeners"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#listeners"}},[e._v("#")]),e._v(" Listeners")]),e._v(" "),r("p",[e._v("Global listeners can be instantiated and configured by "),r("code",[e._v("StdSchedulerFactory")]),e._v(', or your application can do it itself at runtime, and then register the listeners with the scheduler.\n"Global" listeners listen to the events of every job/trigger rather than just the jobs/triggers that directly reference them.')]),e._v(" "),r("p",[e._v("Configuring listeners through the configuration file consists of giving then a name, and then specifying the type name, and any other properties to be set on the instance.\nThe type must have a no-arg constructor, and the properties are set reflectively. Only primitive data type values (including strings) are supported.")]),e._v(" "),r("p",[e._v('Thus, the general pattern for defining a "global" TriggerListener is:')]),e._v(" "),r("p",[r("strong",[e._v("Configuring a Global TriggerListener")])]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("quartz.triggerListener.NAME.type = MyLibrary.MyListenerType, MyLibrary\nquartz.triggerListener.NAME.propName = propValue\nquartz.triggerListener.NAME.prop2Name = prop2Value\n")])])]),r("p",[e._v('And the general pattern for defining a "global" JobListener is:')]),e._v(" "),r("p",[r("strong",[e._v("Configuring a Global JobListener")])]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("quartz.jobListener.NAME.type = MyLibrary.MyListenerType, MyLibrary\nquartz.jobListener.NAME.propName = propValue\nquartz.jobListener.NAME.prop2Name = prop2Value\n")])])]),r("h2",{attrs:{id:"plug-ins"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#plug-ins"}},[e._v("#")]),e._v(" Plug-Ins")]),e._v(" "),r("p",[e._v("Like listeners configuring plugins through the configuration file consists of giving then a name, and then specifying the type name, and any other properties to be set on the instance. The type must have a no-arg constructor, and the properties are set reflectively. Only primitive data type values (including Strings) are supported.")]),e._v(" "),r("p",[e._v("Thus, the general pattern for defining a plug-in is:")]),e._v(" "),r("p",[r("strong",[e._v("Configuring a Plugin")])]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("quartz.plugin.NAME.type = MyLibrary.MyPluginType, MyLibrary\nquartz.plugin.NAME.propName = propValue\nquartz.plugin.NAME.prop2Name = prop2Value\n")])])]),r("p",[e._v("There are several plugins that come with Quartz, that can be found in the "),r("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.Plugins",target:"_blank",rel:"noopener noreferrer"}},[e._v("Quartz.Plugins"),r("OutboundLink")],1),e._v(" package.\nExample of configuring a few of them are as follows:")]),e._v(" "),r("h3",{attrs:{id:"sample-configuration-of-logging-trigger-history-plugin"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#sample-configuration-of-logging-trigger-history-plugin"}},[e._v("#")]),e._v(" Sample configuration of Logging Trigger History Plugin")]),e._v(" "),r("p",[e._v("The logging trigger history plugin catches trigger events (it is also a trigger listener) and logs then with logging infrastructure.")]),e._v(" "),r("p",[r("strong",[e._v("Sample configuration of Logging Trigger History Plugin")])]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("quartz.plugin.triggHistory.type = Quartz.Plugin.History.LoggingTriggerHistoryPlugin, Quartz.Plugins\nquartz.plugin.triggHistory.triggerFiredMessage = Trigger {1}.{0} fired job {6}.{5} at: {4:HH:mm:ss MM/dd/yyyy}\nquartz.plugin.triggHistory.triggerCompleteMessage = Trigger {1}.{0} completed firing job {6}.{5} at {4:HH:mm:ss MM/dd/yyyy} with resulting trigger instruction code: {9}\n")])])]),r("h3",{attrs:{id:"sample-configuration-of-xml-scheduling-data-processor-plugin"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#sample-configuration-of-xml-scheduling-data-processor-plugin"}},[e._v("#")]),e._v(" Sample configuration of XML Scheduling Data Processor Plugin")]),e._v(" "),r("p",[e._v("Job initialization plugin reads a set of jobs and triggers from an XML file, and adds them to the scheduler during initialization. It can also delete exiting data.")]),e._v(" "),r("p",[r("strong",[e._v("Sample configuration of JobInitializationPlugin")])]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("quartz.plugin.jobInitializer.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugins\nquartz.plugin.jobInitializer.fileNames = data/my_job_data.xml\nquartz.plugin.jobInitializer.failOnFileNotFound = true\n")])])]),r("p",[e._v("The XML schema definition for the file can be found "),r("a",{attrs:{href:"https://github.com/quartznet/quartznet/blob/master/src/Quartz/Xml/job_scheduling_data_2_0.xsd",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),r("OutboundLink")],1),e._v(".")]),e._v(" "),r("h3",{attrs:{id:"sample-configuration-of-shutdown-hook-plugin"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#sample-configuration-of-shutdown-hook-plugin"}},[e._v("#")]),e._v(" Sample configuration of Shutdown Hook Plugin")]),e._v(" "),r("p",[e._v("The shutdown-hook plugin catches the event of the CLR terminating, and calls shutdown on the scheduler.")]),e._v(" "),r("p",[r("strong",[e._v("Sample configuration of ShutdownHookPlugin")])]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("quartz.plugin.shutdownhook.type = Quartz.Plugin.Management.ShutdownHookPlugin, Quartz.Plugins\nquartz.plugin.shutdownhook.cleanShutdown = true\n")])])]),r("h3",{attrs:{id:"sample-configuration-of-job-interrupt-monitor-plugin"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#sample-configuration-of-job-interrupt-monitor-plugin"}},[e._v("#")]),e._v(" Sample configuration of Job Interrupt Monitor Plugin")]),e._v(" "),r("p",[e._v('This plugin catches the event of job running for a long time (more than the configured max time) and tells the scheduler to "try" interrupting it if enabled.\nPlugin defaults to signaling interrupt after 5 minutes, but the default van be configured to something different, value is in milliseconds in configuration.')]),e._v(" "),r("p",[r("strong",[e._v("Sample configuration of JobInterruptMonitorPlugin")])]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("quartz.plugin.jobAutoInterrupt.type = Quartz.Plugin.Interrupt.JobInterruptMonitorPlugin, Quartz.Plugins\nquartz.plugin.jobAutoInterrupt.defaultMaxRunTime = 3000000\n")])])]),r("h2",{attrs:{id:"remoting-server-and-client"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#remoting-server-and-client"}},[e._v("#")]),e._v(" Remoting Server and Client")]),e._v(" "),r("div",{staticClass:"custom-block warning"},[r("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),r("p",[e._v("Remoting only works with .NET Full Framework. It's also considered unsafe.")])]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("Property Name")]),e._v(" "),r("th",[e._v("Required")]),e._v(" "),r("th",[e._v("Type")]),e._v(" "),r("th",[e._v("Default Value")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("quartz.scheduler.exporter.type")]),e._v(" "),r("td",[e._v("yes")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td")]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.exporter.port")]),e._v(" "),r("td",[e._v("yes")]),e._v(" "),r("td",[e._v("int")]),e._v(" "),r("td")]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.exporter.bindName")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("'QuartzScheduler'")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.exporter.channelType")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("'tcp'")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.exporter.channelName")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("'http'")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.exporter.typeFilterLevel")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("'Full'")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.scheduler.exporter.rejectRemoteRequests")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("boolean")]),e._v(" "),r("td",[e._v("false")])])])]),e._v(" "),r("p",[e._v("If you want the Quartz Scheduler to export itself via remoting as a server then set the 'quartz.scheduler.exporter.type' to \"Quartz.Simpl.RemotingSchedulerExporter, Quartz\".")]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-exporter-type"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-exporter-type"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.exporter.type")])]),e._v(" "),r("p",[e._v("The type of "),r("code",[e._v("ISchedulerExporter")]),e._v(', currently only "Quartz.Simpl.RemotingSchedulerExporter, Quartz" is supported.')]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-exporter-port"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-exporter-port"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.exporter.port")])]),e._v(" "),r("p",[e._v("The port to listen to.")]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-exporter-bindname"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-exporter-bindname"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.exporter.bindName")])]),e._v(" "),r("p",[e._v("Name to use when binding to remoting infrastructure.")]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-exporter-channeltype"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-exporter-channeltype"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.exporter.channelType")])]),e._v(" "),r("p",[e._v("Either 'tcp' or 'http', TCP is more performant.")]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-exporter-channelname"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-exporter-channelname"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.exporter.channelName")])]),e._v(" "),r("p",[e._v("Channel name to use when binding to remoting infrastructure.")]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-exporter-typefilterlevel"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-exporter-typefilterlevel"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.exporter.typeFilterLevel")])]),e._v(" "),r("p",[r("strong",[e._v("Low")])]),e._v(" "),r("p",[e._v("The low deserialization level for .NET Framework remoting. It supports types associated with basic remoting functionality")]),e._v(" "),r("p",[r("strong",[e._v("Full")])]),e._v(" "),r("p",[e._v("The full deserialization level for .NET Framework remoting. It supports all types that remoting supports in all situations")]),e._v(" "),r("h3",{attrs:{id:"quartz-scheduler-exporter-rejectremoterequests"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-scheduler-exporter-rejectremoterequests"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.scheduler.exporter.rejectRemoteRequests")])]),e._v(" "),r("p",[e._v("A boolean value (true or false) that specifies whether to refuse requests from other computers. Specifying true allows only remoting calls from the local computer.")]),e._v(" "),r("h2",{attrs:{id:"ramjobstore"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#ramjobstore"}},[e._v("#")]),e._v(" RAMJobStore")]),e._v(" "),r("p",[e._v("RAMJobStore is used to store scheduling information (job, triggers and calendars) within memory. RAMJobStore is fast and lightweight, but all scheduling information is lost when the process terminates.")]),e._v(" "),r("p",[e._v("RAMJobStore is selected by setting the "),r("code",[e._v("quartz.jobStore.type")]),e._v(" property as such:")]),e._v(" "),r("p",[r("strong",[e._v("Setting The Scheduler’s JobStore to RAMJobStore")])]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("quartz.jobStore.type = Quartz.Simpl.RAMJobStore, Quartz\n")])])]),r("p",[e._v("RAMJobStore can be tuned with the following properties:")]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("Property Name")]),e._v(" "),r("th",[e._v("Required")]),e._v(" "),r("th",[e._v("Type")]),e._v(" "),r("th",[e._v("Default Value")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("quartz.jobStore.misfireThreshold")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("int")]),e._v(" "),r("td",[e._v("60000")])])])]),e._v(" "),r("h3",{attrs:{id:"quartz-jobstore-misfirethreshold"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-jobstore-misfirethreshold"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.jobStore.misfireThreshold")])]),e._v(" "),r("p",[e._v("The number of milliseconds the scheduler will 'tolerate' a trigger to pass its next-fire-time by, before being considered \"misfired\". The default value (if you don’t make an entry of this property in your configuration) is 60000 (60 seconds).")]),e._v(" "),r("h2",{attrs:{id:"jobstoretx-ado-net"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#jobstoretx-ado-net"}},[e._v("#")]),e._v(" JobStoreTX (ADO.NET)")]),e._v(" "),r("p",[e._v("AdoJobStore is used to store scheduling information (job, triggers and calendars) within a relational database.\nThere are actually two seperate AdoJobStore implementations that you can select between, depending on the transactional behaviour you need.")]),e._v(" "),r("p",[e._v("JobStoreTX manages all transactions itself by calling "),r("code",[e._v("Commit()")]),e._v(" (or "),r("code",[e._v("Rollback()")]),e._v(") on the database connection after every action (such as the addition of a job).\nThis is the job store you should normally be using unless you want to integrate to some transaction-aware framework.")]),e._v(" "),r("p",[e._v("The JobStoreTX is selected by setting the "),r("code",[e._v("quartz.jobStore.type")]),e._v(" property as such:")]),e._v(" "),r("p",[r("strong",[e._v("Setting The Scheduler’s JobStore to JobStoreTX")])]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz\n")])])]),r("p",[e._v("JobStoreTX can be tuned with the following properties:")]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("Property Name")]),e._v(" "),r("th",[e._v("Required")]),e._v(" "),r("th",[e._v("Type")]),e._v(" "),r("th",[e._v("Default Value")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("quartz.jobStore.driverDelegateType")]),e._v(" "),r("td",[e._v("yes")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("null")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.jobStore.dataSource")]),e._v(" "),r("td",[e._v("yes")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("null")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.jobStore.tablePrefix")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v('"QRTZ_"')])]),e._v(" "),r("tr",[r("td",[e._v("quartz.jobStore.useProperties")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("boolean")]),e._v(" "),r("td",[e._v("false")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.jobStore.misfireThreshold")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("int")]),e._v(" "),r("td",[e._v("60000")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.jobStore.clustered")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("boolean")]),e._v(" "),r("td",[e._v("false")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.jobStore.clusterCheckinInterval")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("long")]),e._v(" "),r("td",[e._v("15000")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.jobStore.maxMisfiresToHandleAtATime")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("int")]),e._v(" "),r("td",[e._v("20")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.jobStore.selectWithLockSQL")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v('"SELECT * FROM {0}LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME = ? FOR UPDATE"')])]),e._v(" "),r("tr",[r("td",[e._v("quartz.jobStore.txIsolationLevelSerializable")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("boolean")]),e._v(" "),r("td",[e._v("false")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.jobStore.acquireTriggersWithinLock")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("boolean")]),e._v(" "),r("td",[e._v("false (or true - see doc below)")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.jobStore.lockHandler.type")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("null")])]),e._v(" "),r("tr",[r("td",[e._v("quartz.jobStore.driverDelegateInitString")]),e._v(" "),r("td",[e._v("no")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td",[e._v("null")])])])]),e._v(" "),r("h3",{attrs:{id:"quartz-jobstore-driverdelegatetype"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-jobstore-driverdelegatetype"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.jobStore.driverDelegateType")])]),e._v(" "),r("p",[e._v("Driver delegates understand the particular 'dialects' of varies database systems. Possible built-in choices include:")]),e._v(" "),r("ul",[r("li",[e._v("Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz - default when no specific implementation available")]),e._v(" "),r("li",[e._v("Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz - for Microsoft SQL Server")]),e._v(" "),r("li",[e._v("Quartz.Impl.AdoJobStore.PostgreSQLDelegate, Quartz")]),e._v(" "),r("li",[e._v("Quartz.Impl.AdoJobStore.OracleDelegate, Quartz")]),e._v(" "),r("li",[e._v("Quartz.Impl.AdoJobStore.SQLiteDelegate, Quartz")]),e._v(" "),r("li",[e._v("Quartz.Impl.AdoJobStore.MySQLDelegate, Quartz")])]),e._v(" "),r("h3",{attrs:{id:"quartz-jobstore-datasource"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-jobstore-datasource"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.jobStore.dataSource")])]),e._v(" "),r("p",[e._v("The value of this property must be the name of one the DataSources defined in the configuration properties file.")]),e._v(" "),r("h3",{attrs:{id:"quartz-jobstore-tableprefix"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-jobstore-tableprefix"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.jobStore.tablePrefix")])]),e._v(" "),r("p",[e._v('AdoJobStore’s "table prefix" property is a string equal to the prefix given to Quartz’s tables that were created in your database.\nYou can have multiple sets of Quartz’s tables within the same database if they use different table prefixes.')]),e._v(" "),r("p",[r("strong",[e._v("Including schema name in tablePrefix")])]),e._v(" "),r("p",[e._v("For backing databases that support schemas (such as Microsoft SQL Server), you may use the tablePrefix to include the schema name. i.e. for a schema named "),r("code",[e._v("foo")]),e._v(" the prefix could be set as:")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("[foo].QRTZ_\n")])])]),r("p",[r("strong",[e._v("Note:")]),e._v(" Any database table create scripts that were run with an explicit schema (such as "),r("code",[e._v("dbo")]),e._v("), will need to be modified to reflect this configuration.")]),e._v(" "),r("h3",{attrs:{id:"quartz-jobstore-useproperties"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-jobstore-useproperties"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.jobStore.useProperties")])]),e._v(" "),r("p",[e._v('The "use properties" flag instructs AdoJobStore that all values in JobDataMaps will be strings, and therefore can be stored as name-value pairs, rather than storing more complex objects in their serialized form in the BLOB column.\nThis is can be handy, as you avoid the type versioning issues that can arise from serializing your non-string types into a BLOB.')]),e._v(" "),r("h3",{attrs:{id:"quartz-jobstore-misfirethreshold-2"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-jobstore-misfirethreshold-2"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.jobStore.misfireThreshold")])]),e._v(" "),r("p",[e._v("The number of milliseconds the scheduler will 'tolerate' a trigger to pass its next-fire-time by, before being considered \"misfired\".\nThe default value (if you don’t make an entry of this property in your configuration) is 60000 (60 seconds).")]),e._v(" "),r("h3",{attrs:{id:"quartz-jobstore-clustered"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-jobstore-clustered"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.jobStore.clustered")])]),e._v(" "),r("p",[e._v('Set to "true" in order to turn on clustering features.\nThis property must be set to "true" if you are having multiple instances of Quartz use the same set of database tables… otherwise you will experience havoc.\nSee the configuration docs for clustering for more information.')]),e._v(" "),r("h3",{attrs:{id:"quartz-jobstore-clustercheckininterval"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-jobstore-clustercheckininterval"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.jobStore.clusterCheckinInterval")])]),e._v(" "),r("p",[e._v('Set the frequency (in milliseconds) at which this instance "checks-in"* with the other instances of the cluster. Affects the quickness of detecting failed instances.')]),e._v(" "),r("h3",{attrs:{id:"quartz-jobstore-maxmisfirestohandleatatime"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-jobstore-maxmisfirestohandleatatime"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.jobStore.maxMisfiresToHandleAtATime")])]),e._v(" "),r("p",[e._v("The maximum number of misfired triggers the job store will handle in a given pass.\nHandling many (more than a couple dozen) at once can cause the database tables to be locked long enough that the performance of firing other (not yet misfired) triggers may be hampered.")]),e._v(" "),r("h3",{attrs:{id:"quartz-jobstore-selectwithlocksql"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-jobstore-selectwithlocksql"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.jobStore.selectWithLockSQL")])]),e._v(" "),r("p",[e._v('Must be a SQL string that selects a row in the "LOCKS" table and places a lock on the row. If not set, the default is "SELECT * FROM {0}LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME = ? FOR UPDATE", which works for most databases.\nThe "{0}" is replaced during run-time with the TABLE_PREFIX that you configured above.\nThe "{1}" is replaced with the scheduler’s name.')]),e._v(" "),r("h3",{attrs:{id:"quartz-jobstore-txisolationlevelserializable"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-jobstore-txisolationlevelserializable"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.jobStore.txIsolationLevelSerializable")])]),e._v(" "),r("p",[e._v('A value of "true" tells Quartz (when using JobStoreTX or CMT) to set transction level to serialize on ADO.NET connections.\nThis can be helpful to prevent lock timeouts with some databases under high load, and "long-lasting" transactions.')]),e._v(" "),r("h3",{attrs:{id:"quartz-jobstore-acquiretriggerswithinlock"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-jobstore-acquiretriggerswithinlock"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.jobStore.acquireTriggersWithinLock")])]),e._v(" "),r("p",[e._v('Whether or not the acquisition of next triggers to fire should occur within an explicit database lock.\nThis was once necessary (in previous versions of Quartz) to avoid dead-locks with particular databases, but is no longer considered necessary, hence the default value is "false".')]),e._v(" "),r("p",[e._v('If "quartz.scheduler.batchTriggerAcquisitionMaxCount" is set to > 1, and AdoJobStore is used, then this property must be set to "true" to avoid data corruption\n(as of Quartz 2 "true" is now the default if batchTriggerAcquisitionMaxCount is set > 1).')]),e._v(" "),r("h3",{attrs:{id:"quartz-jobstore-lockhandler-type"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-jobstore-lockhandler-type"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.jobStore.lockHandler.type")])]),e._v(" "),r("p",[e._v("The type name to be used to produce an instance of a "),r("code",[e._v("Quartz.Impl.AdoJobStore.ISemaphore")]),e._v(" to be used for locking control on the job store data.\nThis is an advanced configuration feature, which should not be used by most users.")]),e._v(" "),r("p",[e._v("By default, Quartz will select the most appropriate (pre-bundled) Semaphore implementation to use.")]),e._v(" "),r("h3",{attrs:{id:"customizing-stdrowlocksemaphore"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#customizing-stdrowlocksemaphore"}},[e._v("#")]),e._v(" Customizing StdRowLockSemaphore")]),e._v(" "),r("p",[e._v("If you explicitly choose to use this DB Semaphore, you can customize it further on how frequent to poll for DB locks.")]),e._v(" "),r("p",[r("strong",[e._v("Example of Using a Custom StdRowLockSemaphore Implementation")])]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("quartz.jobStore.lockHandler.type = Quartz.Impl.AdoJobStore.StdRowLockSemaphore\nquartz.jobStore.lockHandler.maxRetry = 7 # Default is 3\nquartz.jobStore.lockHandler.retryPeriod = 3000 # Default is 1000 millis\n")])])]),r("h3",{attrs:{id:"quartz-jobstore-driverdelegateinitstring"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-jobstore-driverdelegateinitstring"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.jobStore.driverDelegateInitString")])]),e._v(" "),r("p",[e._v("A pipe-delimited list of properties (and their values) that can be passed to the DriverDelegate during initialization time.")]),e._v(" "),r("p",[e._v("The format of the string is as such:")]),e._v(" "),r("p",[r("code",[e._v("settingName=settingValue|otherSettingName=otherSettingValue|...")])]),e._v(" "),r("p",[e._v("The StdAdoDelegate and all of its descendants (all delegates that ship with Quartz) support a property called 'triggerPersistenceDelegateTypes' which can be set to a comma-separated list of types that implement the "),r("code",[e._v("ITriggerPersistenceDelegate")]),e._v(" interface for storing custom trigger types.\nSee the implementations "),r("code",[e._v("SimplePropertiesTriggerPersistenceDelegateSupport")]),e._v(" and "),r("code",[e._v("SimplePropertiesTriggerPersistenceDelegateSupport")]),e._v(" for examples of writing a persistence delegate for a custom trigger.")]),e._v(" "),r("h2",{attrs:{id:"datasources-ado-net-jobstores"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#datasources-ado-net-jobstores"}},[e._v("#")]),e._v(" DataSources (ADO.NET JobStores)")]),e._v(" "),r("p",[e._v("If you’re using AdoJobstore, you’ll be needing a DataSource for its use (or two DataSources, if you’re using JobStoreCMT).")]),e._v(" "),r("p",[e._v('Each DataSource you define (typically one or two) must be given a name, and the properties you define for each must contain that name, as shown below. The DataSource’s "NAME" can be anything you want, and has no meaning other than being able to identify it when it is assigned to the AdoJobStore.')]),e._v(" "),r("p",[e._v("Quartz-created DataSources are defined with the following properties:")]),e._v(" "),r("table",[r("thead",[r("tr",[r("th",[e._v("Property Name")]),e._v(" "),r("th",[e._v("Required")]),e._v(" "),r("th",[e._v("Type")]),e._v(" "),r("th",[e._v("Default Value")])])]),e._v(" "),r("tbody",[r("tr",[r("td",[e._v("quartz.dataSource.NAME.provider")]),e._v(" "),r("td",[e._v("yes")]),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td")]),e._v(" "),r("tr",[r("td",[e._v("quartz.dataSource.NAME.connectionString")]),e._v(" "),r("td"),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td")]),e._v(" "),r("tr",[r("td",[e._v("quartz.dataSource.NAME.connectionStringName")]),e._v(" "),r("td"),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td")]),e._v(" "),r("tr",[r("td",[e._v("quartz.dataSource.NAME.connectionProvider.type")]),e._v(" "),r("td"),e._v(" "),r("td",[e._v("string")]),e._v(" "),r("td")])])]),e._v(" "),r("h3",{attrs:{id:"quartz-datasource-name-provider"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-datasource-name-provider"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.dataSource.NAME.provider")])]),e._v(" "),r("p",[e._v("Currently following database providers are supported:")]),e._v(" "),r("ul",[r("li",[r("code",[e._v("SqlServer")]),e._v(" - Microsoft SQL Server")]),e._v(" "),r("li",[r("code",[e._v("OracleODP")]),e._v(" - Oracle's Oracle Driver")]),e._v(" "),r("li",[r("code",[e._v("OracleODPManaged")]),e._v(" - Oracle's managed driver for Oracle 11")]),e._v(" "),r("li",[r("code",[e._v("MySql")]),e._v(" - MySQL Connector/.NET")]),e._v(" "),r("li",[r("code",[e._v("SQLite")]),e._v(" - SQLite ADO.NET Provider")]),e._v(" "),r("li",[r("code",[e._v("SQLite-Microsoft")]),e._v(" - Microsoft SQLite ADO.NET Provider")]),e._v(" "),r("li",[r("code",[e._v("Firebird")]),e._v(" - Firebird ADO.NET Provider")]),e._v(" "),r("li",[r("code",[e._v("Npgsql")]),e._v(" - PostgreSQL Npgsql")])]),e._v(" "),r("h3",{attrs:{id:"quartz-datasource-name-connectionstring"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-datasource-name-connectionstring"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.dataSource.NAME.connectionString")])]),e._v(" "),r("p",[e._v("ADO.NET connection string to use. You can skip this if you are using connectionStringName below.")]),e._v(" "),r("h3",{attrs:{id:"quartz-datasource-name-connectionstringname"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-datasource-name-connectionstringname"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.dataSource.NAME.connectionStringName")])]),e._v(" "),r("p",[e._v("Connection string name to use. Defined either in app.config or appsettings.json.")]),e._v(" "),r("h3",{attrs:{id:"quartz-datasource-name-connectionprovider-type"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-datasource-name-connectionprovider-type"}},[e._v("#")]),e._v(" "),r("code",[e._v("quartz.dataSource.NAME.connectionProvider.type")])]),e._v(" "),r("p",[e._v("Allows you to define a custom connection provider implementing IDbProvider interface.")]),e._v(" "),r("p",[r("strong",[e._v("Example of a Quartz-defined DataSource")])]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("quartz.dataSource.myDS.provider = SqlServer\nquartz.dataSource.myDS.connectionString = Server=localhost;Database=quartznet;User Id=quartznet;Password=quartznet;\n")])])]),r("h2",{attrs:{id:"clustering"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#clustering"}},[e._v("#")]),e._v(" Clustering")]),e._v(" "),r("p",[e._v("Quartz’s clustering features bring both high availability and scalability to your scheduler via fail-over and load balancing functionality.")]),e._v(" "),r("p",[e._v("Clustering currently only works with the AdoJobstore ("),r("code",[e._v("JobStoreTX")]),e._v(" or "),r("code",[e._v("JobStoreCMT")]),e._v("), and essentially works by having each node of the cluster share the same database.")]),e._v(" "),r("p",[e._v("Load-balancing occurs automatically, with each node of the cluster firing jobs as quickly as it can. When a trigger’s firing time occurs, the first node to acquire it (by placing a lock on it) is the node that will fire it.")]),e._v(" "),r("p",[e._v("Only one node will fire the job for each firing.\nWhat I mean by that is, if the job has a repeating trigger that tells it to fire every 10 seconds, then at 12:00:00 exactly one node will run the job, and at 12:00:10 exactly one node will run the job, etc.\nIt won’t necessarily be the same node each time - it will more or less be random which node runs it.\nThe load balancing mechanism is near-random for busy schedulers (lots of triggers) but favors the same node for non-busy (e.g. few triggers) schedulers.")]),e._v(" "),r("p",[e._v('Fail-over occurs when one of the nodes fails while in the midst of executing one or more jobs. When a node fails, the other nodes detect the condition and identify the jobs in the database that were in progress within the failed node.\nAny jobs marked for recovery (with the "requests recovery" property on the JobDetail) will be re-executed by the remaining nodes. Jobs not marked for recovery will simply be freed up for execution at the next time a related trigger fires.')]),e._v(" "),r("p",[e._v("The clustering feature works best for scaling out long-running and/or cpu-intensive jobs (distributing the work-load over multiple nodes).\nIf you need to scale out to support thousands of short-running (e.g 1 second) jobs, consider partitioning the set of jobs by using multiple distinct schedulers (including multiple clustered schedulers for HA).\nThe scheduler makes use of a cluster-wide lock, a pattern that degrades performance as you add more nodes (when going beyond about three nodes - depending upon your database’s capabilities, etc.).")]),e._v(" "),r("p",[e._v("Enable clustering by setting the "),r("code",[e._v("quartz.jobStore.clustered")]),e._v(' property to "true". Each instance in the cluster should use the same copy of the quartz.properties file.\nExceptions of this would be to use properties files that are identical, with the following allowable exceptions: Different thread pool size, and different value for the '),r("code",[e._v("quartz.scheduler.instanceId")]),e._v(' property.\nEach node in the cluster MUST have a unique instanceId, which is easily done (without needing different properties files) by placing "AUTO" as the value of this property.\nSee the info about the configuration properties of AdoJobStore for more information.')]),e._v(" "),r("div",{staticClass:"custom-block danger"},[r("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),r("p",[e._v("Never run clustering on separate machines, unless their clocks are synchronized using some form of time-sync service (daemon) that runs very regularly (the clocks must be within a second of each other).\nSee "),r("a",{attrs:{href:"https://www.nist.gov/pml/time-and-frequency-division/services/internet-time-service-its",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://www.nist.gov/pml/time-and-frequency-division/services/internet-time-service-its"),r("OutboundLink")],1),e._v(" if you are unfamiliar with how to do this.")])]),e._v(" "),r("div",{staticClass:"custom-block danger"},[r("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),r("p",[e._v("Never start ("),r("code",[e._v("scheduler.Start()")]),e._v(") a non-clustered instance against the same set of database tables that any other instance is running ("),r("code",[e._v("Start()")]),e._v("ed) against.\nYou may get serious data corruption, and will definitely experience erratic behavior.")])]),e._v(" "),r("div",{staticClass:"custom-block danger"},[r("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),r("p",[e._v("Monitor and ensure that your nodes have enough CPU resources to complete jobs.\nWhen some nodes are in 100% CPU, they may be unable to update the job store and other nodes can consider these jobs lost and recover them by re-running.")])]),e._v(" "),r("p",[r("strong",[e._v("Example Properties For A Clustered Scheduler")])]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("#============================================================================\n# Configure Main Scheduler Properties\n#============================================================================\n\nquartz.scheduler.instanceName = MyClusteredScheduler\nquartz.scheduler.instanceId = AUTO\n\n#============================================================================\n# Configure ThreadPool\n#============================================================================\n\nquartz.threadPool.type = Quartz.Simpl.DefaultThreadPool, Quartz\nquartz.threadPool.threadCount = 25\nquartz.threadPool.threadPriority = 5\n\n#============================================================================\n# Configure JobStore\n#============================================================================\n\nquartz.jobStore.misfireThreshold = 60000\n\nquartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX\nquartz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.SqlServerDelegate\nquartz.jobStore.useProperties = true\nquartz.jobStore.dataSource = myDS\nquartz.jobStore.tablePrefix = QRTZ_\n\nquartz.jobStore.clustered = true\nquartz.jobStore.clusterCheckinInterval = 20000\n\n#============================================================================\n# Configure Datasources\n#============================================================================\n\nquartz.dataSource.myDS.provider = SqlServer\nquartz.dataSource.myDS.connectionString = Server=localhost;Database=quartznet;User Id=quartznet;Password=quartznet;\n")])])])])}),[],!1,null,null,null);t.default=o.exports}}]);
\ No newline at end of file
diff --git a/assets/js/102.d099ddb5.js b/assets/js/102.d099ddb5.js
new file mode 100644
index 000000000..ae98dba91
--- /dev/null
+++ b/assets/js/102.d099ddb5.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[102],{476:function(t,a,e){"use strict";e.r(a);var s=e(26),r=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[e("em",[t._v("This document outlines changes needed per version upgrade basis. You need to check the steps for each version you are jumping over. You should also check "),e("a",{attrs:{href:"https://raw.github.com/quartznet/quartznet/master/changelog.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("the complete change log"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If you are a new user starting with the latest version, you don't need to follow this guide. Just jump right to "),e("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/index.html"}},[t._v("the tutorial")])],1)]),t._v(" "),e("p",[t._v("Quartz jumped to async/await world and added support for .NET Core with 3.0 release so most significant changes\ncan be found on APIs and functionality available depending on whether you target full .NET Framework or the .NET Core.")]),t._v(" "),e("h2",{attrs:{id:"packaging-changes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#packaging-changes"}},[t._v("#")]),t._v(" Packaging changes")]),t._v(" "),e("p",[t._v("Quartz NuGet package was split to more specific packages.")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.Jobs",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quartz.Jobs"),e("OutboundLink")],1),t._v(" is now a separate NuGet dependency you might need\n"),e("ul",[e("li",[t._v("DirectoryScanJob")]),t._v(" "),e("li",[t._v("FileScanJob")]),t._v(" "),e("li",[t._v("NativeJob")]),t._v(" "),e("li",[t._v("SendMailJob")])])]),t._v(" "),e("li",[e("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.Plugins",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quartz.Plugins"),e("OutboundLink")],1),t._v(" is now a separate NuGet dependency you might need\n"),e("ul",[e("li",[t._v("XMLSchedulingDataProcessorPlugin")])])])]),t._v(" "),e("p",[t._v("Check that you reference the required NuGet packages and that your configuration references also the correct assembly.")]),t._v(" "),e("h3",{attrs:{id:"database-schema-changes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#database-schema-changes"}},[t._v("#")]),t._v(" Database schema changes")]),t._v(" "),e("p",[t._v("2.6 schema should work with 3.0 with no changes.")]),t._v(" "),e("h3",{attrs:{id:"migrating-holidaycalendar-binary-format"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#migrating-holidaycalendar-binary-format"}},[t._v("#")]),t._v(" Migrating HolidayCalendar binary format")]),t._v(" "),e("p",[t._v("If you have "),e("code",[t._v("HolidayCalendar")]),t._v("s stored in database in binary format (just stored with AdoJobStore). You need to first load them with Quartz 2.4 or later 2.x version and then re-store them.\nThis will make the serialization use format that is not dependant on precense of C5 library.")]),t._v(" "),e("h3",{attrs:{id:"thread-pool-changes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#thread-pool-changes"}},[t._v("#")]),t._v(" Thread pool changes")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("SimpleThreadPool")]),t._v(" was removed altogether and it's now a synonym for "),e("code",[t._v("DefaultThreadPool")])]),t._v(" "),e("li",[t._v("Jobs are now ran in CLR thread pool")]),t._v(" "),e("li",[e("code",[t._v("ThreadCount")]),t._v(" parameter still limits how many items will be queued at most to CLR thread pool")]),t._v(" "),e("li",[t._v("Thread priority is no longer supported, you need to remove "),e("code",[t._v("threadPriority")]),t._v(" parameter")])]),t._v(" "),e("h3",{attrs:{id:"api-changes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#api-changes"}},[t._v("#")]),t._v(" API Changes")]),t._v(" "),e("p",[t._v("Scheduler and job API methods now are based on Tasks. This reflects how you define your jobs and operate with scheduler.")]),t._v(" "),e("h4",{attrs:{id:"scheduler"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#scheduler"}},[t._v("#")]),t._v(" Scheduler")]),t._v(" "),e("p",[t._v("You now need to make sure that you have proper awaits in place when you operate with the scheduler:")]),t._v(" "),e("div",{staticClass:"language-csharp extra-class"},[e("pre",{pre:!0,attrs:{class:"language-csharp"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// operating with scheduler is now Task-based and requires appropriate awaits")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" scheduler"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" trigger"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" scheduler"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Start")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" scheduler"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Shutdown")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token named-parameter punctuation"}},[t._v("waitForJobsToComplete")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h4",{attrs:{id:"jobs"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#jobs"}},[t._v("#")]),t._v(" Jobs")]),t._v(" "),e("p",[t._v("Job's Execute method now returns a Task and can easily contain async code:")]),t._v(" "),e("div",{staticClass:"language-csharp extra-class"},[e("pre",{pre:!0,attrs:{class:"language-csharp"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Jobs now return tasks from their Execute methods")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyJob")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token type-list"}},[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// dummy 1ms sleep")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" Task"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Delay")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("If you don't have any async'ness in your job, you can just return "),e("code",[t._v("Task.CompletedTask")]),t._v(" at the end of Execute method (available from .NET 4.6 onwards).")]),t._v(" "),e("h5",{attrs:{id:"iinterruptablejob"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#iinterruptablejob"}},[t._v("#")]),t._v(" IInterruptableJob")]),t._v(" "),e("p",[e("code",[t._v("IInterruptableJob")]),t._v(" interface has been removed. You need to check for "),e("code",[t._v("IJobExecutionContext")]),t._v("'s"),e("code",[t._v("CancellationToken.IsCancellationRequested")]),t._v(" to determine whether job interruption has been requested.")]),t._v(" "),e("h5",{attrs:{id:"istatefuljob"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#istatefuljob"}},[t._v("#")]),t._v(" IStatefulJob")]),t._v(" "),e("p",[e("code",[t._v("IStatefulJob")]),t._v(" interface that was obsoleted in 2.x has been removed, you should use "),e("code",[t._v("DisallowConcurrentExecution")]),t._v(" and "),e("code",[t._v("PersistJobDataAfterExecution")]),t._v(" attributes to achieve your goal.")]),t._v(" "),e("h4",{attrs:{id:"other-apis"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#other-apis"}},[t._v("#")]),t._v(" Other APIs")]),t._v(" "),e("p",[t._v("If you have created custom implementations of services used by Quartz, you're going to need to adapt your code to be async-based.")]),t._v(" "),e("h3",{attrs:{id:"job-store-serialization-configuration-changes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#job-store-serialization-configuration-changes"}},[t._v("#")]),t._v(" Job store serialization configuration changes")]),t._v(" "),e("p",[t._v("You need to now explicitly state whether you want to use binary or json serialization if you are using persistent job store (AdoJobStore) when you configure your scheduler.")]),t._v(" "),e("ul",[e("li",[t._v("For existing setups you should use the old binary serialization to ensure things work like before (see "),e("RouterLink",{attrs:{to:"/documentation/quartz-3.x/packages/json-serialization.html"}},[t._v("Quartz.Serialization.Json documentation")]),t._v(" for migration path)")],1),t._v(" "),e("li",[t._v("For new projects the JSON serialization is recommended as it should be marginally faster and more robust as it's not dealing with binary versioning issues")]),t._v(" "),e("li",[t._v("JSON is more secure and generally the way to use moving forward")])]),t._v(" "),e("p",[t._v("If you choose to go with JSON serialization, remember to add NuGet package reference "),e("strong",[e("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.Serialization.Json/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quartz.Serialization.Json"),e("OutboundLink")],1)]),t._v(" to your project.")]),t._v(" "),e("p",[t._v("Configuring binary serialization strategy:")]),t._v(" "),e("div",{staticClass:"language-csharp extra-class"},[e("pre",{pre:!0,attrs:{class:"language-csharp"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" properties "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("NameValueCollection")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"quartz.jobStore.type"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "binary" is alias for "Quartz.Simpl.BinaryObjectSerializer, Quartz" ')]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"quartz.serializer.type"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"binary"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ISchedulerFactory")]),t._v(" sf "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("StdSchedulerFactory")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("properties"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("Configuring JSON serialization strategy (recommended):")]),t._v(" "),e("div",{staticClass:"language-csharp extra-class"},[e("pre",{pre:!0,attrs:{class:"language-csharp"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" properties "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("NameValueCollection")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"quartz.jobStore.type"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "json" is alias for "Quartz.Simpl.JsonObjectSerializer, Quartz.Serialization.Json" ')]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"quartz.serializer.type"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"json"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ISchedulerFactory")]),t._v(" sf "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("StdSchedulerFactory")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("properties"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h2",{attrs:{id:"simplified-job-store-provider-names"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#simplified-job-store-provider-names"}},[t._v("#")]),t._v(" Simplified job store provider names")]),t._v(" "),e("p",[t._v("ADO.NET provider names have been simplified, the provider names are without version, e.g. "),e("code",[t._v("SqlServer-20")]),t._v(" => "),e("code",[t._v("SqlServer")]),t._v(". They are now bound to whatever version that can be loaded.")]),t._v(" "),e("h3",{attrs:{id:"c5-collections"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#c5-collections"}},[t._v("#")]),t._v(" C5 Collections")]),t._v(" "),e("p",[t._v("C5 Collections are no longer ILMerged inside Quartz, .NET 4.5 offers the needed collections.")]),t._v(" "),e("h3",{attrs:{id:"logging"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#logging"}},[t._v("#")]),t._v(" Logging")]),t._v(" "),e("p",[t._v("Common.Logging has been replaced with "),e("a",{attrs:{href:"https://github.com/damianh/LibLog",target:"_blank",rel:"noopener noreferrer"}},[t._v("LibLog"),e("OutboundLink")],1),t._v(" to reduce dependencies to none. LibLog should automatically detect your logging framework of choice if it's supported.")]),t._v(" "),e("h3",{attrs:{id:"remoting"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#remoting"}},[t._v("#")]),t._v(" Remoting")]),t._v(" "),e("p",[t._v("Remoting is currently only supported when running on full framework version.")])])}),[],!1,null,null,null);a.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/103.4cce09e1.js b/assets/js/103.4cce09e1.js
new file mode 100644
index 000000000..65aa368ed
--- /dev/null
+++ b/assets/js/103.4cce09e1.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[103],{477:function(t,s,a){"use strict";a.r(s);var e=a(26),n=Object(e.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[a("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.AspNetCore",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quartz.AspNetCore"),a("OutboundLink")],1),t._v("\nprovides integration with "),a("a",{attrs:{href:"https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services",target:"_blank",rel:"noopener noreferrer"}},[t._v("ASP.NET Core hosted services"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("If you only need the generic host, "),a("a",{attrs:{href:"hosted-services-integration"}},[t._v("generic host integration")]),t._v(" might suffice.")])]),t._v(" "),a("h2",{attrs:{id:"installation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),a("p",[t._v("You need to add NuGet package reference to your project which uses Quartz.")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[t._v("Install-Package Quartz.AspNetCore\n")])])]),a("h2",{attrs:{id:"using"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#using"}},[t._v("#")]),t._v(" Using")]),t._v(" "),a("p",[t._v("You can add Quartz configuration by invoking an extension method "),a("code",[t._v("AddQuartzServer")]),t._v(" on "),a("code",[t._v("IServiceCollection")]),t._v(".\nThis will add a hosted quartz server into ASP.NET Core process that will be started and stopped based on applications lifetime.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("See "),a("a",{attrs:{href:"microsoft-di-integration"}},[t._v("Quartz.Extensions.DependencyInjection documentation")]),t._v(" to learn more about configuring Quartz scheduler, jobs and triggers.")])]),t._v(" "),a("p",[a("strong",[t._v("Example Startup.ConfigureServices configuration")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ConfigureServices")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IServiceCollection")]),t._v(" services"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n services"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddQuartz")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("q "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// base quartz scheduler, job and trigger configuration")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// ASP.NET Core hosting")]),t._v("\n services"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddQuartzServer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("options "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// when shutting down we want jobs to complete gracefully")]),t._v("\n options"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("WaitForJobsToComplete "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/104.8a143487.js b/assets/js/104.8a143487.js
new file mode 100644
index 000000000..58b610ca8
--- /dev/null
+++ b/assets/js/104.8a143487.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[104],{478:function(t,s,n){"use strict";n.r(s);var a=n(26),e=Object(a.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[n("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.Extensions.Hosting",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quartz.Extensions.Hosting"),n("OutboundLink")],1),t._v("\nprovides integration with "),n("a",{attrs:{href:"https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services",target:"_blank",rel:"noopener noreferrer"}},[t._v("hosted services"),n("OutboundLink")],1),t._v(".")]),t._v(" "),n("div",{staticClass:"custom-block tip"},[n("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),n("p",[t._v("Quartz 3.2 or later required for Quartz.Extensions.Hosting. You can use package Quartz.AspNetCore with version 3.1.")])]),t._v(" "),n("h2",{attrs:{id:"installation"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),n("p",[t._v("You need to add NuGet package reference to your project which uses Quartz.")]),t._v(" "),n("p",[n("strong",[t._v("Quartz 3.1")])]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",[n("code",[t._v("Install-Package Quartz.AspNetCore \n")])])]),n("p",[n("strong",[t._v("Quartz 3.2 onwards")])]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",[n("code",[t._v("Install-Package Quartz.Extensions.Hosting\n")])])]),n("h2",{attrs:{id:"using"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#using"}},[t._v("#")]),t._v(" Using")]),t._v(" "),n("p",[t._v("You can add Quartz configuration by invoking an extension method "),n("code",[t._v("AddQuartzHostedService")]),t._v(" on "),n("code",[t._v("IServiceCollection")]),t._v(".\nThis will add a hosted quartz server into process that will be started and stopped based on applications lifetime.")]),t._v(" "),n("div",{staticClass:"custom-block tip"},[n("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),n("p",[t._v("See "),n("a",{attrs:{href:"microsoft-di-integration"}},[t._v("Quartz.Extensions.DependencyInjection documentation")]),t._v(" to learn more about configuring Quartz scheduler, jobs and triggers.")])]),t._v(" "),n("p",[n("strong",[t._v("Example program utilizing hosted services configuration")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Program")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token return-type class-name"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Main")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v(" args"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Log"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Logger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("LoggerConfiguration")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Enrich"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("FromLogContext")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("WriteTo"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Console")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("CreateLogger")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("CreateHostBuilder")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("args"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Run")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("IHostBuilder")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("CreateHostBuilder")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v(" args"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n Host"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("CreateDefaultBuilder")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("args"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseSerilog")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ConfigureServices")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("hostContext"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" services"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// see Quartz.Extensions.DependencyInjection documentation about how to configure different configuration aspects")]),t._v("\n services"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddQuartz")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("q "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// your configuration here")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Quartz.Extensions.Hosting hosting")]),t._v("\n services"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddQuartzHostedService")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("options "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// when shutting down we want jobs to complete gracefully")]),t._v("\n options"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("WaitForJobsToComplete "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/105.bbb1e2b5.js b/assets/js/105.bbb1e2b5.js
new file mode 100644
index 000000000..17588ffda
--- /dev/null
+++ b/assets/js/105.bbb1e2b5.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[105],{479:function(t,s,a){"use strict";a.r(s);var n=a(26),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("JSON is recommended persistent format to store data in database for greenfield projects.\nYou should also strongly consider setting useProperties to true to restrict key-values to be strings.")])]),t._v(" "),a("p",[a("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.Serialization.Json",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quartz.Serialization.Json"),a("OutboundLink")],1),t._v(" provides JSON serialization support for job stores using\n"),a("a",{attrs:{href:"https://www.newtonsoft.com/json",target:"_blank",rel:"noopener noreferrer"}},[t._v("Json.NET"),a("OutboundLink")],1),t._v(" to handle the actual serialization process.")]),t._v(" "),a("h2",{attrs:{id:"installation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),a("p",[t._v("You need to add NuGet package reference to your project which uses Quartz.")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[t._v("Install-Package Quartz.Serialization.Json\n")])])]),a("h2",{attrs:{id:"configuring"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuring"}},[t._v("#")]),t._v(" Configuring")]),t._v(" "),a("p",[a("strong",[t._v("Classic property-based configuration")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" properties "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("NameValueCollection")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"quartz.jobStore.type"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// "json" is alias for "Quartz.Simpl.JsonObjectSerializer, Quartz.Serialization.Json" ')]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"quartz.serializer.type"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"json"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ISchedulerFactory")]),t._v(" schedulerFactory "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("StdSchedulerFactory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("properties"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Configuring using scheduler builder")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" config "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" SchedulerBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UsePersistentStore")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("store "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// it's generally recommended to stick with")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// string property keys and values when serializing")]),t._v("\n store"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UseProperties "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n store"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseGenericDatabase")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dbProvider"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" db "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n db"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ConnectionString "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my connection string"')]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n store"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseJsonSerializer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ISchedulerFactory")]),t._v(" schedulerFactory "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h2",{attrs:{id:"migrating-from-binary-serialization"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#migrating-from-binary-serialization"}},[t._v("#")]),t._v(" Migrating from binary serialization")]),t._v(" "),a("p",[t._v("There's now official solution for migration as there can be quirks in every setup, but there's a recipe that can work for you.")]),t._v(" "),a("ul",[a("li",[t._v("Configure custom serializer like "),a("code",[t._v("MigratorSerializer")]),t._v(" below that can read binary serialization format and writes JSON format")]),t._v(" "),a("li",[t._v("Either let system gradually migrate as it's running or create a program which loads and writes back to DB all relevant serialized assets")])]),t._v(" "),a("p",[a("strong",[t._v("Example hybrid serializer")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MigratorSerializer")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token type-list"}},[a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IObjectSerializer")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BinaryObjectSerializer")]),t._v(" binarySerializer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JsonObjectSerializer")]),t._v(" jsonSerializer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("MigratorSerializer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("binarySerializer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("BinaryObjectSerializer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// you might need custom configuration, see sections about customizing")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// in documentation")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("jsonSerializer "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("JsonObjectSerializer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("T")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("DeSerialize")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("T"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v(" data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("where")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("T")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token type-list"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Attempt to deserialize data as JSON")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" result "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("jsonSerializer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("DeSerialize")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("T"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" result"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JsonReaderException")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Presumably, the data was not JSON, we instead use the binary serializer")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("binarySerializer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("DeSerialize")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("T"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Initialize")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("binarySerializer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Initialize")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("jsonSerializer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Initialize")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("byte")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Serialize")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("T"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("T")]),t._v(" obj"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("where")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("T")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token type-list"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("this")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("jsonSerializer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Serialize")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("T"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("obj"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"customizing-json-net"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#customizing-json-net"}},[t._v("#")]),t._v(" Customizing JSON.NET")]),t._v(" "),a("p",[t._v("If you need to customize JSON.NET settings, you need to inherit custom implementation and override "),a("code",[t._v("CreateSerializerSettings")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CustomJsonSerializer")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token type-list"}},[a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JsonObjectSerializer")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("protected")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("override")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("JsonSerializerSettings")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("CreateSerializerSettings")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" settings "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("base")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("CreateSerializerSettings")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n settings"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Converters"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Add")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("MyCustomConverter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" settings"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])])]),a("p",[a("strong",[t._v("And then configure it to use")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[t._v("store"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseSerializer")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("CustomJsonSerializer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or ")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"quartz.serializer.type"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"MyProject.CustomJsonSerializer, MyProject"')]),t._v("\n")])])]),a("h2",{attrs:{id:"customizing-calendar-serialization"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#customizing-calendar-serialization"}},[t._v("#")]),t._v(" Customizing calendar serialization")]),t._v(" "),a("p",[t._v("If you have implemented a custom calendar, you need to implement a "),a("code",[t._v("ICalendarSerializer")]),t._v(" for it.\nThere's a convenience base class "),a("code",[t._v("CalendarSerializer")]),t._v(" that you can use the get strongly-typed experience.")]),t._v(" "),a("p",[a("strong",[t._v("Custom calendar and serializer")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token attribute"}},[a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Serializable")])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CustomCalendar")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token type-list"}},[a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BaseCalendar")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("CustomCalendar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// binary serialization support")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("protected")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("CustomCalendar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SerializationInfo")]),t._v(" info"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StreamingContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("base")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("info"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n SomeCustomProperty "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" info"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("?.")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetBoolean")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SomeCustomProperty"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("??")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("bool")])]),t._v(" SomeCustomProperty "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("set")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// binary serialization support")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("override")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetObjectData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SerializationInfo")]),t._v(" info"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StreamingContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("base")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetObjectData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("info"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n info"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("?.")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddValue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SomeCustomProperty"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" SomeCustomProperty"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// JSON serialization support")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CustomCalendarSerializer")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token type-list"}},[a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CalendarSerializer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("CustomCalendar"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("protected")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("override")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("CustomCalendar")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JObject")]),t._v(" source"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("CustomCalendar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("protected")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("override")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("SerializeFields")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JsonWriter")]),t._v(" writer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CustomCalendar")]),t._v(" calendar"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n writer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WritePropertyName")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SomeCustomProperty"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n writer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteValue")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("calendar"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("SomeCustomProperty"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("protected")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("override")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("DeserializeFields")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("CustomCalendar")]),t._v(" calendar"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JObject")]),t._v(" source"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n calendar"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("SomeCustomProperty "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" source"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"SomeCustomProperty"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Value")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("bool")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Configuring custom calendar serializer")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" config "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" SchedulerBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nconfig"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UsePersistentStore")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("store "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n store"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseJsonSerializer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("json "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n json"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddCalendarSerializer")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("CustomCalendar"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("CustomCalendarSerializer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or just globally which is what above code calls")]),t._v("\nJsonObjectSerializer"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddCalendarSerializer")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("CustomCalendar"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("CustomCalendarSerializer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/106.8db45d2f.js b/assets/js/106.8db45d2f.js
new file mode 100644
index 000000000..0b4c70fdc
--- /dev/null
+++ b/assets/js/106.8db45d2f.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[106],{480:function(t,s,n){"use strict";n.r(s);var a=n(26),e=Object(a.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[n("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.Extensions.DependencyInjection",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quartz.Extensions.DependencyInjection"),n("OutboundLink")],1),t._v("\nprovides integration with "),n("a",{attrs:{href:"https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection",target:"_blank",rel:"noopener noreferrer"}},[t._v("Microsoft Dependency Injection"),n("OutboundLink")],1),t._v(".")]),t._v(" "),n("div",{staticClass:"custom-block tip"},[n("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),n("p",[t._v("Quartz 3.1 or later required.")])]),t._v(" "),n("h2",{attrs:{id:"installation"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),n("p",[t._v("You need to add NuGet package reference to your project which uses Quartz.")]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",[n("code",[t._v("Install-Package Quartz.Extensions.DependencyInjection\n")])])]),n("h2",{attrs:{id:"using"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#using"}},[t._v("#")]),t._v(" Using")]),t._v(" "),n("p",[t._v("You can add Quartz configuration by invoking an extension method "),n("code",[t._v("AddQuartz")]),t._v(" on "),n("code",[t._v("IServiceCollection")]),t._v(".\nThe configuration building wraps various "),n("a",{attrs:{href:"../configuration/reference"}},[t._v("configuration properties")]),t._v(" with strongly-typed API.\nYou can also configure properties using standard .NET Core "),n("code",[t._v("appsettings.json")]),t._v(" inside configuration section "),n("code",[t._v("Quartz")]),t._v(".")]),t._v(" "),n("div",{staticClass:"custom-block tip"},[n("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),n("p",[n("RouterLink",{attrs:{to:"/documentation/quartz-3.x/packages/hosted-services-integration.html"}},[t._v("Quartz.Extensions.Hosting")]),t._v(" allows you to have a background service for your application that handles starting and stopping the scheduler.")],1)]),t._v(" "),n("p",[n("strong",[t._v("Example appsettings.json")])]),t._v(" "),n("div",{staticClass:"language-json extra-class"},[n("pre",{pre:!0,attrs:{class:"language-json"}},[n("code",[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Logging"')]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token property"}},[t._v('"LogLevel"')]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Default"')]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Information"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Microsoft"')]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Warning"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Microsoft.Hosting.Lifetime"')]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Information"')]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Quartz"')]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token property"}},[t._v('"quartz.scheduler.instanceName"')]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Quartz ASP.NET Core Sample Scheduler"')]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),n("h2",{attrs:{id:"di-aware-job-factories"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#di-aware-job-factories"}},[t._v("#")]),t._v(" DI aware job factories")]),t._v(" "),n("p",[t._v("Quartz comes with two built-in alternatives for job factory which can be configured via either calling "),n("code",[t._v("UseMicrosoftDependencyInjectionJobFactory")]),t._v(" or "),n("code",[t._v("UseMicrosoftDependencyInjectionScopedJobFactory")]),t._v(" (deprecated).")]),t._v(" "),n("div",{staticClass:"custom-block tip"},[n("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),n("p",[t._v("As of Quartz.NET 3.3.2 all jobs produced by the default job factory are scoped jobs, you should no longer use "),n("code",[t._v("UseMicrosoftDependencyInjectionScopedJobFactory")]),t._v(".")])]),t._v(" "),n("h3",{attrs:{id:"job-instance-construction"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#job-instance-construction"}},[t._v("#")]),t._v(" Job instance construction")]),t._v(" "),n("p",[t._v("By default Quartz will try to resolve job's type from container and if there's no explicit registration Quartz will use "),n("code",[t._v("ActivatorUtilities")]),t._v(" to construct job and inject it's dependencies\nvia constructor. Job should have only one public constructor.")]),t._v(" "),n("h3",{attrs:{id:"persistent-job-stores"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#persistent-job-stores"}},[t._v("#")]),t._v(" Persistent job stores")]),t._v(" "),n("p",[t._v("The scheduling configuration will be checked against database and updated accordingly every time your application starts and schedule is being evaluated.")]),t._v(" "),n("div",{staticClass:"custom-block warning"},[n("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),n("p",[t._v("When using persistent job store, make sure you define job and trigger names for your scheduling so that existence checks work correctly against\nthe data you already have in your database.")]),t._v(" "),n("p",[t._v("Using API to configure triggers and jobs without explicit job identity configuration will cause jobs and triggers to have different generated name each time configuration is being evaluated.")]),t._v(" "),n("p",[t._v("With persistent job stores it's best practice to always declare at least job and trigger name. Omitting the group for them will produce same default group value for every invocation.")])]),t._v(" "),n("p",[n("strong",[t._v("Example Startup.ConfigureServices configuration")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token return-type class-name"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ConfigureServices")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IServiceCollection")]),t._v(" services"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// base configuration from appsettings.json")]),t._v("\n services"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Configure")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("QuartzOptions"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Configuration"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetSection")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Quartz"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// if you are using persistent job store, you might want to alter some options")]),t._v("\n services"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Configure")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("QuartzOptions"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("options "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n options"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Scheduling"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("IgnoreDuplicates "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// default: false")]),t._v("\n options"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Scheduling"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("OverWriteExistingData "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// default: true")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n services"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddQuartz")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("q "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// handy when part of cluster or you want to otherwise identify multiple schedulers")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("SchedulerId "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Scheduler-Core"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// we take this from appsettings.json, just show it's possible")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// q.SchedulerName = "Quartz ASP.NET Core Sample Scheduler";')]),t._v("\n \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// as of 3.3.2 this also injects scoped services (like EF DbContext) without problems")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseMicrosoftDependencyInjectionJobFactory")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// or for scoped service support like EF Core DbContext")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// q.UseMicrosoftDependencyInjectionScopedJobFactory();")]),t._v("\n \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// these are the defaults")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseSimpleTypeLoader")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseInMemoryStore")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseDefaultThreadPool")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("tp "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n tp"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("MaxConcurrency "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// quickest way to create a job with single trigger is to use ScheduleJob")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// (requires version 3.2)")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ExampleJob"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" trigger\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Combined Configuration Trigger"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("EvenSecondDate")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateTimeOffset"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddSeconds")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithDailyTimeIntervalSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithInterval")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" IntervalUnit"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Second"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithDescription")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my awesome trigger configured for a job with single call"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// you can also configure individual jobs and triggers with code")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this allows you to associated multiple triggers with same job")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// (if you want to have different job data map per trigger for example)")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddJob")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ExampleJob"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" j\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("StoreDurably")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// we need to store durably if no trigger is associated")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithDescription")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my awesome job"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// here's a known job for triggers")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" jobKey "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("JobKey")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"awesome job"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"awesome group"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddJob")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ExampleJob"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jobKey"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" j\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithDescription")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my awesome job"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddTrigger")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("t "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" t\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Simple Trigger"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jobKey"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartNow")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithInterval")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("TimeSpan"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("FromSeconds")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithDescription")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my awesome simple trigger"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddTrigger")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("t "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" t\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Cron Trigger"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jobKey"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("EvenSecondDate")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateTimeOffset"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddSeconds")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithCronSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0/3 * * * * ?"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithDescription")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my awesome cron trigger"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// you can add calendars too (requires version 3.2)")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token class-name"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" calendarName "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myHolidayCalendar"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddCalendar")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("HolidayCalendar"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token named-parameter punctuation"}},[t._v("name")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" calendarName"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token named-parameter punctuation"}},[t._v("replace")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token named-parameter punctuation"}},[t._v("updateTriggers")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddExcludedDate")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("DateTime")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddTrigger")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("t "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" t\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Daily Trigger"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jobKey"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("EvenSecondDate")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateTimeOffset"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddSeconds")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithDailyTimeIntervalSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithInterval")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" IntervalUnit"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Second"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithDescription")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my awesome daily time interval trigger"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ModifiedByCalendar")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("calendarName"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// also add XML configuration and poll it for changes")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseXmlSchedulingConfiguration")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Files "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"~/quartz_jobs.config"')]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ScanInterval "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TimeSpan"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("FromSeconds")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("FailOnFileNotFound "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("FailOnSchedulingError "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// convert time zones using converter that can handle Windows/Linux differences")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseTimeZoneConverter")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// auto-interrupt long-running job")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseJobAutoInterrupt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("options "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this is the default")]),t._v("\n options"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("DefaultMaxRunTime "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TimeSpan"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("FromMinutes")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("SlowJob"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n triggerConfigurator "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" triggerConfigurator\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"slowJobTrigger"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartNow")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInSeconds")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n jobConfigurator "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" jobConfigurator\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"slowJob"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("UsingJobData")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JobInterruptMonitorPlugin"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDataMapKeyAutoInterruptable"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// allow only five seconds for this job, overriding default configuration")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("UsingJobData")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JobInterruptMonitorPlugin"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDataMapKeyMaxRunTime"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" TimeSpan"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("FromSeconds")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("TotalMilliseconds"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToString")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("CultureInfo"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("InvariantCulture"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// add some listeners")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddSchedulerListener")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("SampleSchedulerListener"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddJobListener")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("SampleJobListener"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("GroupMatcher"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("JobKey"),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("GroupEquals")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jobKey"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Group"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n q"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddTriggerListener")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("SampleTriggerListener"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// example of persistent job store using JSON serializer as an example")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v('/*\n q.UsePersistentStore(s =>\n {\n s.UseProperties = true;\n s.RetryInterval = TimeSpan.FromSeconds(15);\n s.UseSqlServer(sqlServer =>\n {\n sqlServer.ConnectionString = "some connection string";\n // this is the default\n sqlServer.TablePrefix = "QRTZ_";\n });\n s.UseJsonSerializer();\n s.UseClustering(c =>\n {\n c.CheckinMisfireThreshold = TimeSpan.FromSeconds(20);\n c.CheckinInterval = TimeSpan.FromSeconds(10);\n });\n });\n */')]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\n\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// we can use options pattern to support hooking your own configuration")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// because we don't use service registration api, ")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// we need to manually ensure the job is present in DI")]),t._v("\n\tservices"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddTransient")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ExampleJob"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t\t\t\n\tservices"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Configure")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("SampleOptions"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Configuration"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetSection")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sample"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\tservices"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddOptions")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("QuartzOptions"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Configure")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("IOptions"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("SampleOptions"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("options"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dep"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("IsNullOrWhiteSpace")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dep"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("CronSchedule"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t\t\t"),n("span",{pre:!0,attrs:{class:"token class-name"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" jobKey "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("JobKey")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options-custom-job"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"custom"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t\t\toptions"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddJob")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ExampleJob"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" j"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jobKey"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t\t\toptions"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddTrigger")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" trigger\n\t\t\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options-custom-trigger"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"custom"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jobKey"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithCronSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dep"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Value"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("CronSchedule"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\t\n\t\t\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Quartz.Extensions.Hosting allows you to fire background service that handles scheduler lifecycle")]),t._v("\n services"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddQuartzHostedService")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("options "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// when shutting down we want jobs to complete gracefully")]),t._v("\n options"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("WaitForJobsToComplete "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/107.7ec33075.js b/assets/js/107.7ec33075.js
new file mode 100644
index 000000000..98b02d4a6
--- /dev/null
+++ b/assets/js/107.7ec33075.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[107],{481:function(t,e,a){"use strict";a.r(e);var n=a(26),s=Object(n.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[a("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.OpenTelemetry.Instrumentation",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quartz.OpenTelemetry.Instrumentation"),a("OutboundLink")],1),t._v("\nprovides integration with "),a("a",{attrs:{href:"https://opentelemetry.io/",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenTelemetry"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("Quartz 3.1 or later required.")])]),t._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("The integration library can still live a bit and thus integration API can have breaking changes and change behavior.")])]),t._v(" "),a("h2",{attrs:{id:"installation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),a("p",[t._v("You need to add NuGet package reference to your project which uses Quartz.")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[t._v("Install-Package Quartz.OpenTelemetry.Instrumentation\n")])])]),a("p",[t._v("It also makes sense to install package for exporter to actually get the results somewhere.")]),t._v(" "),a("h2",{attrs:{id:"using"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#using"}},[t._v("#")]),t._v(" Using")]),t._v(" "),a("p",[t._v("You can add Quartz configuration by invoking an extension method "),a("code",[t._v("AddQuartzInstrumentation")]),t._v(" on "),a("code",[t._v("TracerProviderBuilder")]),t._v(".")]),t._v(" "),a("p",[t._v("In the next example we will integrate with "),a("a",{attrs:{href:"https://www.jaegertracing.io/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Jaeger"),a("OutboundLink")],1),t._v(". We expect that you have also installed dependencies:")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://www.nuget.org/packages/OpenTelemetry.Extensions.Hosting",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenTelemetry.Extensions.Hosting"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://www.nuget.org/packages/OpenTelemetry.Exporter.Jaeger",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenTelemetry.Exporter.Jaeger"),a("OutboundLink")],1)])]),t._v(" "),a("p",[t._v("You can run local Jaeger via docker using:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("$ docker run -d --name jaeger \\\n -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \\\n -p 5775:5775/udp \\\n -p 6831:6831/udp \\\n -p 6832:6832/udp \\\n -p 5778:5778 \\\n -p 16686:16686 \\\n -p 14268:14268 \\\n -p 14250:14250 \\\n -p 9411:9411 \\\n jaegertracing/all-in-one:1.18\n")])])]),a("p",[a("strong",[t._v("Example Startup.ConfigureServices configuration")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ConfigureServices")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IServiceCollection")]),t._v(" services"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// make sure you configure logging and open telemetry before quartz services")]),t._v("\n\n services"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddOpenTelemetry")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("builder "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n builder\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddQuartzInstrumentation")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseJaegerExporter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("o "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n o"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ServiceName "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"My Software Name"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// these are the defaults")]),t._v("\n o"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("AgentHost "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"localhost"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n o"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("AgentPort "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("6831")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/108.428f64db.js b/assets/js/108.428f64db.js
new file mode 100644
index 000000000..da1420884
--- /dev/null
+++ b/assets/js/108.428f64db.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[108],{482:function(t,a,n){"use strict";n.r(a);var e=n(26),s=Object(e.a)({},(function(){var t=this,a=t.$createElement,n=t._self._c||a;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[n("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.OpenTracing",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quartz.OpenTracing"),n("OutboundLink")],1),t._v("\nprovides integration with "),n("a",{attrs:{href:"https://opentracing.io/",target:"_blank",rel:"noopener noreferrer"}},[t._v("OpenTracing"),n("OutboundLink")],1),t._v(". You may also consider\n"),n("RouterLink",{attrs:{to:"/documentation/quartz-3.x/packages/opentelemetry-integration.html"}},[t._v("Quartz.OpenTelemetry.Instrumentation")]),t._v(" package which will supercede OpenTracing and OpenCensus\nwhen OpenTelemetry project reaches maturity.")],1),t._v(" "),n("div",{staticClass:"custom-block tip"},[n("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),n("p",[t._v("Quartz 3.2.3 or later required.")])]),t._v(" "),n("div",{staticClass:"custom-block danger"},[n("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),n("p",[t._v("The integration library can still live a bit and thus integration API can have breaking changes and change behavior.")])]),t._v(" "),n("h2",{attrs:{id:"installation"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),n("p",[t._v("You need to add NuGet package reference to your project which uses Quartz.")]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",[n("code",[t._v("Install-Package Quartz.OpenTracing\n")])])]),n("h2",{attrs:{id:"using"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#using"}},[t._v("#")]),t._v(" Using")]),t._v(" "),n("p",[t._v("You can add Quartz configuration by invoking an extension method "),n("code",[t._v("AddQuartzOpenTracing")]),t._v(" on "),n("code",[t._v("IServiceCollection")]),t._v(".")]),t._v(" "),n("p",[n("strong",[t._v("Example Startup.ConfigureServices configuration")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token return-type class-name"}},[n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ConfigureServices")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IServiceCollection")]),t._v(" services"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// make sure you configure logging and OpenTracing before quartz services")]),t._v("\n services"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddQuartzOpenTracing")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("options "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// these are the defaults")]),t._v("\n options"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ComponentName "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Quartz"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n options"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("IncludeExceptionDetails "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])}),[],!1,null,null,null);a.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/109.60b57a1e.js b/assets/js/109.60b57a1e.js
new file mode 100644
index 000000000..058dbbaec
--- /dev/null
+++ b/assets/js/109.60b57a1e.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[109],{483:function(t,a,e){"use strict";e.r(a);var s=e(26),n=Object(s.a)({},(function(){var t=this,a=t.$createElement,e=t._self._c||a;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[e("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.Jobs",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quartz.Jobs"),e("OutboundLink")],1),t._v(" provides some useful ready-made jobs for your convenience.")]),t._v(" "),e("h2",{attrs:{id:"installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),e("p",[t._v("You need to add NuGet package reference to your project which uses Quartz.")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",[e("code",[t._v("Install-Package Quartz.Jobs\n")])])]),e("h2",{attrs:{id:"features"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#features"}},[t._v("#")]),t._v(" Features")]),t._v(" "),e("h3",{attrs:{id:"directoryscanjob"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#directoryscanjob"}},[t._v("#")]),t._v(" DirectoryScanJob")]),t._v(" "),e("p",[t._v('Inspects a directory and compares whether any files\' "last modified dates" have changed since the last time it was inspected.\nIf one or more files have been updated (or created), the job invokes a "call-back" method on an '),e("code",[t._v("IDirectoryScanListener")]),t._v("that can be found in the "),e("code",[t._v("SchedulerContext")]),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"filescanjob"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#filescanjob"}},[t._v("#")]),t._v(" FileScanJob")]),t._v(" "),e("p",[t._v('Inspects a file and compares whether its "last modified dates" have changed since the last time it was inspected.\nIf one or more files have been updated (or created), the job invokes a "call-back" method on an '),e("code",[t._v("IFileScanListener")]),t._v("that can be found in the "),e("code",[t._v("SchedulerContext")]),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"nativejob"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#nativejob"}},[t._v("#")]),t._v(" NativeJob")]),t._v(" "),e("p",[t._v("Built in job for executing native executables in a separate process.")]),t._v(" "),e("p",[e("strong",[t._v("Example")]),t._v("*")]),t._v(" "),e("div",{staticClass:"language-csharp extra-class"},[e("pre",{pre:!0,attrs:{class:"language-csharp"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" job "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("JobDetail")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dumbJob"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token type-expression class-name"}},[t._v("Quartz"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Jobs"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("NativeJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\njob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDataMap"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Put")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Quartz"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Jobs"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("NativeJob"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("PropertyCommand"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"echo \\"hi\\" >> foobar.txt"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" trigger "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerUtils"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("MakeSecondlyTrigger")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\ntrigger"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Name "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"dumbTrigger"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" scheduler"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" trigger"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("If PropertyWaitForProcess is true, then the integer exit value of the process will be saved as the job execution result in the "),e("code",[t._v("JobExecutionContext")]),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"sendmailjob"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#sendmailjob"}},[t._v("#")]),t._v(" SendMailJob")]),t._v(" "),e("p",[t._v("A Job which sends an e-mail with the configured content to the configured recipient.")])])}),[],!1,null,null,null);a.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/11.e2aadbde.js b/assets/js/11.e2aadbde.js
new file mode 100644
index 000000000..685c10ff6
--- /dev/null
+++ b/assets/js/11.e2aadbde.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{522:function(n,t,e){"use strict";e.r(t);var i=e(26),o=Object(i.a)({},(function(){var n=this.$createElement,t=this._self._c||n;return t("div",[t("router-link",{attrs:{to:"/download"}},[this._v("See download and installation instructions")]),this._v(".\n")],1)}),[],!1,null,null,null);t.default=o.exports}}]);
\ No newline at end of file
diff --git a/assets/js/110.ee5b642d.js b/assets/js/110.ee5b642d.js
new file mode 100644
index 000000000..488118adc
--- /dev/null
+++ b/assets/js/110.ee5b642d.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[110],{484:function(t,n,a){"use strict";a.r(n);var s=a(26),e=Object(s.a)({},(function(){var t=this,n=t.$createElement,a=t._self._c||n;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[a("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.Plugins",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quartz.Plugins"),a("OutboundLink")],1),t._v(" provides some useful ready-mady plugins for your convenience.")]),t._v(" "),a("h2",{attrs:{id:"installation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),a("p",[t._v("You need to add NuGet package reference to your project which uses Quartz.")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[t._v("Install-Package Quartz.Plugins\n")])])]),a("h2",{attrs:{id:"configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),a("p",[t._v("Plugins are configured by using either DI configuration extensions or adding required configuration keys.")]),t._v(" "),a("p",[t._v("Configuration key in in format "),a("code",[t._v("quartz.plgin.{name-to-refer-with}.{property}")]),t._v(".")]),t._v(" "),a("p",[a("RouterLink",{attrs:{to:"/documentation/quartz-3.x/configuration/reference.html#plug-ins"}},[t._v("See configuration reference")]),t._v(" on how to configure each plugin")],1),t._v(" "),a("h2",{attrs:{id:"features"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#features"}},[t._v("#")]),t._v(" Features")]),t._v(" "),a("h3",{attrs:{id:"loggingjobhistoryplugin"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#loggingjobhistoryplugin"}},[t._v("#")]),t._v(" LoggingJobHistoryPlugin")]),t._v(" "),a("p",[t._v("Logs a history of all job executions (and execution vetoes) and writes the entries to configured logging infrastructure.")]),t._v(" "),a("h3",{attrs:{id:"shutdownhookplugin"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#shutdownhookplugin"}},[t._v("#")]),t._v(" ShutdownHookPlugin")]),t._v(" "),a("p",[t._v("This plugin catches the event of the VM terminating (such as upon a CRTL-C) and tells the scheduler to Shutdown.")]),t._v(" "),a("h3",{attrs:{id:"xmlschedulingdataprocessorplugin"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#xmlschedulingdataprocessorplugin"}},[t._v("#")]),t._v(" XMLSchedulingDataProcessorPlugin")]),t._v(" "),a("p",[t._v("This plugin loads XML file(s) to add jobs and schedule them with triggers as the scheduler is initialized, and can optionally periodically scan thefile for changes.")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("The periodically scanning of files for changes is not currently supported in a clustered environment.")])]),t._v(" "),a("h3",{attrs:{id:"jobinterruptmonitorplugin"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#jobinterruptmonitorplugin"}},[t._v("#")]),t._v(" JobInterruptMonitorPlugin")]),t._v(" "),a("p",[t._v('This plugin catches the event of job running for a long time (more than the configured max time) and tells the scheduler to "try" interrupting it if enabled.')]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("Quartz 3.3 or later required.")])]),t._v(" "),a("p",[t._v("Each job configuration needs to have "),a("code",[t._v("JobInterruptMonitorPlugin.JobDataMapKeyAutoInterruptable")]),t._v(" key's value set to true in order for plugin to monitor the execution timeout.\nJobs can also define custom timeout value instead of global default by using key "),a("code",[t._v("JobInterruptMonitorPlugin.JobDataMapKeyMaxRunTime")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" job "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" JobBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("SlowJob"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"slowJob"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UsingJobData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JobInterruptMonitorPlugin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDataMapKeyAutoInterruptable"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// allow only five seconds for this job, overriding default configuration")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UsingJobData")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JobInterruptMonitorPlugin"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDataMapKeyMaxRunTime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" TimeSpan"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("FromSeconds")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("TotalMilliseconds"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("CultureInfo"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("InvariantCulture"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);n.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/111.5ea56c24.js b/assets/js/111.5ea56c24.js
new file mode 100644
index 000000000..2b686c215
--- /dev/null
+++ b/assets/js/111.5ea56c24.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[111],{485:function(t,s,a){"use strict";a.r(s);var e=a(26),n=Object(e.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[a("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.Plugins.TimeZoneConverter",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quartz.Plugins.TimeZoneConverter"),a("OutboundLink")],1),t._v("\nprovides integration with "),a("a",{attrs:{href:"https://github.com/mj1856/TimeZoneConverter",target:"_blank",rel:"noopener noreferrer"}},[t._v("TimeZoneConverter"),a("OutboundLink")],1),t._v(" which helps to bridge between\n*nix and Windows differences.")]),t._v(" "),a("h2",{attrs:{id:"installation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[t._v("#")]),t._v(" Installation")]),t._v(" "),a("p",[t._v("You need to add NuGet package reference to your project which uses Quartz.")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[t._v("Install-Package Quartz.Plugins.TimeZoneConverter\n")])])]),a("h2",{attrs:{id:"using"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#using"}},[t._v("#")]),t._v(" Using")]),t._v(" "),a("p",[a("strong",[t._v("Classic property-based configuration")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" properties "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("NameValueCollection")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"quartz.plugin.timeZoneConverter.type"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Quartz.Plugin.TimeZoneConverter.TimeZoneConverterPlugin, Quartz.Plugins.TimeZoneConverter"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ISchedulerFactory")]),t._v(" schedulerFactory "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("StdSchedulerFactory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("properties"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Configuring using scheduler builder")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" config "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" SchedulerBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseTimeZoneConverter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ISchedulerFactory")]),t._v(" schedulerFactory "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" config"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/112.f9b9113a.js b/assets/js/112.f9b9113a.js
new file mode 100644
index 000000000..2642de176
--- /dev/null
+++ b/assets/js/112.f9b9113a.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[112],{486:function(t,s,a){"use strict";a.r(s);var n=a(26),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[t._v("Welcome to the Quick Start Guide for Quartz.NET. As you read this guide, expect to see details of:")]),t._v(" "),a("ul",[a("li",[t._v("Downloading Quartz.NET")]),t._v(" "),a("li",[t._v("Installing Quartz.NET")]),t._v(" "),a("li",[t._v("Configuring Quartz to your own particular needs")]),t._v(" "),a("li",[t._v("Starting a sample application")])]),t._v(" "),a("h2",{attrs:{id:"download-and-install"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#download-and-install"}},[t._v("#")]),t._v(" Download and Install")]),t._v(" "),a("p",[t._v("You can either download the zip file or use the NuGet package.\nNuGet package contains only the binaries needed to run Quartz.NET, zip file comes with source code, samples and Quartz.NET server sample application.")]),t._v(" "),a("h2",{attrs:{id:"nuget-package"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#nuget-package"}},[t._v("#")]),t._v(" NuGet Package")]),t._v(" "),a("p",[t._v("Couldn't get any simpler than this. Just fire up Visual Studio (with NuGet installed) and add reference to package "),a("strong",[t._v("Quartz")]),t._v(" from package manager extension:")]),t._v(" "),a("ul",[a("li",[t._v("Right-click on your project's References and choose "),a("strong",[t._v("Manage NuGet Packages...")])]),t._v(" "),a("li",[t._v("Choose "),a("strong",[t._v("Online")]),t._v(" category from the left")]),t._v(" "),a("li",[t._v("Enter "),a("strong",[t._v("Quartz")]),t._v(" to the top right search and hit enter")]),t._v(" "),a("li",[t._v("Choose "),a("strong",[t._v("Quartz.NET")]),t._v(" from search results and hit install")]),t._v(" "),a("li",[t._v("Done!")])]),t._v(" "),a("p",[t._v("or from NuGet Command-Line:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[t._v("Install-Package Quartz\n")])])]),a("p",[t._v("If you want to add JSON Serialization, just add the "),a("a",{attrs:{href:"packages/json-serialization"}},[t._v("Quartz.Serialization.Json")]),t._v(" package the same way.")]),t._v(" "),a("h3",{attrs:{id:"zip-archive"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#zip-archive"}},[t._v("#")]),t._v(" Zip Archive")]),t._v(" "),a("p",[a("strong",[t._v("Short version")]),t._v(": Once you've downloaded Quartz.NET, unzip it somewhere, grab the "),a("code",[t._v("Quartz.dll")]),t._v(" from bin directory and start to use it.")]),t._v(" "),a("p",[t._v("Quartz core library does not have any hard binary dependencies. You can opt-in to more dependencies when you choose to use JSON serialization package, which requires JSON.NET.\nYou need to have at least "),a("code",[t._v("Quartz.dll")]),t._v(" beside your app binaries to successfully run Quartz.NET. So just add it as a references to your Visual Studio project that uses them.\nYou can find these dlls from extracted archive from path "),a("strong",[t._v("bin\\your-target-framework-version\\release\\Quartz")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),a("p",[t._v("This is the big bit! Quartz.NET is a very configurable library. There are two main ways (which are not mutually exclusive) to supply Quartz.NET configuration information:")]),t._v(" "),a("h3",{attrs:{id:"fluent-scheduler-builder-api"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#fluent-scheduler-builder-api"}},[t._v("#")]),t._v(" Fluent Scheduler Builder API")]),t._v(" "),a("p",[t._v("You can configure scheduler using C# fluent API, or via providing "),a("code",[t._v("NameValueCollection")]),t._v(" parameter to scheduler factory\nwhich contains configuration keys and values.")]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// you can have base properties")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" properties "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("NameValueCollection")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// and override values via builder")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IScheduler")]),t._v(" scheduler "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" SchedulerBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("properties"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// default max concurrency is 10")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseDefaultThreadPool")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("MaxConcurrency "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this is the default ")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// .WithMisfireThreshold(TimeSpan.FromSeconds(60))")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UsePersistentStore")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// force job data map values to be considered as strings")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prevents nasty surprises if object is accidentally serialized and then ")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// serialization format breaks, defaults to false")]),t._v("\n x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UseProperties "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseClustering")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// there are other SQL providers supported too ")]),t._v("\n x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseSqlServer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my connection string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this requires Quartz.Serialization.Json NuGet package")]),t._v("\n x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseJsonSerializer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// job initialization plugin handles our xml reading, without it defaults are used")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// requires Quartz.Plugins NuGet package")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseXmlSchedulingConfiguration")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Files "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"~/quartz_jobs.xml"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this is the default")]),t._v("\n x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("FailOnFileNotFound "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this is not the default")]),t._v("\n x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("FailOnSchedulingError "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("BuildScheduler")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h3",{attrs:{id:"configuration-files"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuration-files"}},[t._v("#")]),t._v(" Configuration files")]),t._v(" "),a("p",[t._v("Following files are searched for known configuration properties:")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("YourApplication.exe.config")]),t._v(" configuration file using quartz-element (full .NET framework only)")]),t._v(" "),a("li",[a("code",[t._v("appsettings.json")]),t._v(" (.NET Core/NET5 onwards)")]),t._v(" "),a("li",[a("code",[t._v("quartz.config")]),t._v(" file in your application's root directory (works both with .NET Core and full .NET Framework)")])]),t._v(" "),a("p",[t._v("Full documentation of available properties is available in the "),a("a",{attrs:{href:"configuration/reference"}},[t._v("Quartz Configuration Reference")]),t._v(".")]),t._v(" "),a("p",[t._v("To get up and running quickly, a basic quartz.config looks something like this:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[t._v("quartz.scheduler.instanceName = MyScheduler\nquartz.jobStore.type = Quartz.Simpl.RAMJobStore, Quartz\nquartz.threadPool.maxConcurrency = 3\n")])])]),a("p",[t._v("Remember to set the "),a("strong",[t._v("Copy to Output Directory")]),t._v(" on Visual Studio's file property pages to have value "),a("strong",[t._v("Copy always")]),t._v(". Otherwise the config will not be seen if it's not in build directory.")]),t._v(" "),a("p",[t._v("The scheduler created by this configuration has the following characteristics:")]),t._v(" "),a("ul",[a("li",[a("p",[a("code",[t._v("quartz.scheduler.instanceName")]),t._v(' - This scheduler\'s name will be "MyScheduler".')])]),t._v(" "),a("li",[a("p",[a("code",[t._v("quartz.threadPool.maxConcurrency")]),t._v(" - Maximum of 3 jobs can be run simultaneously (default is 10).")])]),t._v(" "),a("li",[a("p",[a("code",[t._v("quartz.jobStore.type")]),t._v(" - All of Quartz's data, such as details of jobs and triggers, is held in memory (rather than in a database).")])]),t._v(" "),a("li",[a("p",[t._v("Even if you have a database and want to use it with Quartz, I suggest you get Quartz working with the RamJobStore before you open up a whole new dimension by working with a database.")])])]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("Actually you don't need to define these properties if you don't want to, Quartz.NET comes with sane defaults")])]),t._v(" "),a("h2",{attrs:{id:"starting-a-sample-application"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#starting-a-sample-application"}},[t._v("#")]),t._v(" Starting a Sample Application")]),t._v(" "),a("p",[t._v("Now you've downloaded and installed Quartz, it's time to get a sample application up and running. The following code obtains an instance of the scheduler, starts it, then shuts it down:")]),t._v(" "),a("p",[a("strong",[t._v("Program.cs")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("System"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Threading"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Tasks")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("Quartz")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("Quartz"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Impl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("namespace")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("QuartzSampleApp")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Program")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Grab the Scheduler instance from the Factory")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StdSchedulerFactory")]),t._v(" factory "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("StdSchedulerFactory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IScheduler")]),t._v(" scheduler "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" factory"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetScheduler")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// and start it off")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// some sleep to show what's happening")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" Task"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Delay")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("TimeSpan"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("FromSeconds")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// and last shut down the scheduler when you are ready to close your program")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Shutdown")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("As of Quartz 3.0 your application will terminate when there's no code left to execute after "),a("code",[t._v("scheduler.Shutdown()")]),t._v(", because there won't be any active threads. You should manually block exiting of application if you want scheduler to keep running also after the Task.Delay and Shutdown has been processed.")]),t._v(" "),a("p",[t._v("Now running the program will not show anything. When 10 seconds have passed the program will just terminate. Lets add some logging to console.")]),t._v(" "),a("h2",{attrs:{id:"adding-logging"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#adding-logging"}},[t._v("#")]),t._v(" Adding logging")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://github.com/damianh/LibLog/wiki",target:"_blank",rel:"noopener noreferrer"}},[t._v("LibLog"),a("OutboundLink")],1),t._v(" can be configured to use different logging frameworks under the hood; namely Log4Net, NLog and Serilog.")]),t._v(" "),a("p",[t._v("When LibLog does not detect any other logging framework to be present, it will be silent. We can configure a custom logger provider that just logs to console show the output\nif you don't have logging framework setup ready yet.")]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[t._v("LogProvider"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("SetCurrentLogProvider")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("ConsoleLogProvider")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsoleLogProvider")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token type-list"}},[a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ILogProvider")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Logger")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetLogger")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("level"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" func"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" exception"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" parameters"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("level "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" LogLevel"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Info "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" func "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Console"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLine")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"["')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" DateTime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Now"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToLongTimeString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"] ["')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" level "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"] "')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("func")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" parameters"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("IDisposable")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("OpenNestedContext")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" message"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throw")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("NotImplementedException")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("IDisposable")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("OpenMappedContext")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("object")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("value")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("bool")])]),t._v(" destructure "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throw")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("NotImplementedException")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("h2",{attrs:{id:"trying-out-the-application-and-adding-jobs"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#trying-out-the-application-and-adding-jobs"}},[t._v("#")]),t._v(" Trying out the application and adding jobs")]),t._v(" "),a("p",[t._v("Now we should get a lot more information when we start the application.")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("[12.51.10] [Info] Quartz.NET properties loaded from configuration file 'C:\\QuartzSampleApp\\quartz.config'\n[12.51.10] [Info] Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl\n[12.51.10] [Info] Quartz Scheduler created\n[12.51.10] [Info] RAMJobStore initialized.\n[12.51.10] [Info] Scheduler meta-data: Quartz Scheduler (v3.0.0.0) 'MyScheduler' with instanceId 'NON_CLUSTERED'\n Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.\n NOT STARTED.\n Currently in standby mode.\n Number of jobs executed: 0\n Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 3 threads.\n Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.\n\n[12.51.10] [Info] Quartz scheduler 'MyScheduler' initialized\n[12.51.10] [Info] Quartz scheduler version: 3.0.0.0\n[12.51.10] [Info] Scheduler MyScheduler_$_NON_CLUSTERED started.\n")])])]),a("p",[t._v("We need a simple test job to test the functionality, lets create HelloJob that outputs greetings to console.")]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HelloJob")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token type-list"}},[a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" Console"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLineAsync")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Greetings from HelloJob!"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("To do something interesting, you need code just after Start() method, before the Task.Delay.")]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define the job and tie it to our HelloJob class")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobDetail")]),t._v(" job "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" JobBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("HelloJob"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"job1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Trigger the job to run now, and then repeat every 10 seconds")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartNow")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInSeconds")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Tell quartz to schedule the job using our trigger")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You could also schedule multiple triggers for the same job with")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// await scheduler.ScheduleJob(job, new List() { trigger1, trigger2 }, replace: true);")]),t._v("\n")])])]),a("p",[t._v("The complete console application will now look like this")]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("System")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("System"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Threading"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Tasks")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("Quartz")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("Quartz"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Impl")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("Quartz"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Logging")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("namespace")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("QuartzSampleApp")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Program")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Main")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v(" args"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n LogProvider"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("SetCurrentLogProvider")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("ConsoleLogProvider")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Grab the Scheduler instance from the Factory")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StdSchedulerFactory")]),t._v(" factory "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("StdSchedulerFactory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IScheduler")]),t._v(" scheduler "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" factory"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetScheduler")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// and start it off")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define the job and tie it to our HelloJob class")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobDetail")]),t._v(" job "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" JobBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("HelloJob"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"job1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Trigger the job to run now, and then repeat every 10 seconds")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartNow")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInSeconds")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Tell quartz to schedule the job using our trigger")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// some sleep to show what's happening")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" Task"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Delay")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("TimeSpan"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("FromSeconds")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("60")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// and last shut down the scheduler when you are ready to close your program")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Shutdown")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n Console"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLine")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Press any key to close the application"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n Console"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReadKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// simple log provider to get something to the console")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ConsoleLogProvider")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token type-list"}},[a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ILogProvider")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Logger")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetLogger")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" name"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("level"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" func"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" exception"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" parameters"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("level "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">=")]),t._v(" LogLevel"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Info "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" func "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Console"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLine")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"["')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" DateTime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Now"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToLongTimeString")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"] ["')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" level "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"] "')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("func")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" parameters"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("IDisposable")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("OpenNestedContext")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" message"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throw")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("NotImplementedException")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("IDisposable")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("OpenMappedContext")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" key"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("object")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("value")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("bool")])]),t._v(" destructure "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("throw")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("NotImplementedException")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HelloJob")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token type-list"}},[a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" Console"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Out"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLineAsync")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Greetings from HelloJob!"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Now go have some fun exploring Quartz.NET! You can continue by reading "),a("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/index.html"}},[t._v("the tutorial")]),t._v(".")],1)])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/113.50eb57e0.js b/assets/js/113.50eb57e0.js
new file mode 100644
index 000000000..701f300cf
--- /dev/null
+++ b/assets/js/113.50eb57e0.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[113],{487:function(t,e,o){"use strict";o.r(e);var r=o(26),s=Object(r.a)({},(function(){var t=this,e=t.$createElement,o=t._self._c||e;return o("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[o("ApplicableVersion"),t._v(" "),o("ul",[o("li",[o("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/using-quartz.html"}},[t._v("Lesson 1: Using Quartz")])],1),t._v(" "),o("li",[o("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/jobs-and-triggers.html"}},[t._v("Lesson 2: Jobs And Triggers")])],1),t._v(" "),o("li",[o("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/more-about-jobs.html"}},[t._v("Lesson 3: More About Jobs & JobDetails")])],1),t._v(" "),o("li",[o("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/more-about-triggers.html"}},[t._v("Lesson 4: More About Triggers")])],1),t._v(" "),o("li",[o("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/simpletriggers.html"}},[t._v("Lesson 5: SimpleTriggers")])],1),t._v(" "),o("li",[o("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/crontriggers.html"}},[t._v("Lesson 6: CronTriggers")])],1),t._v(" "),o("li",[o("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/trigger-and-job-listeners.html"}},[t._v("Lesson 7: TriggerListeners & JobListeners")])],1),t._v(" "),o("li",[o("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/scheduler-listeners.html"}},[t._v("Lesson 8: SchedulerListeners")])],1),t._v(" "),o("li",[o("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/job-stores.html"}},[t._v("Lesson 9: JobStores")])],1),t._v(" "),o("li",[o("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/configuration-resource-usage-and-scheduler-factory.html"}},[t._v("Lesson 10: Configuration, Resource Usage and SchedulerFactory")])],1),t._v(" "),o("li",[o("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/advanced-enterprise-features.html"}},[t._v("Lesson 11: Advanced (Enterprise) Features")])],1),t._v(" "),o("li",[o("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/miscellaneous-features.html"}},[t._v("Lesson 12: Miscellaneous Features")])],1)])],1)}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/114.5a891d47.js b/assets/js/114.5a891d47.js
new file mode 100644
index 000000000..97703901d
--- /dev/null
+++ b/assets/js/114.5a891d47.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[114],{488:function(e,t,s){"use strict";s.r(t);var n=s(26),r=Object(n.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h2",{attrs:{id:"clustering"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#clustering"}},[e._v("#")]),e._v(" Clustering")]),e._v(" "),s("p",[e._v("Clustering currently only works with the AdoJobstore ("),s("code",[e._v("JobStoreTX")]),e._v(').\nFeatures include load-balancing and job fail-over (if the JobDetail\'s "request recovery" flag is set to true).')]),e._v(" "),s("p",[e._v("Enable clustering by setting the "),s("code",[e._v("quartz.jobStore.clustered")]),e._v(' property to "true".\nEach instance in the cluster should use the same copy of the quartz properties.\nExceptions of this would be to use properties that are identical, with the following allowable exceptions:\nDifferent thread pool size, and different value for the '),s("code",[e._v("quartz.scheduler.instanceId")]),e._v(" property.\nEach node in the cluster MUST have a unique instanceId, which is easily done (without needing different properties files) by placing "),s("code",[e._v("AUTO")]),e._v(" as the value of this property.")]),e._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("Never run clustering on separate machines, unless their clocks are synchronized using some form of time-sync service (daemon) that runs very regularly (the clocks must be within a second of each other).\nSee "),s("a",{attrs:{href:"https://www.nist.gov/pml/time-and-frequency-division/services/internet-time-service-its",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://www.nist.gov/pml/time-and-frequency-division/services/internet-time-service-its"),s("OutboundLink")],1),e._v(" if you are unfamiliar with how to do this.")])]),e._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("Never start ("),s("code",[e._v("scheduler.Start()")]),e._v(") a non-clustered instance against the same set of database tables that any other instance is running ("),s("code",[e._v("Start()")]),e._v("ed) against.\nYou may get serious data corruption, and will definitely experience erratic behavior.")])]),e._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),s("p",[e._v("Monitor and ensure that your nodes have enough CPU resources to complete jobs.\nWhen some nodes are in 100% CPU, they may be unable to update the job store and other nodes can consider these jobs lost and recover them by re-running.")])])])}),[],!1,null,null,null);t.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/115.503308f5.js b/assets/js/115.503308f5.js
new file mode 100644
index 000000000..7fe18021c
--- /dev/null
+++ b/assets/js/115.503308f5.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[115],{489:function(t,e,a){"use strict";a.r(e);var o=a(26),n=Object(o.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[t._v('Quartz is architected in modular way, and therefore to get it running, several components need to be "snapped" together.\nFortunately, some helpers exist for making this happen.')]),t._v(" "),a("p",[t._v("The major components that need to be configured before Quartz can do its work are:")]),t._v(" "),a("ul",[a("li",[t._v("ThreadPool")]),t._v(" "),a("li",[t._v("JobStore")]),t._v(" "),a("li",[t._v("DataSources (if necessary)")]),t._v(" "),a("li",[t._v("The Scheduler itself")])]),t._v(" "),a("p",[t._v("Thread pooling has changed a lot since the Task-based jobs were introduced.\nNow the default implementation, "),a("code",[t._v("DefaultThreadPool")]),t._v(" uses "),a("a",{attrs:{href:"https://docs.microsoft.com/en-us/dotnet/standard/threading/the-managed-thread-pool",target:"_blank",rel:"noopener noreferrer"}},[t._v("CLR's managed thread pool"),a("OutboundLink")],1),t._v(" to execute jobs as tasks.\nYou can configure the pool that have max concurrency, which effectively limits how many concurrent tasks can be scheduled to the CLR's thread pool.\nSee configuration reference for more details on how to configure the thread pool implementation.")]),t._v(" "),a("p",[t._v("JobStores and DataSources were discussed in Lesson 9 of this tutorial. Worth noting here, is the fact that all JobStores\nimplement the "),a("code",[t._v("IJobStore")]),t._v(" interface - and that if one of the bundled JobStores does not fit your needs, then you can make your own.")]),t._v(" "),a("p",[t._v("Finally, you need to create your Scheduler instance. The Scheduler itself needs to be given a name and handed\ninstances of a JobStore and ThreadPool.")]),t._v(" "),a("h2",{attrs:{id:"stdschedulerfactory"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#stdschedulerfactory"}},[t._v("#")]),t._v(" StdSchedulerFactory")]),t._v(" "),a("p",[a("code",[t._v("StdSchedulerFactory")]),t._v(" is an implementation of the "),a("code",[t._v("ISchedulerFactory")]),t._v(" interface.\nIt uses a set of properties ("),a("code",[t._v("NameValueCollection")]),t._v(") to create and initialize a Quartz Scheduler.\nThe properties are generally stored in and loaded from a file, but can also be created by your program and handed directly to the factory.\nSimply calling "),a("code",[t._v("GetScheduler()")]),t._v(" on the factory will produce the scheduler, initialize it (and its ThreadPool, JobStore and DataSources),\nand return a handle to its public interface.")]),t._v(" "),a("p",[t._v('You can find complete documentation in the "Configuration Reference" section of the Quartz documentation.')]),t._v(" "),a("h2",{attrs:{id:"directschedulerfactory"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#directschedulerfactory"}},[t._v("#")]),t._v(" DirectSchedulerFactory")]),t._v(" "),a("p",[a("code",[t._v("DirectSchedulerFactory")]),t._v(" is another "),a("code",[t._v("ISchedulerFactory")]),t._v(" implementation. It is useful to those wishing to create their Scheduler\ninstance in a more programmatic way. Its use is generally discouraged for the following reasons:")]),t._v(" "),a("ul",[a("li",[t._v("It requires the user to have a greater understanding of what they're doing, and")]),t._v(" "),a("li",[t._v("it does not allow for declarative configuration - or in other words, you end up hard-coding all of the scheduler's settings.")])]),t._v(" "),a("h2",{attrs:{id:"logging"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#logging"}},[t._v("#")]),t._v(" Logging")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("As of Quartz.NET 3.1, you can configure "),a("a",{attrs:{href:"https://www.nuget.org/packages/Microsoft.Extensions.Logging.Abstractions/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Microsoft.Extensions.Logging.Abstractions"),a("OutboundLink")],1),t._v(" to be used instead of LibLog.")])]),t._v(" "),a("h3",{attrs:{id:"liblog"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#liblog"}},[t._v("#")]),t._v(" LibLog")]),t._v(" "),a("p",[t._v("Quartz.NET uses "),a("a",{attrs:{href:"https://github.com/damianh/LibLog"}},[t._v("LibLog library")]),t._v(' for all of its logging needs.\nQuartz does not produce much logging information - generally just some information during initialization, and\nthen only messages about serious problems while Jobs are executing. In order to "tune" the logging settings\n(such as the amount of output, and where the output goes), you need to actually configure your logging framework of choice as LibLog mostly delegates the work to\nmore full-fledged logging framework like log4net, serilog etc.')]),t._v(" "),a("p",[t._v("Please see "),a("a",{attrs:{href:"https://github.com/damianh/LibLog/wiki"}},[t._v("LibLog Wiki")]),t._v(" for more information.")]),t._v(" "),a("h3",{attrs:{id:"microsoft-extensions-logging-abstractions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#microsoft-extensions-logging-abstractions"}},[t._v("#")]),t._v(" Microsoft.Extensions.Logging.Abstractions")]),t._v(" "),a("p",[t._v("You can configure Microsoft.Extensions.Logging.Abstractions either manually or using services found in "),a("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.Extensions.DependencyInjection",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quartz.Extensions.DependencyInjection"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h4",{attrs:{id:"manual-configuration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#manual-configuration"}},[t._v("#")]),t._v(" Manual configuration")]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// obtain your logger factory, for example from IServiceProvider")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ILoggerFactory")]),t._v(" loggerFactory "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token range operator"}},[t._v("..")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Quartz 3.1")]),t._v("\nQuartz"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("LogContext"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("SetCurrentLogProvider")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("loggerFactory"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Quartz 3.2 onwards")]),t._v("\nQuartz"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Logging"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("LogContext"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("SetCurrentLogProvider")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("loggerFactory"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("h4",{attrs:{id:"configuration-using-microsoft-di-integration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuration-using-microsoft-di-integration"}},[t._v("#")]),t._v(" Configuration using Microsoft DI integration.")]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[t._v("services"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddQuartz")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("q "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this automatically registers the Microsoft Logging")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/116.edf242c3.js b/assets/js/116.edf242c3.js
new file mode 100644
index 000000000..1ae762e77
--- /dev/null
+++ b/assets/js/116.edf242c3.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[116],{490:function(t,e,a){"use strict";a.r(e);var i=a(26),n=Object(i.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),a("p",[t._v("cron is a UNIX tool that has been around for a long time, so its scheduling capabilities are powerful and proven.\nThe CronTrigger class is based on the scheduling capabilities of cron.")]),t._v(" "),a("p",[t._v('CronTrigger uses "cron expressions", which are able to create firing schedules such as: "At 8:00am every Monday through Friday" or "At 1:30am every last Friday of the month".')]),t._v(" "),a("p",[t._v("Cron expressions are powerful, but can be pretty confusing. This tutorial aims to take some of the mystery out of creating a cron expression,\ngiving users a resource which they can visit before having to ask in a forum or mailing list.")]),t._v(" "),a("h2",{attrs:{id:"format"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#format"}},[t._v("#")]),t._v(" Format")]),t._v(" "),a("p",[t._v("A cron expression is a string comprised of 6 or 7 fields separated by white space.\nFields can contain any of the allowed values, along with various combinations of the allowed special characters for that field. The fields are as follows:")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[a("strong",[t._v("Field Name")])]),t._v(" "),a("th",[a("strong",[t._v("Mandatory")])]),t._v(" "),a("th",[a("strong",[t._v("Allowed Values")])]),t._v(" "),a("th",[a("strong",[t._v("Allowed Special Characters")])])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("Seconds")]),t._v(" "),a("td",[t._v("YES")]),t._v(" "),a("td",[t._v("0-59")]),t._v(" "),a("td",[t._v(", - * /")])]),t._v(" "),a("tr",[a("td",[t._v("Minutes")]),t._v(" "),a("td",[t._v("YES")]),t._v(" "),a("td",[t._v("0-59")]),t._v(" "),a("td",[t._v(", - * /")])]),t._v(" "),a("tr",[a("td",[t._v("Hours")]),t._v(" "),a("td",[t._v("YES")]),t._v(" "),a("td",[t._v("0-23")]),t._v(" "),a("td",[t._v(", - * /")])]),t._v(" "),a("tr",[a("td",[t._v("Day of month")]),t._v(" "),a("td",[t._v("YES")]),t._v(" "),a("td",[t._v("1-31")]),t._v(" "),a("td",[t._v(", - * ? / L W")])]),t._v(" "),a("tr",[a("td",[t._v("Month")]),t._v(" "),a("td",[t._v("YES")]),t._v(" "),a("td",[t._v("1-12 or JAN-DEC")]),t._v(" "),a("td",[t._v(", - * /")])]),t._v(" "),a("tr",[a("td",[t._v("Day of week")]),t._v(" "),a("td",[t._v("YES")]),t._v(" "),a("td",[t._v("1-7 or SUN-SAT")]),t._v(" "),a("td",[t._v(", - * ? / L #")])]),t._v(" "),a("tr",[a("td",[t._v("Year")]),t._v(" "),a("td",[t._v("NO")]),t._v(" "),a("td",[t._v("empty, 1970-2099")]),t._v(" "),a("td",[t._v(", - * /")])])])]),t._v(" "),a("p",[t._v("So cron expressions can be as simple as this: "),a("code",[t._v("* * * * ? *")])]),t._v(" "),a("p",[t._v("or more complex, like this: "),a("code",[t._v("0/5 14,18,3-39,52 * ? JAN,MAR,SEP MON-FRI 2002-2010")])]),t._v(" "),a("h2",{attrs:{id:"special-characters"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#special-characters"}},[t._v("#")]),t._v(" Special characters")]),t._v(" "),a("ul",[a("li",[a("code",[t._v("*")]),t._v(' ("all values") - used to select all values within a field. For example, '),a("code",[t._v("*")]),t._v(' in the minute field means "every minute".')]),t._v(" "),a("li",[a("code",[t._v("?")]),t._v(' ("no specific value") - useful when you need to specify something in one of the two fields in which the character is allowed, but not the other.\nFor example, if I want my trigger to fire on a particular day of the month (say, the 10th), but don\'t care what day of the week that happens to be,\nI would put '),a("code",[t._v("10")]),t._v(" in the day-of-month field, and "),a("code",[t._v("?")]),t._v(" in the day-of-week field. See the examples below for clarification.")]),t._v(" "),a("li",[a("code",[t._v("-")]),t._v(" - used to specify ranges. For example, "),a("code",[t._v("10-12")]),t._v(' in the hour field means "the hours 10, 11 and 12".')]),t._v(" "),a("li",[a("code",[t._v(",")]),t._v(" - used to specify additional values. For example, "),a("code",[t._v("MON,WED,FRI")]),t._v(' in the day-of-week field means "the days Monday, Wednesday, and Friday".')]),t._v(" "),a("li",[a("code",[t._v("/")]),t._v(" - used to specify increments. For example, "),a("code",[t._v("0/15")]),t._v(' in the seconds field means "the seconds 0, 15, 30, and 45".\nAnd '),a("code",[t._v("5/15")]),t._v(' in the seconds field means "the seconds 5, 20, 35, and 50".\nYou can also specify '),a("code",[t._v("/")]),t._v(" after the \"character - in this case\" is equivalent to having '0' before the '/'.\n"),a("code",[t._v("1/3")]),t._v(' in the day-of-month field means "fire every 3 days starting on the first day of the month".')]),t._v(" "),a("li",[a("code",[t._v("L")]),t._v(' ("last") - has different meaning in each of the two fields in which it is allowed.\nFor example, the value '),a("code",[t._v("L")]),t._v(' in the day-of-month field means "the last day of the month" - day 31 for January, day 28 for February on non-leap years.\nIf used in the day-of-week field by itself, it simply means "7" or "SAT". But if used in the day-of-week field after another value, it means "the last xxx day of the month" -\nfor example '),a("code",[t._v("6L")]),t._v(' means "the last friday of the month". You can also specify an offset from the last day of the month, such as '),a("code",[t._v("L-3")]),t._v(" which\nwould mean the third-to-last day of the calendar month. When using the "),a("code",[t._v("L")]),t._v(" option, it is important not to specify lists, or ranges of values,\nas you'll get confusing/unexpected results.")]),t._v(" "),a("li",[a("code",[t._v("W")]),t._v(' ("weekday") - used to specify the weekday (Monday-Friday) nearest the given day.\nAs an example, if you were to specify '),a("code",[t._v("15W")]),t._v(' as the value for the day-of-month field, the meaning is: "the nearest weekday to the 15th of the month".\nSo if the 15th is a Saturday, the trigger will fire on Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the 16th. If the 15th is a Tuesday,\nthen it will fire on Tuesday the 15th. However if you specify '),a("code",[t._v("1W")]),t._v(" as the value for day-of-month, and the 1st is a Saturday, the trigger will fire on Monday the 3rd,\nas it will not 'jump' over the boundary of a month's days. The "),a("code",[t._v("W")]),t._v(" character can only be specified when the day-of-month is a single day, not a range or list of days.")])]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("The "),a("code",[t._v("L")]),t._v(" and "),a("code",[t._v("W")]),t._v(" characters can also be combined in the day-of-month field to yield "),a("code",[t._v("LW")]),t._v(', which translates to *"last weekday of the month".')])]),t._v(" "),a("ul",[a("li",[a("code",[t._v("#")]),t._v(' - used to specify "the nth" XXX day of the month. For example, the value of '),a("code",[t._v("6#3")]),t._v(' in the day-of-week field means\n"the third Friday of the month" (day 6 = Friday and "#3" = the 3rd one in the month).\nOther examples: '),a("code",[t._v("2#1")]),t._v(" = the first Monday of the month and "),a("code",[t._v("4#5")]),t._v(" = the fifth Wednesday of the month.\nNote that if you specify "),a("code",[t._v("#5")]),t._v(" and there is not 5 of the given day-of-week in the month, then no firing will occur that month.")])]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("The legal characters and the names of months and days of the week are not case sensitive. MON is the same as mon.")])]),t._v(" "),a("h2",{attrs:{id:"examples"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),a("p",[t._v("Here are some full examples:")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",{staticStyle:{"text-align":"left"}},[a("strong",[t._v("Expression")])]),t._v(" "),a("th",{staticStyle:{"text-align":"left"}},[a("strong",[t._v("Meaning")])])])]),t._v(" "),a("tbody",[a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 0 12 * * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 12pm (noon) every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 ? * *")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 * * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 * * ? *")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 * * ?\t2005")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am every day during the year 2005")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 * 14 * * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire every minute starting at 2pm and ending at 2:59pm, every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 0/5 14 * * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 0/5 14,18 * * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 0-5 14 * * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire every minute starting at 2pm and ending at 2:05pm, every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 10,44 14 ? 3 WED")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 2:10pm and at 2:44pm every Wednesday in the month of March.")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 ? * MON-FRI")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 15 * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am on the 15th day of every month")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 L * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am on the last day of every month")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 L-2 * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am on the 2nd-to-last last day of every month")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 ? * 6L")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am on the last Friday of every month")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 ? * 6L")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am on the last Friday of every month")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 ? * 6L 2002-2005")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 ? * 6#3")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am on the third Friday of every month")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 0 12 1/5 * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 12pm (noon) every 5 days every month, starting on the first day of the month.")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 11 11 11 11 ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire every November 11th at 11:11am.")])])])]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("Pay attention to the effects of '?' and '*' in the day-of-week and day-of-month fields!")])]),t._v(" "),a("h2",{attrs:{id:"notes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#notes"}},[t._v("#")]),t._v(" Notes")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("Support for specifying both a day-of-week and a day-of-month value is not complete (you must currently use the '?' character in one of these fields).")])]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v('Be careful when setting fire times between the hours of the morning when "daylight savings" changes occur in your locale (for US locales, this would typically be the hour before and after 2:00 AM - because the time shift can cause a skip or a repeat depending on whether the time moves back or jumps forward. You may find this wikipedia entry helpful in determining the specifics to your locale:\n'),a("a",{attrs:{href:"https://secure.wikimedia.org/wikipedia/en/wiki/Daylight_saving_time_around_the_world",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://secure.wikimedia.org/wikipedia/en/wiki/Daylight_saving_time_around_the_world"),a("OutboundLink")],1)])])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/117.87d68a22.js b/assets/js/117.87d68a22.js
new file mode 100644
index 000000000..f9080b273
--- /dev/null
+++ b/assets/js/117.87d68a22.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[117],{491:function(t,s,e){"use strict";e.r(s);var n=e(26),a=Object(n.a)({},(function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("p",[t._v("CronTriggers are often more useful than SimpleTrigger, if you need a job-firing schedule that recurs based on calendar-like notions,\nrather than on the exactly specified intervals of SimpleTrigger.")]),t._v(" "),e("p",[t._v('With CronTrigger, you can specify firing-schedules such as "every Friday at noon", or "every weekday and 9:30 am",\nor even "every 5 minutes between 9:00 am and 10:00 am on every Monday, Wednesday and Friday".')]),t._v(" "),e("p",[t._v("Even so, like SimpleTrigger, CronTrigger has a startTime which specifies when the schedule is in force, and an (optional)\nendTime that specifies when the schedule should be discontinued.")]),t._v(" "),e("h3",{attrs:{id:"cron-expressions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cron-expressions"}},[t._v("#")]),t._v(" Cron Expressions")]),t._v(" "),e("p",[e("em",[t._v("Cron-Expressions")]),t._v(" are used to configure instances of CronTrigger. Cron-Expressions are strings that are actually made up\nof seven sub-expressions, that describe individual details of the schedule. These sub-expression are separated with white-space, and represent:")]),t._v(" "),e("ul",[e("li",[e("ol",[e("li",[t._v("Seconds")])])]),t._v(" "),e("li",[e("ol",{attrs:{start:"2"}},[e("li",[t._v("Minutes")])])]),t._v(" "),e("li",[e("ol",{attrs:{start:"3"}},[e("li",[t._v("Hours")])])]),t._v(" "),e("li",[e("ol",{attrs:{start:"4"}},[e("li",[t._v("Day-of-Month")])])]),t._v(" "),e("li",[e("ol",{attrs:{start:"5"}},[e("li",[t._v("Month")])])]),t._v(" "),e("li",[e("ol",{attrs:{start:"6"}},[e("li",[t._v("Day-of-Week")])])]),t._v(" "),e("li",[e("ol",{attrs:{start:"7"}},[e("li",[t._v("Year (optional field)")])])])]),t._v(" "),e("p",[t._v("An example of a complete cron-expression is the string "),e("code",[t._v("0 0 12 ? * WED")]),t._v(' - which means "every Wednesday at 12:00 pm".')]),t._v(" "),e("p",[t._v('Individual sub-expressions can contain ranges and/or lists. For example, the day of week field in the previous (which reads "WED")\nexample could be replaces with "MON-FRI", "MON, WED, FRI", or even "MON-WED,SAT".')]),t._v(" "),e("p",[t._v("Wild-cards (the "),e("code",[t._v("*")]),t._v(' character) can be used to say "every" possible value of this field. Therefore the '),e("code",[t._v("*")]),t._v(' character in the\n"Month" field of the previous example simply means "every month". A '),e("code",[t._v("*")]),t._v(' in the Day-Of-Week field would obviously mean "every day of the week".')]),t._v(" "),e("p",[t._v("All of the fields have a set of valid values that can be specified. These values should be fairly obvious - such as the numbers\n0 to 59 for seconds and minutes, and the values 0 to 23 for hours. Day-of-Month can be any value 0-31, but you need to be careful\nabout how many days are in a given month! Months can be specified as values between 0 and 11, or by using the strings\nJAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC. Days-of-Week can be specified as vaules between 1 and 7 (1 = Sunday)\nor by using the strings SUN, MON, TUE, WED, THU, FRI and SAT.")]),t._v(" "),e("p",[t._v("The '/' character can be used to specify increments to values. For example, if you put '0/15' in the Minutes field, it means 'every 15 minutes,\nstarting at minute zero'. If you used '3/20' in the Minutes field, it would mean 'every 20 minutes during the hour,\nstarting at minute three' - or in other words it is the same as specifying '3,23,43' in the Minutes field.")]),t._v(" "),e("p",[t._v("The '?' character is allowed for the day-of-month and day-of-week fields. It is used to specify \"no specific value\".\nThis is useful when you need to specify something in one of the two fields, but not the other.\nSee the examples below (and CronTrigger API documentation) for clarification.")]),t._v(" "),e("p",[t._v('The \'L\' character is allowed for the day-of-month and day-of-week fields. This character is short-hand for "last",\nbut it has different meaning in each of the two fields. For example, the value "L" in the day-of-month field means\n"the last day of the month" - day 31 for January, day 28 for February on non-leap years. If used in the day-of-week field by itself,\nit simply means "7" or "SAT". But if used in the day-of-week field after another value, it means "the last xxx day of the month" -\nfor example "6L" or "FRIL" both mean "the last friday of the month". When using the \'L\' option, it is important not to specify lists,\nor ranges of values, as you\'ll get confusing results.')]),t._v(" "),e("p",[t._v('The \'W\' is used to specify the weekday (Monday-Friday) nearest the given day. As an example, if you were to specify "15W" as the value for the day-of-month field, the meaning is: "the nearest weekday to the 15th of the month".')]),t._v(" "),e("p",[t._v('The \'#\' is used to specify "the nth" XXX weekday of the month. For example, the value of "6#3" or "FRI#3" in the day-of-week field means "the third Friday of the month".')]),t._v(" "),e("h2",{attrs:{id:"example-cron-expressions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#example-cron-expressions"}},[t._v("#")]),t._v(" Example Cron Expressions")]),t._v(" "),e("p",[t._v("Here are a few more examples of expressions and their meanings - you can find even more in the API documentation for CronTrigger")]),t._v(" "),e("p",[e("strong",[t._v("CronTrigger Example 1 - an expression to create a trigger that simply fires every 5 minutes")])]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",[e("code",[t._v('"0 0/5 * * * ?"\n')])])]),e("p",[e("strong",[t._v("CronTrigger Example 2 - an expression to create a trigger that fires every 5 minutes, at 10 seconds after the minute (i.e. 10:00:10 am, 10:05:10 am, etc.).")])]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",[e("code",[t._v('"10 0/5 * * * ?"\n')])])]),e("p",[e("strong",[t._v("CronTrigger Example 3 - an expression to create a trigger that fires at 10:30, 11:30, 12:30, and 13:30, on every Wednesday and Friday.")])]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",[e("code",[t._v('"0 30 10-13 ? * WED,FRI"\n')])])]),e("p",[e("strong",[t._v("CronTrigger Example 4 - an expression to create a trigger that fires every half hour between the hours of 8 am and 10 am on the 5th and 20th of every month.\nNote that the trigger will NOT fire at 10:00 am, just at 8:00, 8:30, 9:00 and 9:30")])]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",[e("code",[t._v('"0 0/30 8-9 5,20 * ?"\n')])])]),e("p",[t._v('Note that some scheduling requirements are too complicated to express with a single trigger - such as "every 5 minutes between 9:00 am and 10:00 am,\nand every 20 minutes between 1:00 pm and 10:00 pm". The solution in this scenario is to simply create two triggers, and register both of them to run the same job.')]),t._v(" "),e("h2",{attrs:{id:"building-crontriggers"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#building-crontriggers"}},[t._v("#")]),t._v(" Building CronTriggers")]),t._v(" "),e("p",[t._v("CronTrigger instances are built using "),e("code",[t._v("TriggerBuilder")]),t._v(" (for the trigger's main properties) and "),e("code",[t._v("WithCronSchedule")]),t._v("\nextension method (for the CronTrigger-specific properties).")]),t._v(" "),e("p",[t._v("You can also use "),e("code",[t._v("CronScheduleBuilder")]),t._v("'s static methods to create schedules.")]),t._v(" "),e("p",[e("strong",[t._v("Build a trigger that will fire every other minute, between 8am and 5pm, every day:")])]),t._v(" "),e("div",{staticClass:"language-csharp extra-class"},[e("pre",{pre:!0,attrs:{class:"language-csharp"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger3"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithCronSchedule")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0 0/2 8-17 * * ?"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[e("strong",[t._v("Build a trigger that will fire daily at 10:42 am:")])]),t._v(" "),e("div",{staticClass:"language-csharp extra-class"},[e("pre",{pre:!0,attrs:{class:"language-csharp"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// we use CronScheduleBuilder's static helper methods here")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger3"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSchedule")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("CronScheduleBuilder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("DailyAtHourAndMinute")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("42")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("or -")]),t._v(" "),e("div",{staticClass:"language-csharp extra-class"},[e("pre",{pre:!0,attrs:{class:"language-csharp"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger3"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithCronSchedule")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0 42 10 * * ?"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[e("strong",[t._v("Build a trigger that will fire on Wednesdays at 10:42 am, in a TimeZone other than the system's default:")])]),t._v(" "),e("div",{staticClass:"language-csharp extra-class"},[e("pre",{pre:!0,attrs:{class:"language-csharp"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger3"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSchedule")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("CronScheduleBuilder\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("WeeklyOnDayAndHourAndMinute")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DayOfWeek"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Wednesday"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("42")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("InTimeZone")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("TimeZoneInfo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("FindSystemTimeZoneById")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Central America Standard Time"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("or -")]),t._v(" "),e("div",{staticClass:"language-csharp extra-class"},[e("pre",{pre:!0,attrs:{class:"language-csharp"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger3"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithCronSchedule")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0 42 10 ? * WED"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" x "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("InTimeZone")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("TimeZoneInfo"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("FindSystemTimeZoneById")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Central America Standard Time"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobKey"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("h2",{attrs:{id:"crontrigger-misfire-instructions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#crontrigger-misfire-instructions"}},[t._v("#")]),t._v(" CronTrigger Misfire Instructions")]),t._v(" "),e("p",[t._v("The following instructions can be used to inform Quartz what it should do when a misfire occurs for CronTrigger.\n(Misfire situations were introduced in the More About Triggers section of this tutorial). These instructions are defined in as\nconstants (and API documentation has description for their behavior). The instructions include:")]),t._v(" "),e("ul",[e("li",[e("code",[t._v("MisfireInstruction.IgnoreMisfirePolicy")])]),t._v(" "),e("li",[e("code",[t._v("MisfireInstruction.CronTrigger.DoNothing")])]),t._v(" "),e("li",[e("code",[t._v("MisfireInstruction.CronTrigger.FireOnceNow")])])]),t._v(" "),e("p",[t._v("All triggers have the "),e("code",[t._v("MisfireInstrution.SmartPolicy")]),t._v(" instruction available for use, and this instruction is also the default for all trigger types.\nThe 'smart policy' instruction is interpreted by CronTrigger as MisfireInstruction.CronTrigger.FireOnceNow. The API documentation for the\n"),e("code",[t._v("CronTrigger.UpdateAfterMisfire()")]),t._v(" method explains the exact details of this behavior.")]),t._v(" "),e("p",[t._v("When building CronTriggers, you specify the misfire instruction as part of the cron schedule (via "),e("code",[t._v("WithCronSchedule")]),t._v(" extension method):")]),t._v(" "),e("div",{staticClass:"language-csharp extra-class"},[e("pre",{pre:!0,attrs:{class:"language-csharp"}},[e("code",[e("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger3"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithCronSchedule")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0 0/2 8-17 * * ?"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" x "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithMisfireHandlingInstructionFireAndProceed")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/118.1a20ec6b.js b/assets/js/118.1a20ec6b.js
new file mode 100644
index 000000000..23f889a93
--- /dev/null
+++ b/assets/js/118.1a20ec6b.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[118],{492:function(e,t,o){"use strict";o.r(t);var a=o(26),s=Object(a.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v('JobStore\'s are responsible for keeping track of all the "work data" that you give to the scheduler:\njobs, triggers, calendars, etc. Selecting the appropriate '),o("code",[e._v("IJobStore")]),e._v(" implementation for your Quartz scheduler instance is an important step.\nLuckily, the choice should be a very easy one once you understand the differences between them.\nYou declare which JobStore your scheduler should use (and it's configuration settings) in the properties file (or object) that\nyou provide to the SchedulerFactory that you use to produce your scheduler instance.")]),e._v(" "),o("div",{staticClass:"custom-block warning"},[o("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),o("p",[e._v("Never use a JobStore instance directly in your code. For some reason many people attempt to do this.\nThe JobStore is for behind-the-scenes use of Quartz itself. You have to tell Quartz (through configuration) which JobStore to use,\nbut then you should only work with the Scheduler interface in your code.")])]),e._v(" "),o("h2",{attrs:{id:"ramjobstore"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#ramjobstore"}},[e._v("#")]),e._v(" RAMJobStore")]),e._v(" "),o("p",[o("code",[e._v("RAMJobStore")]),e._v(" is the simplest JobStore to use, it is also the most performant (in terms of CPU time).\n"),o("code",[e._v("RAMJobStore")]),e._v(" gets its name in the obvious way: it keeps all of its data in RAM. This is why it's lightning-fast,\nand also why it's so simple to configure. The drawback is that when your application ends (or crashes) all of\nthe scheduling information is lost - this means RAMJobStore cannot honor the setting of \"non-volatility\" on jobs and triggers.\nFor some applications this is acceptable - or even the desired behavior, but for other applications, this may be disasterous.")]),e._v(" "),o("p",[o("strong",[e._v("Configuring Quartz to use RAMJobStore")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("// this is actually the default, so you don't need to explicitly set this\nquartz.jobStore.type = Quartz.Simpl.RAMJobStore, Quartz\n")])])]),o("p",[e._v("To use "),o("code",[e._v("RAMJobStore")]),e._v(" (and assuming you're using "),o("code",[e._v("StdSchedulerFactory")]),e._v(") you don't need to do anything special. Default configuration\nof Quartz.NET uses "),o("code",[e._v("RAMJobStore")]),e._v(" as job store implementation.")]),e._v(" "),o("h2",{attrs:{id:"ado-net-job-store-adojobstore"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#ado-net-job-store-adojobstore"}},[e._v("#")]),e._v(" ADO.NET Job Store (AdoJobStore)")]),e._v(" "),o("p",[e._v("AdoJobStore is also aptly named - it keeps all of its data in a database via ADO.NET.\nBecause of this it is a bit more complicated to configure than "),o("code",[e._v("RAMJobStore")]),e._v(", and it also is not as fast.\nHowever, the performance draw-back is not terribly bad, especially if you build the database tables with indexes on the primary keys.")]),e._v(" "),o("p",[e._v('To use AdoJobStore, you must first create a set of database tables for Quartz.NET to use.\nYou can find table-creation SQL scripts in the "database/dbtables" directory of the Quartz.NET distribution.\nIf there is not already a script for your database type, just look at one of the existing ones, and modify it in any way necessary for your DB.\nOne thing to note is that in these scripts, all the the tables start with the prefix '),o("code",[e._v("QRTZ_")]),e._v("\n(such as the tables "),o("code",[e._v("QRTZ_TRIGGERS")]),e._v(", and "),o("code",[e._v("QRTZ_JOB_DETAIL")]),e._v("). This prefix can actually be anything you'd like, as long as you inform AdoJobStore\nwhat the prefix is (in your Quartz.NET properties). Using different prefixes may be useful for creating multiple sets of tables,\nfor multiple scheduler instances, within the same database.")]),e._v(" "),o("p",[e._v("Currently the only option for the internal implementation of job store is "),o("code",[e._v("JobStoreTX")]),e._v("which creates transactions by itself.\nThis is different from Java version of Quartz where there is also option to choose "),o("code",[e._v("JobStoreCMT")]),e._v(" which uses J2EE container\nmanaged transactions.")]),e._v(" "),o("p",[e._v("The last piece of the puzzle is setting up a data source from which AdoJobStore can get connections to your database.\nData sources are defined in your Quartz.NET properties. Data source information contains the connection string\nand ADO.NET delegate information.")]),e._v(" "),o("h3",{attrs:{id:"configuring-quartz-to-use-jobstoretx"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#configuring-quartz-to-use-jobstoretx"}},[e._v("#")]),e._v(" Configuring Quartz to use JobStoreTx")]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz\n")])])]),o("p",[e._v("Next, you need to select a "),o("code",[e._v("IDriverDelegate")]),e._v(" implementation for the JobStore to use.\nThe DriverDelegate is responsible for doing any ADO.NET work that may be needed for your specific database.\n"),o("code",[e._v("StdAdoDelegate")]),e._v(' is a delegate that uses "vanilla" ADO.NET code (and SQL statements) to do its work.\nIf there isn\'t another delegate made specifically for your database, try using this delegate -\nspecial delegates usually have better performance or workarounds for database specific issues.\nOther delegates can be found in the '),o("code",[e._v("Quartz.Impl.AdoJobStore")]),e._v(" namespace, or in its sub-namespaces.")]),e._v(" "),o("div",{staticClass:"custom-block tip"},[o("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),o("p",[e._v("Quartz.NET will issue warning if you are using the default StdAdoDelegate as it has poor performance\nwhen you have a lot of triggers to select from. Specific delegates have special SQL to limit result\nset length (SqlServerDelegate uses "),o("code",[e._v("TOP n")]),e._v(", PostgreSQLDelegate "),o("code",[e._v("LIMIT n")]),e._v(", OracleDelegate "),o("code",[e._v("ROWCOUNT() <= n")]),e._v(" etc.).")])]),e._v(" "),o("p",[e._v("Once you've selected your delegate, set its class name as the delegate for AdoJobStore to use.")]),e._v(" "),o("p",[o("strong",[e._v("Configuring AdoJobStore to use a DriverDelegate")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz\n")])])]),o("p",[e._v("Next, you need to inform the JobStore what table prefix (discussed above) you are using.")]),e._v(" "),o("p",[o("strong",[e._v("Configuring AdoJobStore with the Table Prefix")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.tablePrefix = QRTZ_\n")])])]),o("p",[e._v('And finally, you need to set which data source should be used by the JobStore. The named data source must also be defined in your Quartz properties.\nIn this case, we\'re specifying that Quartz should use the data source name "myDS" (that is defined elsewhere in the configuration properties).')]),e._v(" "),o("p",[o("strong",[e._v("Configuring AdoJobStore with the name of the data source to use")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.dataSource = myDS\n")])])]),o("p",[e._v("One last thing that is needed for the configuration is to set data source connection string information and database provider. Connection\nstring is the standard ADO.NET connection which is driver specific. Database provider is an abstraction of database drivers to create\nloose coupling between database drivers and Quartz.")]),e._v(" "),o("p",[o("strong",[e._v("Setting Data Source's Connection String And Database Provider")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v(" quartz.dataSource.myDS.connectionString = Server=localhost;Database=quartz;Uid=quartznet;Pwd=quartznet\n quartz.dataSource.myDS.provider = MySql\n")])])]),o("p",[e._v("Currently following database providers are supported:")]),e._v(" "),o("ul",[o("li",[o("code",[e._v("SqlServer")]),e._v(" - SQL Server driver\n"),o("ul",[o("li",[e._v("For full framework this is by default System.Data.SqlClient (except in Quartz 3.1)")]),e._v(" "),o("li",[e._v("From Quartz 3.2 onwards for .NET Core this is by default Microsoft.Data.SqlClient")])])]),e._v(" "),o("li",[o("code",[e._v("SystemDataSqlClient")]),e._v(" - Available separately on .NET Core (default for full framework)")]),e._v(" "),o("li",[o("code",[e._v("MicrosoftDataSqlClient")]),e._v(" - Available separately on full framework (default for .NET Core)")]),e._v(" "),o("li",[o("code",[e._v("OracleODP")]),e._v(" - Oracle's Oracle Driver")]),e._v(" "),o("li",[o("code",[e._v("OracleODPManaged")]),e._v(" - Oracle's managed driver for Oracle 11")]),e._v(" "),o("li",[o("code",[e._v("MySql")]),e._v(" - MySQL Connector/.NET")]),e._v(" "),o("li",[o("code",[e._v("SQLite")]),e._v(" - SQLite ADO.NET Provider")]),e._v(" "),o("li",[o("code",[e._v("SQLite-Microsoft")]),e._v(" - Microsoft SQLite ADO.NET Provider")]),e._v(" "),o("li",[o("code",[e._v("Firebird")]),e._v(" - Firebird ADO.NET Provider")]),e._v(" "),o("li",[o("code",[e._v("Npgsql")]),e._v(" - PostgreSQL Npgsql")])]),e._v(" "),o("div",{staticClass:"custom-block tip"},[o("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),o("p",[e._v("There are many community contributed providers, like for NoSQL databases.")]),e._v(" "),o("p",[e._v("They are not supported by Quartz.NET project though.")])]),e._v(" "),o("p",[o("strong",[e._v("You can and should use latest version of driver if newer is available, just create an assembly binding redirect")])]),e._v(" "),o("p",[e._v("If your Scheduler is very busy (i.e. nearly always executing the same number of jobs as the size of the thread pool, then you should\nprobably set the number of connections in the data source to be the about the size of the thread pool + 1.This is commonly configured\nint the ADO.NET connection string - see your driver implementation for details.")]),e._v(" "),o("p",[e._v("The "),o("code",[e._v("quartz.jobStore.useProperties")]),e._v(' config parameter can be set to "true" (defaults to false) in order to instruct AdoJobStore that all values in JobDataMaps will be strings,\nand therefore can be stored as name-value pairs, rather than storing more complex objects in their serialized form in the BLOB column. This is much safer in the long term,\nas you avoid the class versioning issues that there are with serializing your non-String classes into a BLOB.')]),e._v(" "),o("h3",{attrs:{id:"configuring-adojobstore-to-use-strings-as-jobdatamap-values"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#configuring-adojobstore-to-use-strings-as-jobdatamap-values"}},[e._v("#")]),e._v(" Configuring AdoJobStore to use strings as JobDataMap values")]),e._v(" "),o("div",{staticClass:"custom-block tip"},[o("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),o("p",[e._v("This is recommended configuration because it greatly decreases the possibility of type serialization issues.")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.useProperties = true\n")])])]),o("h3",{attrs:{id:"choosing-a-serializer"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#choosing-a-serializer"}},[e._v("#")]),e._v(" Choosing a serializer")]),e._v(" "),o("p",[e._v("Quartz.NET supports both binary and JSON serialization.\nJSON serialization comes from separate "),o("a",{attrs:{href:"../packages/json-serialization"}},[e._v("Quartz.Serialization.Json")]),e._v(" NuGet package.")]),e._v(" "),o("div",{staticClass:"custom-block tip"},[o("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),o("p",[e._v("JSON is recommended persistent format to store data in database for greenfield projects.\nYou should also strongly consider setting useProperties to true to restrict key-values to be strings.")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v('// "json" is alias for "Quartz.Simpl.JsonObjectSerializer, Quartz.Serialization.Json" \nquartz.serializer.type = json\n')])])])])}),[],!1,null,null,null);t.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/119.5545109a.js b/assets/js/119.5545109a.js
new file mode 100644
index 000000000..a6775f6ad
--- /dev/null
+++ b/assets/js/119.5545109a.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[119],{493:function(e,t,a){"use strict";a.r(t);var s=a(26),n=Object(s.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h2",{attrs:{id:"the-quartz-api"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-quartz-api"}},[e._v("#")]),e._v(" The Quartz API")]),e._v(" "),a("p",[e._v("The key interfaces and classes of the Quartz API are:")]),e._v(" "),a("ul",[a("li",[a("code",[e._v("IScheduler")]),e._v(" - the main API for interacting with the scheduler.")]),e._v(" "),a("li",[a("code",[e._v("IJob")]),e._v(" - an interface to be implemented by components that you wish to have executed by the scheduler.")]),e._v(" "),a("li",[a("code",[e._v("IJobDetail")]),e._v(" - used to define instances of Jobs.")]),e._v(" "),a("li",[a("code",[e._v("ITrigger")]),e._v(" - a component that defines the schedule upon which a given Job will be executed, job can have multiple associated triggers")]),e._v(" "),a("li",[a("code",[e._v("JobBuilder")]),e._v(" - used to define/build JobDetail instances, which define instances of Jobs.")]),e._v(" "),a("li",[a("code",[e._v("TriggerBuilder")]),e._v(" - used to define/build Trigger instances.")]),e._v(" "),a("li",[a("code",[e._v("SchedulerBuilder")]),e._v(" - used to define/build scheduler instances, requires Quartz 3.1 or later.")])]),e._v(" "),a("p",[e._v("In this tutorial for readability's sake following terms are used interchangeably: "),a("code",[e._v("IScheduler")]),e._v(" and "),a("code",[e._v("Scheduler")]),e._v(", "),a("code",[e._v("IJob")]),e._v(" and "),a("code",[e._v("Job")]),e._v(", "),a("code",[e._v("IJobDetail")]),e._v(" and "),a("code",[e._v("JobDetail")]),e._v(", "),a("code",[e._v("ITrigger")]),e._v(" and "),a("code",[e._v("Trigger")]),e._v(".")]),e._v(" "),a("p",[e._v("A "),a("code",[e._v("Scheduler")]),e._v("'s life-cycle is bounded by it's creation, via a "),a("code",[e._v("SchedulerFactory")]),e._v(" and a call to its "),a("code",[e._v("Shutdown()")]),e._v(" method.\nOnce created the "),a("code",[e._v("IScheduler")]),e._v(" interface can be used add, remove, and list Jobs and Triggers, and perform other scheduling-related operations (such as pausing a trigger).\nHowever, the Scheduler will not actually act on any triggers (execute jobs) until it has been started with the "),a("code",[e._v("Start()")]),e._v(" method, as shown in "),a("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/using-quartz.html"}},[e._v("Lesson 1")]),e._v(".")],1),e._v(" "),a("p",[e._v('Quartz provides "builder" classes that define a Domain Specific Language (or DSL, also sometimes referred to as a "fluent interface"). In the previous lesson you saw an example of it, which we present a portion of here again:')]),e._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// define the job and tie it to our HelloJob class")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("IJobDetail")]),e._v(" job "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" JobBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("Create")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("<")]),e._v("HelloJob"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("WithIdentity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"myJob"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"group1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v('// name "myJob", group "group1"')]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("Build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Trigger the job to run now, and then every 40 seconds")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("ITrigger")]),e._v(" trigger "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" TriggerBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("Create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("WithIdentity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"myTrigger"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"group1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("StartNow")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("WithSimpleSchedule")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=>")]),e._v(" x\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("WithIntervalInSeconds")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("40")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("RepeatForever")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" \n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("Build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n \n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Tell quartz to schedule the job using our trigger")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("await")]),e._v(" sched"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("scheduleJob")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n")])])]),a("p",[e._v("The block of code that builds the job definition is using "),a("code",[e._v("JobBuilder")]),e._v(" using fluent interface to create the product, "),a("code",[e._v("IJobDetail")]),e._v(".\nLikewise, the block of code that builds the trigger is using "),a("code",[e._v("TriggerBuilder")]),e._v("'s fluent interface and extension methods that are specific to given trigger type.\nPossible schedule extension methods are:")]),e._v(" "),a("ul",[a("li",[a("code",[e._v("WithCalendarIntervalSchedule")])]),e._v(" "),a("li",[a("code",[e._v("WithCronSchedule")])]),e._v(" "),a("li",[a("code",[e._v("WithDailyTimeIntervalSchedule")])]),e._v(" "),a("li",[a("code",[e._v("WithSimpleSchedule")])])]),e._v(" "),a("p",[e._v("The "),a("code",[e._v("DateBuilder")]),e._v(" type contains various methods for easily constructing DateTimeOffset instances for particular points in time\n(such as a date that represents the next even hour - or in other words 10:00:00 if it is currently 9:43:27).")]),e._v(" "),a("h2",{attrs:{id:"jobs-and-triggers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#jobs-and-triggers"}},[e._v("#")]),e._v(" Jobs and Triggers")]),e._v(" "),a("p",[e._v("A job is a class that implements the "),a("code",[e._v("IJob")]),e._v(" interface, which has only one simple method:")]),e._v(" "),a("p",[a("strong",[e._v("IJob Interface")])]),e._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("namespace")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[e._v("Quartz")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("public")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("interface")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("IJob")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[e._v("Task")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("Execute")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("JobExecutionContext")]),e._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),a("p",[e._v("When the Job's trigger fires (more on that in a moment), the "),a("code",[e._v("Execute(..)")]),e._v(" method is invoked by one of the scheduler's worker threads.\nThe "),a("code",[e._v("JobExecutionContext")]),e._v(' object that is passed to this method provides the job instance with information about its "run-time" environment -\na handle to the Scheduler that executed it, a handle to the Trigger that triggered the execution, the job\'s JobDetail object, and a few other items.')]),e._v(" "),a("p",[e._v("The JobDetail object is created by the Quartz.NET client (your program) at the time the Job is added to the scheduler.\nIt contains various property settings for the Job, as well as a JobDataMap, which can be used to store state information for a given instance of your job class.\nIt is essentially the definition of the job instance, and is discussed in further detail in the next lesson.")]),e._v(" "),a("p",[e._v("Trigger objects are used to trigger the execution (or 'firing') of jobs. When you wish to schedule a job, you instantiate a trigger and 'tune' its properties\nto provide the scheduling you wish to have. Triggers may also have a JobDataMap associated with them - this is useful to passing parameters to a\nJob that are specific to the firings of the trigger. Quartz ships with a handful of different trigger types, but the most commonly used types\nare SimpleTrigger (interface "),a("code",[e._v("ISimpleTrigger")]),e._v(") and CronTrigger (interface "),a("code",[e._v("ICronTrigger")]),e._v(").")]),e._v(" "),a("p",[e._v('SimpleTrigger is handy if you need \'one-shot\' execution (just single execution of a job at a given moment in time), or if you need to fire a job at a given time,\nand have it repeat N times, with a delay of T between executions. CronTrigger is useful if you wish to have triggering based on calendar-like schedules -\nsuch as "every Friday, at noon" or "at 10:15 on the 10th day of every month."')]),e._v(" "),a("p",[e._v("Why Jobs AND Triggers? Many job schedulers do not have separate notions of jobs and triggers. Some define a 'job' as simply an execution time (or schedule)\nalong with some small job identifier. Others are much like the union of Quartz's job and trigger objects. While developing Quartz, we decided that it made sense\nto create a separation between the schedule and the work to be performed on that schedule. This has (in our opinion) many benefits.")]),e._v(" "),a("p",[e._v("For example, Jobs can be created and stored in the job scheduler independent of a trigger, and many triggers can be associated with the same job.\nAnother benefit of this loose-coupling is the ability to configure jobs that remain in the scheduler after their associated triggers have expired,\nso that that it can be rescheduled later, without having to re-define it. It also allows you to modify or replace a trigger without having to re-define\nits associated job.")]),e._v(" "),a("h2",{attrs:{id:"identities"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#identities"}},[e._v("#")]),e._v(" Identities")]),e._v(" "),a("p",[e._v("Jobs and Triggers are given identifying keys as they are registered with the Quartz scheduler.\nThe keys of Jobs and Triggers ("),a("code",[e._v("JobKey")]),e._v(" and "),a("code",[e._v("TriggerKey")]),e._v(') allow them to be placed into \'groups\' which can be useful for organizing your jobs and\ntriggers into categories such as "reporting jobs" and "maintenance jobs". The name portion of the key of a job or trigger must be unique within the group')]),e._v(" "),a("ul",[a("li",[e._v("or in other words, the complete key (or identifier) of a job or trigger is the compound of the name and group.")])]),e._v(" "),a("p",[e._v("You now have a general idea about what Jobs and Triggers are, you can learn more about them in\n"),a("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/more-about-jobs.html"}},[e._v("Lesson 3: More About Jobs & JobDetails")]),e._v(" and "),a("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/more-about-triggers.html"}},[e._v("Lesson 4: More About Triggers")])],1)])}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/12.632699a6.js b/assets/js/12.632699a6.js
new file mode 100644
index 000000000..99b9ce742
--- /dev/null
+++ b/assets/js/12.632699a6.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{385:function(e,t,n){"use strict";n.r(t);n(50),n(70);var o={name:"Redirect",props:{to:{type:String,required:!0}},beforeMount:function(){document.location.replace(this.to)}},r=n(26),i=Object(r.a)(o,(function(){var e=this.$createElement;return(this._self._c||e)("div")}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/120.ac3b1282.js b/assets/js/120.ac3b1282.js
new file mode 100644
index 000000000..a9cf6873c
--- /dev/null
+++ b/assets/js/120.ac3b1282.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[120],{494:function(t,e,a){"use strict";a.r(e);var o=a(26),n=Object(o.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"plug-ins"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#plug-ins"}},[t._v("#")]),t._v(" Plug-Ins")]),t._v(" "),a("p",[t._v("Quartz provides an interface ("),a("code",[t._v("ISchedulerPlugin")]),t._v(") for plugging-in additional functionality.")]),t._v(" "),a("p",[t._v("Plugins that ship with Quartz to provide various utility capabilities can be found documented in the "),a("code",[t._v("Quartz.Plugins")]),t._v(" namespace.\nThey provide functionality such as auto-scheduling of jobs upon scheduler startup, logging a history of job and trigger events,\nand ensuring that the scheduler shuts down cleanly when the virtual machine exits.")]),t._v(" "),a("h2",{attrs:{id:"jobfactory"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#jobfactory"}},[t._v("#")]),t._v(" JobFactory")]),t._v(" "),a("p",[t._v("When a trigger fires, the Job it is associated to is instantiated via the JobFactory configured on the Scheduler.\nThe default JobFactory simply activates a new instance of the job class. You may want to create your own implementation\nof JobFactory to accomplish things such as having your application's IoC or DI container produce/initialize the job instance.")]),t._v(" "),a("p",[t._v("See the "),a("code",[t._v("IJobFactory")]),t._v(" interface, and the associated "),a("code",[t._v("IScheduler.JobFactory")]),t._v(" setter property.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("Since Quartz 3.1, there's "),a("a",{attrs:{href:"../packages/microsoft-di-integration"}},[t._v("built-in support for integrating with Microsoft Dependency Injection")]),t._v(" which in\nturn allows to use different IoC container implementations.")])]),t._v(" "),a("h2",{attrs:{id:"factory-shipped-jobs"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#factory-shipped-jobs"}},[t._v("#")]),t._v(" 'Factory-Shipped' Jobs")]),t._v(" "),a("p",[t._v("Quartz also provides a number of utility Jobs that you can use in your application for doing things like sending\ne-mails and invoking remote objects. These out-of-the-box Jobs can be found documented in the "),a("code",[t._v("Quartz.Jobs")]),t._v(" namespace and\nare part of the "),a("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.Jobs",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quartz.Jobs NuGet package"),a("OutboundLink")],1),t._v(".")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/121.b9c8a72f.js b/assets/js/121.b9c8a72f.js
new file mode 100644
index 000000000..410a95a63
--- /dev/null
+++ b/assets/js/121.b9c8a72f.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[121],{495:function(t,a,s){"use strict";s.r(a);var e=s(26),n=Object(e.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("As you saw in Lesson 2, jobs are rather easy to implement. There are just a few more things that you need to understand about\nthe nature of jobs, about the "),s("code",[t._v("Execute(..)")]),t._v(" method of the "),s("code",[t._v("IJob")]),t._v(" interface, and about JobDetails.")]),t._v(" "),s("p",[t._v("While a job class that you implement has the code that knows how to do the actual work\nof the particular type of job, Quartz.NET needs to be informed about various attributes\nthat you may wish an instance of that job to have. This is done via the JobDetail class,\nwhich was mentioned briefly in the previous section.")]),t._v(" "),s("p",[t._v("JobDetail instances are built using the "),s("code",[t._v("JobBuilder")]),t._v(" class. "),s("code",[t._v("JobBuilder")]),t._v(" allows you to describe\nyour job's details using a fluent interface.")]),t._v(" "),s("p",[t._v("Let's take a moment now to discuss a bit about the 'nature' of jobs and the life-cycle of job instances within Quartz.NET.\nFirst lets take a look back at some of that snippet of code we saw in Lesson 1:")]),t._v(" "),s("p",[s("strong",[t._v("Using Quartz.NET")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define the job and tie it to our HelloJob class")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobDetail")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" JobBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("HelloJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Trigger the job to run now, and then every 40 seconds")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartNow")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n\t "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInSeconds")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \nsched"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" trigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now consider the job class "),s("strong",[t._v("HelloJob")]),t._v(" defined as such:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HelloJob")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" Console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Out"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLineAsync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"HelloJob is executing."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Notice that we give the scheduler a "),s("code",[t._v("IJobDetail")]),t._v(" instance, and that it refers to the job to be executed by simply\nproviding the job's class. Each (and every) time the scheduler executes the job, it creates a new instance of the\nclass before calling its "),s("code",[t._v("Execute(..)")]),t._v(" method. One of the ramifications of this behavior is the fact that jobs must\nhave a no-arguement constructor. Another ramification is that it does not make sense to have data-fields defined\non the job class - as their values would not be preserved between job executions.")]),t._v(" "),s("p",[t._v('You may now be wanting to ask "how can I provide properties/configuration for a Job instance?" and "how can I\nkeep track of a job\'s state between executions?" The answer to these questions are the same: the key is the '),s("code",[t._v("JobDataMap")]),t._v(",\nwhich is part of the JobDetail object.")]),t._v(" "),s("h2",{attrs:{id:"jobdatamap"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#jobdatamap"}},[t._v("#")]),t._v(" JobDataMap")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("JobDataMap")]),t._v(" can be used to hold any number of (serializable) objects which you wish to have made available\nto the job instance when it executes. "),s("code",[t._v("JobDataMap")]),t._v(" is an implementation of the "),s("code",[t._v("IDictionary")]),t._v(" interface, and has\nsome added convenience methods for storing and retrieving data of primitive types.")]),t._v(" "),s("p",[t._v("Here's some quick snippets of putting data into the JobDataMap prior to adding the job to the scheduler:")]),t._v(" "),s("p",[s("strong",[t._v("Setting Values in a JobDataMap")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define the job and tie it to our DumbJob class")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobDetail")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" JobBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("DumbJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// name "myJob", group "group1"')]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("UsingJobData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jobSays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello World!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("UsingJobData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myFloatValue"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.141f")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Here's a quick example of getting data from the JobDataMap during the job's execution:")]),t._v(" "),s("p",[s("strong",[t._v("Getting Values from a JobDataMap")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DumbJob")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobKey")]),t._v(" key "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobDataMap")]),t._v(" dataMap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" jobSays "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetString")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jobSays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("float")])]),t._v(" myFloatValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFloat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myFloatValue"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" Console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLineAsync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Instance "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" key "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('" of DumbJob says: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" jobSays "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('", and val is: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myFloatValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("If you use a persistent JobStore (discussed in the JobStore section of this tutorial) you should use some care\nin deciding what you place in the JobDataMap, because the object in it will be serialized, and they therefore\nbecome prone to class-versioning problems. Obviously standard .NET types should be very safe, but beyond that,\nany time someone changes the definition of a class for which you have serialized instances,\ncare has to be taken not to break compatibility.")]),t._v(" "),s("p",[t._v("Optionally, you can put AdoJobStore and JobDataMap into a mode where only primitives\nand strings can be stored in the map, thus eliminating any possibility of later serialization problems.")]),t._v(" "),s("p",[t._v("If you add properties with set accessor to your job class that correspond to the names of keys in the JobDataMap,\nthen Quartz's default JobFactory implementation will automatically call those setters when the job is instantiated,\nthus preventing the need to explicitly get the values out of the map within your execute method. Note this\nfunctionality is not maintained by default when using a custom JobFactory.")]),t._v(" "),s("p",[t._v("Triggers can also have JobDataMaps associated with them. This can be useful in the case where you have a Job that is stored in the scheduler\nfor regular/repeated use by multiple Triggers, yet with each independent triggering, you want to supply the Job with different data inputs.")]),t._v(" "),s("p",[t._v("The JobDataMap that is found on the JobExecutionContext during Job execution serves as a convenience. It is a merge of the JobDataMap\nfound on the JobDetail and the one found on the Trigger, with the values in the latter overriding any same-named values in the former.")]),t._v(" "),s("p",[t._v("Here's a quick example of getting data from the JobExecutionContext's merged JobDataMap during the job's execution:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DumbJob")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobKey")]),t._v(" key "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobDataMap")]),t._v(" dataMap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("MergedJobDataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Note the difference from the previous example")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" jobSays "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetString")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jobSays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("float")])]),t._v(" myFloatValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFloat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myFloatValue"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("DateTimeOffset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" state "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("IList"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("DateTimeOffset"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myStateData"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\tstate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Add")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateTimeOffset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" Console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLineAsync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Instance "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" key "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('" of DumbJob says: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" jobSays "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('", and val is: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myFloatValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v('Or if you wish to rely on the JobFactory "injecting" the data map values onto your class, it might look like this instead:')]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DumbJob")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" JobSays "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("float")])]),t._v(" MyFloatValue "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobKey")]),t._v(" key "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobDataMap")]),t._v(" dataMap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("MergedJobDataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Note the difference from the previous example")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("DateTimeOffset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" state "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("IList"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("DateTimeOffset"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myStateData"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\tstate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Add")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateTimeOffset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" Console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLineAsync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Instance "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" key "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('" of DumbJob says: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" JobSays "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('", and val is: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" MyFloatValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("You'll notice that the overall code of the class is longer, but the code in the "),s("code",[t._v("Execute()")]),t._v(" method is cleaner.\nOne could also argue that although the code is longer, that it actually took less coding, if the programmer's IDE was used to auto-generate the properties,\nrather than having to hand-code the individual calls to retrieve the values from the JobDataMap. The choice is yours.")]),t._v(" "),s("h2",{attrs:{id:"job-instances"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#job-instances"}},[t._v("#")]),t._v(' Job "Instances"')]),t._v(" "),s("p",[t._v('Many users spend time being confused about what exactly constitutes a "job instance".\nWe\'ll try to clear that up here and in the section below about job state and concurrency.')]),t._v(" "),s("p",[t._v("You can create a single job class, and store many 'instance definitions' of it within the scheduler by creating multiple instances of JobDetails")]),t._v(" "),s("ul",[s("li",[t._v("each with its own set of properties and JobDataMap - and adding them all to the scheduler.")])]),t._v(" "),s("p",[t._v("For example, you can create a class that implements the "),s("code",[t._v("IJob")]),t._v(' interface called "SalesReportJob".\nThe job might be coded to expect parameters sent to it (via the JobDataMap) to specify the name of the sales person that the sales\nreport should be based on. They may then create multiple definitions (JobDetails) of the job, such as "SalesReportForJoe"\nand "SalesReportForMike" which have "joe" and "mike" specified in the corresponding JobDataMaps as input to the respective jobs.')]),t._v(" "),s("p",[t._v("When a trigger fires, the JobDetail (instance definition) it is associated to is loaded,\nand the job class it refers to is instantiated via the JobFactory configured on the Scheduler.\nThe default JobFactory simply calls the default constructor of the job class using Activator.CreateInstance,\nthen attempts to call setter properties on the class that match the names of keys within the JobDataMap.\nYou may want to create your own implementation of JobFactory to accomplish things such as having your application's IoC or DI container produce/initialize the job instance.")]),t._v(" "),s("p",[t._v('In "Quartz speak", we refer to each stored JobDetail as a "job definition" or "JobDetail instance",\nand we refer to a each executing job as a "job instance" or "instance of a job definition".\nUsually if we just use the word "job" we are referring to a named definition, or JobDetail.\nWhen we are referring to the class implementing the job interface, we usually use the term "job type".')]),t._v(" "),s("h2",{attrs:{id:"job-state-and-concurrency"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#job-state-and-concurrency"}},[t._v("#")]),t._v(" Job State and Concurrency")]),t._v(" "),s("p",[t._v("Now, some additional notes about a job's state data (aka JobDataMap) and concurrency.\nThere are a couple attributes that can be added to your Job class that affect Quartz's behaviour with respect to these aspects.")]),t._v(" "),s("p",[s("code",[t._v("[DisallowConcurrentExecution]")]),t._v(' is an attribute that can be added to the Job class that tells Quartz not to execute multiple instances\nof a given job definition (that refers to the given job class) concurrently.\nNotice the wording there, as it was chosen very carefully. In the example from the previous section, if "SalesReportJob" has this attribute,\nthen only one instance of "SalesReportForJoe" can execute at a given time, but it can execute concurrently with an instance of "SalesReportForMike".\nThe constraint is based upon an instance definition (JobDetail), not on instances of the job class.\nHowever, it was decided (during the design of Quartz) to have the attribute carried on the class itself, because it does often make a difference to how the class is coded.')]),t._v(" "),s("p",[s("code",[t._v("[PersistJobDataAfterExecution]")]),t._v(" is an attribute that can be added to the Job class that tells Quartz to update the stored copy of\nthe JobDetail's JobDataMap after the Execute() method completes successfully (without throwing an exception), such that the next\nexecution of the same job (JobDetail) receives the updated values rather than the originally stored values.\nLike the "),s("code",[t._v("[DisallowConcurrentExecution]")]),t._v(" attribute, this applies to a job definition instance, not a job class instance,\nthough it was decided to have the job class carry the attribute because it does often make a difference to how the class is coded\n(e.g. the 'statefulness' will need to be explicitly 'understood' by the code within the execute method).")]),t._v(" "),s("p",[t._v("If you use the "),s("strong",[t._v("PersistJobDataAfterExecution")]),t._v(" attribute, you should strongly consider also using the "),s("code",[t._v("[DisallowConcurrentExecution]")]),t._v(" attribute,\nin order to avoid possible confusion (race conditions) of what data was left stored when two instances of the same job (JobDetail) executed concurrently.")]),t._v(" "),s("h2",{attrs:{id:"other-attributes-of-jobs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-attributes-of-jobs"}},[t._v("#")]),t._v(" Other Attributes Of Jobs")]),t._v(" "),s("p",[t._v("Here's a quick summary of the other properties which can be defined for a job instance via the JobDetail object:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("Durability")]),t._v(" - if a job is non-durable, it is automatically deleted from the scheduler once there are no longer any active triggers associated with it.\nIn other words, non-durable jobs have a life span bounded by the existence of its triggers.")]),t._v(" "),s("li",[s("code",[t._v("RequestsRecovery")]),t._v(" - if a job \"requests recovery\", and it is executing during the time of a 'hard shutdown' of the scheduler\n(i.e. the process it is running within crashes, or the machine is shut off), then it is re-executed when the scheduler is started again.\nIn this case, the "),s("code",[t._v("JobExecutionContext.Recovering")]),t._v(" property will return true.")])]),t._v(" "),s("h2",{attrs:{id:"jobexecutionexception"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#jobexecutionexception"}},[t._v("#")]),t._v(" JobExecutionException")]),t._v(" "),s("p",[t._v("Finally, we need to inform you of a few details of the "),s("code",[t._v("IJob.Execute(..)")]),t._v(" method. The only type of exception\nthat you should throw from the execute method is the JobExecutionException. Because of this, you should generally wrap the entire contents of the\nexecute method with a 'try-catch' block. You should also spend some time looking at the documentation for the JobExecutionException,\nas your job can use it to provide the scheduler various directives as to how you want the exception to be handled.")])])}),[],!1,null,null,null);a.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/122.702d9fad.js b/assets/js/122.702d9fad.js
new file mode 100644
index 000000000..b10ef0a11
--- /dev/null
+++ b/assets/js/122.702d9fad.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[122],{496:function(t,e,s){"use strict";s.r(e);var a=s(26),n=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("Like jobs, triggers are relatively easy to work with, but do contain a variety of customizable options that you need to\nbe aware of and understand before you can make full use of Quartz.NET. Also, as noted earlier, there are different types of triggers,\nthat you can select to meet different scheduling needs.")]),t._v(" "),s("h2",{attrs:{id:"common-trigger-attributes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#common-trigger-attributes"}},[t._v("#")]),t._v(" Common Trigger Attributes")]),t._v(" "),s("p",[t._v("Aside from the fact that all trigger types have "),s("code",[t._v("TriggerKey")]),t._v(" properties for tracking their identities,\nthere are a number of other properties that are common to all trigger types. These common properties are set using the TriggerBuilder\nwhen you are building the trigger definition (examples of that will follow).")]),t._v(" "),s("p",[t._v("Here is a listing of properties common to all trigger types:")]),t._v(" "),s("ul",[s("li",[t._v("The "),s("code",[t._v("JobKey")]),t._v(" property indicates the identity of the job that should be executed when the trigger fires.")]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("StartTimeUtc")]),t._v(' property indicates when the trigger\'s schedule first comes into affect.\nThe value is a DateTimeOffset object that defines a moment in time on a given calendar date.\nFor some trigger types, the trigger will actually fire at the start time, for others it simply marks the time that the schedule should start being followed.\nThis means you can store a trigger with a schedule such as "every 5th day of the month" during January, and if the StartTimeUtc property is set to April 1st,\nit will be a few months before the first firing.')]),t._v(" "),s("li",[t._v("The "),s("code",[t._v("EndTimeUtc")]),t._v(" property indicates when the trigger's schedule should no longer be in effect.\nIn other words, a trigger with a schedule of \"every 5th day of the month\" and with an end time of July 1st will fire for it's last time on June 5th.")])]),t._v(" "),s("p",[t._v("Other properties, which take a bit more explanation are discussed in the following sub-sections.")]),t._v(" "),s("h2",{attrs:{id:"priority"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#priority"}},[t._v("#")]),t._v(" Priority")]),t._v(" "),s("p",[t._v("Sometimes, when you have many Triggers (or few worker threads in your Quartz.NET thread pool), Quartz.NET may not have enough resources to immediately fire all\nof the Triggers that are scheduled to fire at the same time. In this case, you may want to control which of your Triggers get first crack at the available Quartz.NET worker threads.\nFor this purpose, you can set the priority property on a Trigger. If N Triggers are to fire at the same time, but there are only Z worker threads currently available,\nthen the first Z Triggers with the highest priority will be executed first. If you do not set a priority on a Trigger, then it will use the default priority of 5.\nAny integer value is allowed for priority, positive or negative. A larger number indicates a higher priority. i.e. A trigger with a Priority of 7 will have priority over trigger with a value of 5.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("Priorities are only compared when triggers have the same fire time. A trigger scheduled to fire at 10:59 will always fire before one scheduled to fire at 11:00.")])]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),s("p",[t._v("When a trigger's job is detected to require recovery, its recovery is scheduled with the same priority as the original trigger.")])]),t._v(" "),s("h2",{attrs:{id:"misfire-instructions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#misfire-instructions"}},[t._v("#")]),t._v(" Misfire Instructions")]),t._v(" "),s("p",[t._v('Another important property of a Trigger is its "misfire instruction". A misfire occurs if a persistent trigger "misses" its firing time because of the scheduler being shutdown,\nor because there are no available threads in Quartz.NET\'s thread pool for executing the job.\nThe different trigger types have different misfire instructions available to them.\nBy default they use a \'smart policy\' instruction - which has dynamic behavior based on trigger type and configuration.\nWhen the scheduler starts, it searches for any persistent triggers that have misfired, and it then updates each of them based on their individually\nconfigured misfire instructions. When you start using Quartz.NET in your own projects, you should make yourself familiar with the misfire instructions\nthat are defined on the given trigger types, and explained in their API documentation. More specific information about misfire instructions will be given within\nthe tutorial lessons specific to each trigger type.')]),t._v(" "),s("h2",{attrs:{id:"calendars"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#calendars"}},[t._v("#")]),t._v(" Calendars")]),t._v(" "),s("p",[t._v("Quartz.NET Calendar objects implementing "),s("code",[t._v("ICalendar")]),t._v(" interface can be associated with triggers at the time the trigger is stored in the scheduler.\nCalendars are useful for excluding blocks of time from the trigger's firing schedule. For instance, you could\ncreate a trigger that fires a job every weekday at 9:30 am, but then add a Calendar that excludes all of the business's holidays.")]),t._v(" "),s("p",[t._v("Calendar's can be any serializable objects that implement the ICalendar interface, which looks like this:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("namespace")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("Quartz")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ICalendar")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" Description "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("ICalendar")]),t._v(" CalendarBase "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("bool")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("IsTimeIncluded")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DateTimeOffset")]),t._v(" timeUtc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("DateTime")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetNextIncludedTimeUtc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DateTimeOffset")]),t._v(" timeUtc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("ICalendar")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Clone")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])])]),s("p",[t._v("Even though calendars can 'block out' sections of time as narrow as a millisecond, most likely, you'll be interested in\n'blocking-out' entire days. As a convenience, Quartz.NET includes the class HolidayCalendar, which does just that.")]),t._v(" "),s("p",[t._v("Calendars must be instantiated and registered with the scheduler via the "),s("code",[t._v("AddCalendar(..)")]),t._v(" method. If you use "),s("code",[t._v("HolidayCalendar")]),t._v(",\nafter instantiating it, you should use its "),s("code",[t._v("AddExcludedDate(DateTime date)")]),t._v(" method in order to populate it with the days you wish\nto have excluded from scheduling. The same calendar instance can be used with multiple triggers such as this:")]),t._v(" "),s("p",[s("strong",[t._v("Calendar Example")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HolidayCalendar")]),t._v(" cal "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("HolidayCalendar")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n cal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddExcludedDate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("someDate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" sched"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddCalendar")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myHolidays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" t "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSchedule")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("CronScheduleBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("DailyAtHourAndMinute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// execute job daily at 9:30")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ModifiedByCalendar")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myHolidays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// but not on holidays")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// .. schedule job with trigger")]),t._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" t2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSchedule")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("CronScheduleBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("DailyAtHourAndMinute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// execute job daily at 11:30")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ModifiedByCalendar")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myHolidays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// but not on holidays")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// .. schedule job with trigger2 ")]),t._v("\n")])])]),s("p",[t._v("The details of the construction/building of triggers will be given in the next couple lessons.\nFor now, just believe that the code above creates two triggers, each scheduled to fire daily.\nHowever, any of the firings that would have occurred during the period excluded by the calendar will be skipped.")]),t._v(" "),s("p",[t._v("See the Quartz.Impl.Calendar namespace for a number of ICalendar implementations that may suit your needs.")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/123.b873e59c.js b/assets/js/123.b873e59c.js
new file mode 100644
index 000000000..91c2836f3
--- /dev/null
+++ b/assets/js/123.b873e59c.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[123],{520:function(s,t,a){"use strict";a.r(t);var e=a(26),n=Object(e.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("p",[s._v("SchedulerListeners are much like "),a("code",[s._v("ITriggerListener")]),s._v("s and "),a("code",[s._v("IJobListener")]),s._v("s, except they receive notification of\nevents within the scheduler itself - not necessarily events related to a specific trigger or job.")]),s._v(" "),a("p",[s._v("Scheduler-related events include: the addition of a job/trigger, the removal of a job/trigger, a serious error\nwithin the scheduler, notification of the scheduler being shutdown, and others.")]),s._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[s._v("WARNING")]),s._v(" "),a("p",[s._v("Make sure your scheduler listeners never throw an exception (use a try-catch) and that they can handle internal problems.\nQuartz can get in unpredictable state when it is unable to determine whether required logic in listener was completed successfully when listener notification failed.")])]),s._v(" "),a("p",[a("strong",[s._v("The ISchedulerListener Interface")])]),s._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("interface")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ISchedulerListener")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s._v("Task")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("JobScheduled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Trigger")]),s._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s._v("Task")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("JobUnscheduled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerGroup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s._v("Task")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("TriggerFinalized")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Trigger")]),s._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s._v("Task")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("TriggersPaused")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerGroup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s._v("Task")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("TriggersResumed")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerGroup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s._v("Task")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("JobsPaused")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" jobName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" jobGroup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s._v("Task")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("JobsResumed")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" jobName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" jobGroup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s._v("Task")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("SchedulerError")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" msg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SchedulerException")]),s._v(" cause"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s._v("Task")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("SchedulerShutdown")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n")])])]),a("p",[s._v("SchedulerListeners are registered with the scheduler's "),a("code",[s._v("ListenerManager")]),s._v(".\nSchedulerListeners can be virtually any object that implements the "),a("code",[s._v("ISchedulerListener")]),s._v(" interface.")]),s._v(" "),a("p",[a("strong",[s._v("Adding a SchedulerListener:")])]),s._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[s._v("scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("ListenerManager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("AddSchedulerListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("mySchedListener"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])])]),a("p",[a("strong",[s._v("Removing a SchedulerListener:")])]),s._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[s._v("scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("ListenerManager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("RemoveSchedulerListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("mySchedListener"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])])])])}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/124.73484c48.js b/assets/js/124.73484c48.js
new file mode 100644
index 000000000..61440739e
--- /dev/null
+++ b/assets/js/124.73484c48.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[124],{519:function(t,s,n){"use strict";n.r(s);var a=n(26),e=Object(a.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[t._v("SimpleTrigger should meet your scheduling needs if you need to have a job execute exactly once at a specific moment in time,\nor at a specific moment in time followed by repeats at a specific interval. Or plainer english, if you want the trigger to\nfire at exactly 11:23:54 AM on January 13, 2005, and then fire five more times, every ten seconds.")]),t._v(" "),n("p",[t._v("With this description, you may not find it surprising to find that the properties of a SimpleTrigger include: a start-time,\nand end-time, a repeat count, and a repeat interval. All of these properties are exactly what you'd expect them to be, with\nonly a couple special notes related to the end-time property.")]),t._v(" "),n("p",[t._v("The repeat count can be zero, a positive integer, or the constant value "),n("code",[t._v("SimpleTrigger.RepeatIndefinitely")]),t._v(".\nThe repeat interval property must be "),n("code",[t._v("TimeSpan.Zero")]),t._v(", or a positive TimeSpan value.\nNote that a repeat interval of zero will cause 'repeat count' firings of the trigger to happen concurrently\n(or as close to concurrently as the scheduler can manage).")]),t._v(" "),n("p",[t._v("If you're not already familiar with the "),n("code",[t._v("DateTime")]),t._v(" class, you may find it helpful for computing your trigger fire-times,\ndepending on the startTimeUtc (or endTimeUtc) that you're trying to create.")]),t._v(" "),n("p",[t._v("The "),n("code",[t._v("EndTimeUtc")]),t._v(" property (if it is specified) over-rides the repeat count property. This can be useful if you wish to create a trigger\nsuch as one that fires every 10 seconds until a given moment in time - rather than having to compute the number of times it would\nrepeat between the start-time and the end-time, you can simply specify the end-time and then use a repeat count of RepeatIndefinitely\n(you could even specify a repeat count of some huge number that is sure to be more than the number of times the trigger will actually\nfire before the end-time arrives).")]),t._v(" "),n("p",[t._v("SimpleTrigger instances are built using "),n("code",[t._v("TriggerBuilder")]),t._v(" (for the trigger's main properties) and "),n("code",[t._v("WithSimpleSchedule")]),t._v(" extension method\n(for the SimpleTrigger-specific properties).")]),t._v(" "),n("p",[n("strong",[t._v("Build a trigger for a specific moment in time, with no repeats:")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// trigger builder creates simple trigger by default, actually an ITrigger is returned")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ISimpleTrigger")]),t._v(" trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ISimpleTrigger"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myStartTime"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// some Date ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"job1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// identify job with name, group strings")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),n("p",[n("strong",[t._v("Build a trigger for a specific moment in time, then repeating every ten seconds ten times:")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger3"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myTimeToStartFiring"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// if a start time is not given (if this line were omitted), "now" is implied')]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInSeconds")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithRepeatCount")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// note that 10 repeats will give a total of 11 firings")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJob"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// identify job with handle to its JobDetail itself ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),n("p",[n("strong",[t._v("Build a trigger that will fire once, five minutes in the future:")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger5"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("FutureDate")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" IntervalUnit"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Minute"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// use DateBuilder to create a date in the future")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobKey"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// identify job with its JobKey")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),n("p",[n("strong",[t._v("Build a trigger that will fire now, then repeat every five minutes, until the hour 22:00:")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger7"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInMinutes")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("EndAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("DateOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),n("p",[n("strong",[t._v("Build a trigger that will fire at the top of the next hour, then repeat every 2 hours, forever:")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger8"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// because group is not specified, "trigger8" will be in the default group')]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("EvenHourDate")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// get the next even-hour (minutes and seconds zero ("00:00"))')]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInHours")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// note that in this example, 'forJob(..)' is not called ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// - which is valid if the trigger is passed to the scheduler along with the job ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" scheduler"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("scheduleJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("trigger"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" job"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),n("p",[t._v("Spend some time looking at all of the available methods in the language defined by "),n("code",[t._v("TriggerBuilder")]),t._v(" and its extension method "),n("code",[t._v("WithSimpleSchedule")]),t._v("\nso that you can be familiar with options available to you that may not have been demonstrated in the examples above.")]),t._v(" "),n("h2",{attrs:{id:"simpletrigger-misfire-instructions"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#simpletrigger-misfire-instructions"}},[t._v("#")]),t._v(" SimpleTrigger Misfire Instructions")]),t._v(" "),n("p",[t._v("SimpleTrigger has several instructions that can be used to inform Quartz.NET what it should do when a misfire occurs.\n(Misfire situations were introduced in the More About Triggers section of this tutorial).\nThese instructions are defined as constants on "),n("code",[t._v("MisfirePolicy.SimpleTrigger")]),t._v(" (including API documentation describing their behavior).\nThe instructions include:")]),t._v(" "),n("p",[n("strong",[t._v("Misfire Instruction Constants for SimpleTrigger")])]),t._v(" "),n("ul",[n("li",[n("code",[t._v("MisfireInstruction.IgnoreMisfirePolicy")])]),t._v(" "),n("li",[n("code",[t._v("MisfirePolicy.SimpleTrigger.FireNow")])]),t._v(" "),n("li",[n("code",[t._v("MisfirePolicy.SimpleTrigger.RescheduleNowWithExistingRepeatCount")])]),t._v(" "),n("li",[n("code",[t._v("MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount")])]),t._v(" "),n("li",[n("code",[t._v("MisfirePolicy.SimpleTrigger.RescheduleNextWithRemainingCount")])]),t._v(" "),n("li",[n("code",[t._v("MisfirePolicy.SimpleTrigger.RescheduleNextWithExistingCount")])])]),t._v(" "),n("p",[t._v("You should recall from the earlier lessons that all triggers have the "),n("code",[t._v("MisfirePolicy.SmartPolicy")]),t._v(" instruction available for use,\nand this instruction is also the default for all trigger types.")]),t._v(" "),n("p",[t._v("If the 'smart policy' instruction is used, SimpleTrigger dynamically chooses between its various MISFIRE instructions, based on the configuration\nand state of the given SimpleTrigger instance. The documentation for the "),n("code",[t._v("SimpleTrigger.UpdateAfterMisfire()")]),t._v(" method explains the exact details of\nthis dynamic behavior.")]),t._v(" "),n("p",[t._v("When building SimpleTriggers, you specify the misfire instruction as part of the simple schedule (via SimpleSchedulerBuilder):")]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger7"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInMinutes")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithMisfireHandlingInstructionNextWithExistingCount")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/125.1873365c.js b/assets/js/125.1873365c.js
new file mode 100644
index 000000000..b162470d7
--- /dev/null
+++ b/assets/js/125.1873365c.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[125],{518:function(t,s,a){"use strict";a.r(s);var e=a(26),n=Object(e.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[t._v("Listeners are objects that you create to perform actions based on events occuring within the scheduler.\nAs you can probably guess, TriggerListeners receive events related to triggers, and JobListeners receive events related to jobs.")]),t._v(" "),a("p",[t._v('Trigger-related events include: trigger firings, trigger mis-firings (discussed in the "Triggers" section of this document),\nand trigger completions (the jobs fired off by the trigger is finished).')]),t._v(" "),a("div",{staticClass:"custom-block danger"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("Make sure your trigger and job listeners never throw an exception (use a try-catch) and that they can handle internal problems.\nJobs can get stuck after Quartz is unable to determine whether required logic in listener was completed successfully when listener notification failed.")])]),t._v(" "),a("p",[a("strong",[t._v("The ITriggerListener Interface")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITriggerListener")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" Name "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t \n\t "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("TriggerFired")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t \n\t "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("bool")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("VetoJobExecution")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t \n\t "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("TriggerMisfired")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t \n\t "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("TriggerComplete")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")])]),t._v(" triggerInstructionCode"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Job-related events include: a notification that the job is about to be executed, and a notification when the job has completed execution.")]),t._v(" "),a("p",[a("strong",[t._v("The IJobListener Interface")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobListener")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" Name "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("JobToBeExecuted")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("JobExecutionVetoed")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("JobWasExecuted")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobExecutionException")]),t._v(" jobException"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])])]),a("h2",{attrs:{id:"using-your-own-listeners"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#using-your-own-listeners"}},[t._v("#")]),t._v(" Using Your Own Listeners")]),t._v(" "),a("p",[t._v("To create a listener, simply create an object the implements either the "),a("code",[t._v("ITriggerListener")]),t._v(" and/or "),a("code",[t._v("IJobListener")]),t._v(" interface.\nListeners are then registered with the scheduler during run time, and must be given a name (or rather, they must advertise their own\nname via their Name property.")]),t._v(" "),a("p",[t._v("For your convenience, rather than implementing those interfaces, your class could also extend the class "),a("code",[t._v("JobListenerSupport")]),t._v(" or "),a("code",[t._v("TriggerListenerSupport")]),t._v("\nand simply override the events you're interested in.")]),t._v(" "),a("p",[t._v("Listeners are registered with the scheduler's "),a("code",[t._v("ListenerManager")]),t._v(" along with a Matcher that describes which Jobs/Triggers the listener wants to receive events for.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("Listeners are registered with the scheduler during run time, and are "),a("strong",[t._v("NOT")]),t._v(" stored in the JobStore along with the jobs and triggers.\nThis is because listeners are typically an integration point with your application.\nHence, each time your application runs, the listeners need to be re-registered with the scheduler.")])]),t._v(" "),a("p",[a("strong",[t._v("Adding a JobListener that is interested in a particular job:")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[t._v("scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ListenerManager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddJobListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobListener"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" KeyMatcher"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("JobKey"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("KeyEquals")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("JobKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJobName"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJobGroup"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Adding a JobListener that is interested in all jobs of a particular group:")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[t._v("scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ListenerManager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddJobListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobListener"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" GroupMatcher"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("JobKey"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GroupEquals")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJobGroup"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Adding a JobListener that is interested in all jobs of two particular groups:")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[t._v("scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ListenerManager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddJobListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobListener"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\tOrMatcher"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("JobKey"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Or")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("GroupMatcher"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("JobKey"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GroupEquals")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJobGroup"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" GroupMatcher"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("JobKey"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GroupEquals")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"yourGroup"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Adding a JobListener that is interested in all jobs:")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[t._v("scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ListenerManager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddJobListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobListener"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" GroupMatcher"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("JobKey"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AnyGroup")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Listeners are not used by most users of Quartz.NET, but are handy when application requirements create the need\nfor the notification of events, without the Job itself explicitly notifying the application.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/126.2b8c172b.js b/assets/js/126.2b8c172b.js
new file mode 100644
index 000000000..b86a3d7cc
--- /dev/null
+++ b/assets/js/126.2b8c172b.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[126],{497:function(t,s,a){"use strict";a.r(s);var n=a(26),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[t._v("Before you can use the scheduler, it needs to be instantiated (who'd have guessed?).\nTo do this, you use an implementor of ISchedulerFactory.")]),t._v(" "),a("p",[t._v("Once a scheduler is instantiated, it can be started, placed in stand-by mode, and shutdown.\nNote that once a scheduler is shutdown, it cannot be restarted without being re-instantiated.\nTriggers do not fire (jobs do not execute) until the scheduler has been started, nor while it is\nin the paused state.")]),t._v(" "),a("p",[t._v("Here's a quick snippet of code, that instantiates and starts a scheduler, and schedules a job for execution:")]),t._v(" "),a("p",[a("strong",[t._v("Using Quartz.NET")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// construct a scheduler factory using defaults")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("StdSchedulerFactory")]),t._v(" factory "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("StdSchedulerFactory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// get a scheduler")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IScheduler")]),t._v(" scheduler "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" factory"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetScheduler")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define the job and tie it to our HelloJob class")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobDetail")]),t._v(" job "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" JobBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("HelloJob"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Trigger the job to run now, and then every 40 seconds")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartNow")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInSeconds")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// You could also schedule multiple triggers for the same job with")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// await scheduler.ScheduleJob(job, new List() { trigger1, trigger2 }, replace: true);")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Configuring scheduler with fluent API")])]),t._v(" "),a("p",[t._v("You can also use SchedulerBuilder fluent API to programmatically configure different aspects of the scheduler.")]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" sched "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" SchedulerBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// default max concurrency is 10")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseDefaultThreadPool")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("MaxConcurrency "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this is the default ")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// .WithMisfireThreshold(TimeSpan.FromSeconds(60))")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UsePersistentStore")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// force job data map values to be considered as strings")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// prevents nasty surprises if object is accidentally serialized and then ")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// serialization format breaks, defaults to false")]),t._v("\n x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UseProperties "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseClustering")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseSqlServer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my connection string"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this requires Quartz.Serialization.Json NuGet package")]),t._v("\n x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseJsonSerializer")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// job initialization plugin handles our xml reading, without it defaults are used")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// requires Quartz.Plugins NuGet package")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("UseXmlSchedulingConfiguration")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Files "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"~/quartz_jobs.xml"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this is the default")]),t._v("\n x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("FailOnFileNotFound "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// this is not the default")]),t._v("\n x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("FailOnSchedulingError "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("BuildScheduler")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("As you can see, working with Quartz.NET is rather simple. In "),a("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/jobs-and-triggers.html"}},[t._v("Lesson 2")]),t._v(" we'll give a quick overview of Jobs and Triggers, so that you can more fully understand this example.")],1)])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/127.ce06c938.js b/assets/js/127.ce06c938.js
new file mode 100644
index 000000000..7a2886afc
--- /dev/null
+++ b/assets/js/127.ce06c938.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[127],{498:function(e,t,a){"use strict";a.r(t);var r=a(26),n=Object(r.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("p",[e._v("You can install Quartz and related packages using "),a("a",{attrs:{href:"https://www.nuget.org/packages/Quartz",target:"_blank",rel:"noopener noreferrer"}},[e._v("NuGet"),a("OutboundLink")],1)]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("Install-Package Quartz\n")])])]),a("p",[e._v("or you can download the "),a("a",{attrs:{href:"https://github.com/quartznet/quartznet/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("ZIP from GitHub releases"),a("OutboundLink")],1),e._v(" which also contains source code and examples.")])])}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/128.853bfa59.js b/assets/js/128.853bfa59.js
new file mode 100644
index 000000000..17ad49e31
--- /dev/null
+++ b/assets/js/128.853bfa59.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[128],{499:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/129.a07b8371.js b/assets/js/129.a07b8371.js
new file mode 100644
index 000000000..f8c472816
--- /dev/null
+++ b/assets/js/129.a07b8371.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[129],{500:function(e,t,i){"use strict";i.r(t);var a=i(26),n=Object(a.a)({},(function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[i("h2",{attrs:{id:"runtime-environments"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#runtime-environments"}},[e._v("#")]),e._v(" Runtime Environments")]),e._v(" "),i("ul",[i("li",[e._v("Quartz.NET can run embedded within another free standing application")]),e._v(" "),i("li",[e._v("Quartz.NET can run as a stand-alone program (within its own .NET virtual machine instance), to be used via .NET Remoting")]),e._v(" "),i("li",[e._v("Quartz.NET can be instantiated as a cluster of stand-alone programs (with load-balance and fail-over capabilities)")])]),e._v(" "),i("h2",{attrs:{id:"job-scheduling"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#job-scheduling"}},[e._v("#")]),e._v(" Job Scheduling")]),e._v(" "),i("p",[e._v("Jobs are scheduled to run when a given Trigger occurs. Triggers can be created with nearly any combination of the following directives:")]),e._v(" "),i("ul",[i("li",[e._v("at a certain time of day (to the millisecond)")]),e._v(" "),i("li",[e._v("on certain days of the week")]),e._v(" "),i("li",[e._v("on certain days of the month")]),e._v(" "),i("li",[e._v("on certain days of the year")]),e._v(" "),i("li",[e._v("not on certain days listed within a registered Calendar (such as business holidays)")]),e._v(" "),i("li",[e._v("repeated a specific number of times")]),e._v(" "),i("li",[e._v("repeated until a specific time/date")]),e._v(" "),i("li",[e._v("repeated indefinitely")]),e._v(" "),i("li",[e._v("repeated with a delay interval")])]),e._v(" "),i("p",[e._v("Jobs are given names by their creator and can also be organized into named groups.\nTriggers may also be given names and placed into groups, in order to easily organize them within the scheduler.\nJobs can be added to the scheduler once, but registered with multiple Triggers.")]),e._v(" "),i("h2",{attrs:{id:"job-execution"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#job-execution"}},[e._v("#")]),e._v(" Job Execution")]),e._v(" "),i("ul",[i("li",[e._v("Jobs can be any .NET class that implements the simple IJob interface, leaving infinite possibilities for the work Jobs can perform.")]),e._v(" "),i("li",[e._v("Job class instances can be instantiated by Quartz.NET, or by your application's framework.")]),e._v(" "),i("li",[e._v("When a Trigger occurs, the scheduler notifies zero or more .NET objects implementing the JobListener and TriggerListener interfaces.\tThese listeners are also notified after the Job has executed.")]),e._v(" "),i("li",[e._v("As Jobs are completed, they return a JobCompletionCode which informs the scheduler of success or failure. The JobCompletionCode can also instruct the scheduler of any actions it should take based on the success/fail code - such as immediate re-execution of the Job.")])]),e._v(" "),i("h2",{attrs:{id:"job-persistence"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#job-persistence"}},[e._v("#")]),e._v(" Job Persistence")]),e._v(" "),i("ul",[i("li",[e._v("The design of Quartz.NET includes a IJobStore interface that can be implemented to provide various mechanisms for the storage of jobs.")]),e._v(" "),i("li",[e._v('With the use of the included AdoJobStore, all Jobs and Triggers configured as "non-volatile" are stored in a relational database via ADO.NET.')]),e._v(" "),i("li",[e._v("With the use of the included RAMJobStore, all Jobs and Triggers are stored in RAM and therefore do not persist between program executions - but this has the advantage of not requiring an external database.")])]),e._v(" "),i("h2",{attrs:{id:"clustering"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#clustering"}},[e._v("#")]),e._v(" Clustering")]),e._v(" "),i("ul",[i("li",[e._v("Fail-over.")]),e._v(" "),i("li",[e._v("Load balancing.")])]),e._v(" "),i("h2",{attrs:{id:"listeners-plug-ins"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#listeners-plug-ins"}},[e._v("#")]),e._v(" Listeners & Plug-Ins")]),e._v(" "),i("ul",[i("li",[e._v("Applications can catch scheduling events to monitor or control job/trigger behavior by implementing one or more listener interfaces.")]),e._v(" "),i("li",[e._v("The Plug-In mechanism can be used add functionality to Quartz, such keeping a history of job executions, or loading job and trigger definitions from a file.")]),e._v(" "),i("li",[e._v('Quartz ships with a number of "factory built" plug-ins and listeners.')])])])}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/13.c53349db.js b/assets/js/13.c53349db.js
new file mode 100644
index 000000000..1d2b4850e
--- /dev/null
+++ b/assets/js/13.c53349db.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{382:function(t,e,s){"use strict";s.r(e);var n=["There's nothing here.","How did we get here?","That's a Four-Oh-Four.","Looks like we've got some broken links."],o={methods:{getMsg:function(){return n[Math.floor(Math.random()*n.length)]}}},i=s(26),h=Object(i.a)(o,(function(){var t=this.$createElement,e=this._self._c||t;return e("div",{staticClass:"theme-container"},[e("div",{staticClass:"theme-default-content"},[e("h1",[this._v("404")]),this._v(" "),e("blockquote",[this._v(this._s(this.getMsg()))]),this._v(" "),e("RouterLink",{attrs:{to:"/"}},[this._v("\n Take me home.\n ")])],1)])}),[],!1,null,null,null);e.default=h.exports}}]);
\ No newline at end of file
diff --git a/assets/js/130.0feef69a.js b/assets/js/130.0feef69a.js
new file mode 100644
index 000000000..9851f0344
--- /dev/null
+++ b/assets/js/130.0feef69a.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[130],{501:function(e,t,s){"use strict";s.r(t);var a=s(26),r=Object(a.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h1",{attrs:{id:"license"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#license"}},[e._v("#")]),e._v(" License")]),e._v(" "),s("p",[e._v("Quartz.NET is licensed under the terms of the Apache License, Version 2.0.")]),e._v(" "),s("p",[s("a",{attrs:{href:"http://www.apache.org/licenses/LICENSE-2.0"}},[e._v("http://www.apache.org/licenses/LICENSE-2.0")]),e._v("\n("),s("a",{attrs:{href:"http://www.apache.org/licenses/LICENSE-2.0.txt"}},[e._v("TXT")]),e._v(" or "),s("a",{attrs:{href:"http://www.apache.org/licenses/LICENSE-2.0.html"}},[e._v("HTML")]),e._v(")")])])}),[],!1,null,null,null);t.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/131.c5fcddc7.js b/assets/js/131.c5fcddc7.js
new file mode 100644
index 000000000..0a4b71c95
--- /dev/null
+++ b/assets/js/131.c5fcddc7.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[131],{502:function(t,e,r){"use strict";r.r(e);var a=r(26),s=Object(a.a)({},(function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("h1",{attrs:{id:"quartz-net-mailing-list"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#quartz-net-mailing-list"}},[t._v("#")]),t._v(" Quartz.NET Mailing List")]),t._v(" "),r("p",[t._v("Quartz.NET mailing list is currently operated on "),r("a",{attrs:{href:"http://groups.google.com/group/quartznet"}},[t._v("Google Groups")]),t._v(".")]),t._v(" "),r("p",[t._v("Please send your questions and other ideas here so we share them with everybody.")]),t._v(" "),r("div",{attrs:{align:"center"}},[r("form",{attrs:{action:"http://groups.google.com/group/quartznet/boxsubscribe"}},[r("table",{staticStyle:{"background-color":"#fff",padding:"5px"},attrs:{border:"0",cellspacing:"0"}},[r("tr",[r("td",{staticStyle:{"padding-left":"5px"}},[r("b",[t._v("Subscribe to Quartz.NET")])])]),t._v(" "),r("input",{attrs:{type:"hidden",name:"hl",value:"en"}}),t._v(" "),r("tr",[r("td",{staticStyle:{"padding-left":"5px"}},[t._v("\n\t\t\t\t\t\tEmail: "),r("input",{attrs:{type:"text",name:"email"}}),t._v(" "),r("input",{attrs:{type:"submit",name:"sub",value:"Subscribe"}})])]),t._v(" "),r("tr",[r("td",{attrs:{align:"right"}},[r("a",{attrs:{href:"http://groups.google.com/group/quartznet?hl=en"}},[t._v("Visit this group")])])])])])])])}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/132.13fbd625.js b/assets/js/132.13fbd625.js
new file mode 100644
index 000000000..49d4ddd4a
--- /dev/null
+++ b/assets/js/132.13fbd625.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[132],{503:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/133.f3d14f4d.js b/assets/js/133.f3d14f4d.js
new file mode 100644
index 000000000..4b3585a22
--- /dev/null
+++ b/assets/js/133.f3d14f4d.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[133],{504:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/134.320abb38.js b/assets/js/134.320abb38.js
new file mode 100644
index 000000000..84f0d8e77
--- /dev/null
+++ b/assets/js/134.320abb38.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[134],{505:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/135.be16f19a.js b/assets/js/135.be16f19a.js
new file mode 100644
index 000000000..329802099
--- /dev/null
+++ b/assets/js/135.be16f19a.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[135],{506:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/136.de2948c9.js b/assets/js/136.de2948c9.js
new file mode 100644
index 000000000..ad1f6400d
--- /dev/null
+++ b/assets/js/136.de2948c9.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[136],{507:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/137.52cca593.js b/assets/js/137.52cca593.js
new file mode 100644
index 000000000..6392e5bff
--- /dev/null
+++ b/assets/js/137.52cca593.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[137],{508:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/138.272768ba.js b/assets/js/138.272768ba.js
new file mode 100644
index 000000000..0290f459b
--- /dev/null
+++ b/assets/js/138.272768ba.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[138],{509:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/139.cb00fd64.js b/assets/js/139.cb00fd64.js
new file mode 100644
index 000000000..c33fcb371
--- /dev/null
+++ b/assets/js/139.cb00fd64.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[139],{510:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/14.6535f905.js b/assets/js/14.6535f905.js
new file mode 100644
index 000000000..787d5cef0
--- /dev/null
+++ b/assets/js/14.6535f905.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{388:function(t,s,e){"use strict";e.r(s);var a=e(26),r=Object(a.a)({},(function(){var t=this.$createElement,s=this._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[s("p",[this._v("Quartz.NET is a full-featured, open source job scheduling system that can be used from smallest apps to large scale enterprise systems.")]),this._v(" "),s("h3",{attrs:{id:"latest-news"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#latest-news"}},[this._v("#")]),this._v(" Latest News")]),this._v(" "),s("BlogExcerpt")],1)}),[],!1,null,null,null);s.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/140.e168ce8e.js b/assets/js/140.e168ce8e.js
new file mode 100644
index 000000000..0bec1bb38
--- /dev/null
+++ b/assets/js/140.e168ce8e.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[140],{511:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/141.66280f26.js b/assets/js/141.66280f26.js
new file mode 100644
index 000000000..f042af66d
--- /dev/null
+++ b/assets/js/141.66280f26.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[141],{512:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/142.2f9f56f4.js b/assets/js/142.2f9f56f4.js
new file mode 100644
index 000000000..64b27de35
--- /dev/null
+++ b/assets/js/142.2f9f56f4.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[142],{513:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/143.35b86cf0.js b/assets/js/143.35b86cf0.js
new file mode 100644
index 000000000..d89e2d632
--- /dev/null
+++ b/assets/js/143.35b86cf0.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[143],{514:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/144.419ebf8f.js b/assets/js/144.419ebf8f.js
new file mode 100644
index 000000000..c9d6d057e
--- /dev/null
+++ b/assets/js/144.419ebf8f.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[144],{515:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/145.4e24e5c4.js b/assets/js/145.4e24e5c4.js
new file mode 100644
index 000000000..21d5461fa
--- /dev/null
+++ b/assets/js/145.4e24e5c4.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[145],{516:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/146.ec8464bd.js b/assets/js/146.ec8464bd.js
new file mode 100644
index 000000000..3580a8dcb
--- /dev/null
+++ b/assets/js/146.ec8464bd.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[146],{517:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/15.e0899e5a.js b/assets/js/15.e0899e5a.js
new file mode 100644
index 000000000..557d98b3f
--- /dev/null
+++ b/assets/js/15.e0899e5a.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[15],{389:function(e,t,r){"use strict";r.r(t);var a=r(26),o=Object(a.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("p",[e._v("Quartz.NET 2.0 has finally been released. Quartz.NET 2.0 introduces a new more interfaced based model of operating with the API, lots of performance improvements and bug fixes to issues found in 1.0.x line.")]),e._v(" "),r("p",[r("strong",[e._v("BREAKING CHANGES")])]),e._v(" "),r("ul",[r("li",[e._v(".NET 1.1 and 2.0 support is dropped")]),e._v(" "),r("li",[e._v("Quartz.NET now needs .NET version 3.5 SP1 or later to run due to use of new language features and classes")]),e._v(" "),r("li",[e._v("Many public interface methods have changed from returning arrays to generic IList or ISet interfaces")]),e._v(" "),r("li",[e._v("TriggerBuilder implementations and JobBuilder should now be used to create different job and trigger definitions")]),e._v(" "),r("li",[e._v("Introduced IJobDetail, IContrigger, ISimpleTrigger, ICalendarIntervalTrigger have far less members and especially mutators")]),e._v(" "),r("li",[e._v("When C5 collections were introduced as set-based implementation provider, ISet and ISortedSet interfaces were narrowed (IList inheritance removed)")]),e._v(" "),r("li",[e._v("string triggerName, string triggerGroup are now encapsulated in TriggerKey (has the same fields)")]),e._v(" "),r("li",[e._v("string jobName, string jobGroup are now encapsulated in JobKey (has the same fields)")]),e._v(" "),r("li",[e._v("JobInitializationPlugin is now deprecated in favor of XMLSchedulingDataProcessorPlugin, JobInitializationPlugin no longer included")]),e._v(" "),r("li",[e._v("Microsoft's Oracle drivers are no longer supported, use 10g or 11g ODP.NET drivers")]),e._v(" "),r("li",[e._v("Database schema has changed, you need to convert your 1.x schema to new version, sample migration script available in database folder")])]),e._v(" "),r("p",[r("strong",[e._v("OTHER NOTABLE CHANGES")])]),e._v(" "),r("ul",[r("li",[e._v("XMLSchedulingDataProcessorPlugin uses new XML format that allows more control over triggers but no support for calendars")]),e._v(" "),r("li",[e._v("There are extension methods for the new trigger builder that allow you to set trigger specifics")]),e._v(" "),r("li",[e._v("Client Profile is now supported and there are now separate DLLs for client profile")]),e._v(" "),r("li",[e._v("PropertySettingJobFactory is now the default JobFactory")])]),e._v(" "),r("p",[e._v("Please see the "),r("a",{attrs:{href:"https://raw.github.com/quartznet/quartznet/master/changelog.txt",target:"_blank",rel:"noopener noreferrer"}},[e._v("change log"),r("OutboundLink")],1),e._v(" for complete list of changes.")]),e._v(" "),r("p",[e._v("Quartz.NET is also available as NuGet package. You can install it with command:")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",[r("code",[e._v("Install-Package Quartz\n")])])]),r("p",[e._v("This version corresponds to Java Quartz's version 2.1.")]),e._v(" "),r("p",[e._v("Big thanks to Quartz.NET community that has sumbitted pull requests, patches, bug reports and for being so active and making the 2.0 release possible!")]),e._v(" "),r("p",[e._v("There's a first version of "),r("RouterLink",{attrs:{to:"/documentation/quartz-2.x/migration-guide.html"}},[e._v("migration guide")]),e._v(" but the tutorial hasn't been updated yet. You can also always check "),r("a",{attrs:{href:"http://www.quartz-scheduler.org/documentation",target:"_blank",rel:"noopener noreferrer"}},[e._v("Java Quartz's documentation"),r("OutboundLink")],1),e._v(".")],1),e._v(" "),r("Download")],1)}),[],!1,null,null,null);t.default=o.exports}}]);
\ No newline at end of file
diff --git a/assets/js/16.5066eada.js b/assets/js/16.5066eada.js
new file mode 100644
index 000000000..c066504d7
--- /dev/null
+++ b/assets/js/16.5066eada.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{390:function(e,t,n){"use strict";n.r(t);var i=n(26),l=Object(i.a)({},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("p",[e._v("This is a maintenance release containing a critical fix to Oracle job store support.")]),e._v(" "),n("p",[n("strong",[e._v("FIXES")])]),e._v(" "),n("ul",[n("li",[e._v("Oracle database support broken")]),e._v(" "),n("li",[e._v("Incorrect .NET 4.5 requirement in 4.0 build (only NuGet affected)")]),e._v(" "),n("li",[e._v("XML validation fails as schema not embedded (only NuGet affected)")]),e._v(" "),n("li",[e._v("ObjectUtils.SetPropertyValue fails with explicitly implemented interface members")])]),e._v(" "),n("Download")],1)}),[],!1,null,null,null);t.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/17.2cd0575f.js b/assets/js/17.2cd0575f.js
new file mode 100644
index 000000000..a7c1f7c04
--- /dev/null
+++ b/assets/js/17.2cd0575f.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{391:function(e,n,r){"use strict";r.r(n);var i=r(26),o=Object(i.a)({},(function(){var e=this,n=e.$createElement,r=e._self._c||n;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("p",[e._v("To welcome year 2013 we are releasing new and improved version of Quart.NET!\nThis release contains important bug fixes, new functionality and minor breaking changes.")]),e._v(" "),r("ul",[r("li",[e._v("C5 depedency is now internalized and allows you to use whatever version you want outside of Quartz.")]),e._v(" "),r("li",[e._v("Custom IJobFactory implementations now need to implement new method void ReturnJob(IJob job) for container managed cleanup.")]),e._v(" "),r("li",[e._v("NthIncludedDayTrigger was removed as it was accidentally left behind even though being legacy and replaced by DailyTimeIntervalTrigger.")])]),e._v(" "),r("p",[r("strong",[e._v("NEW FEATURES")])]),e._v(" "),r("ul",[r("li",[e._v("TimeZone support for calendars / Andrew Smith")]),e._v(" "),r("li",[e._v("Allow scheduling relative to replaced trigger with XML configuration")]),e._v(" "),r("li",[e._v("Add method to IJobFactory to destroy a job instance created by the factory breaking / minor breaking, added new required method")]),e._v(" "),r("li",[e._v("Internalize C5 dependency")]),e._v(" "),r("li",[e._v("Support for Oracle ODP 11.2 Release 4")]),e._v(" "),r("li",[e._v("Upgrade SQLite dependency to version 1.0.83")]),e._v(" "),r("li",[e._v("Upgrade to Common.Logging 2.1.2")])]),e._v(" "),r("p",[r("strong",[e._v("FIXES")])]),e._v(" "),r("ul",[r("li",[e._v("Scheduled Shutdown blocked even if waitForJobsToComplete is false")]),e._v(" "),r("li",[e._v("DailyTimeIntervalTriggerImpl should be serializable")]),e._v(" "),r("li",[e._v('InstanceID = "AUTO" may cause "String or binary data would be truncated" error on qrtz_fired_triggers.entry_id')]),e._v(" "),r("li",[e._v("PlugInExample doesn't execute any jobs")]),e._v(" "),r("li",[e._v("Recovering triggers have empty/incorrect JobDataMap")]),e._v(" "),r("li",[e._v("Make Quartz.NET work under medium trust when running .NET 3.5")]),e._v(" "),r("li",[e._v("tables_oracle.sql uses deprecated VARCHAR type")]),e._v(" "),r("li",[e._v("Improve error reporting for database connection failure")]),e._v(" "),r("li",[e._v("Scheduler Shutdown Freezes when There are Jobs Still Running")]),e._v(" "),r("li",[e._v("Use System.Version instead of FileVersionInfo to retive current Quartz version")]),e._v(" "),r("li",[e._v("DailyTimeIntervalTriggerImpl Validate broken")])]),e._v(" "),r("p",[r("strong",[e._v("BREAKING CHANGES")])]),e._v(" "),r("ul",[r("li",[e._v("Remove NthIncludedDayTrigger that was supposed to be removed in 2.0")]),e._v(" "),r("li",[e._v("Remove Visual Studio 2008 solutions and projects")]),e._v(" "),r("li",[e._v("Add support for DateTimeOffset and TimeSpan to JobDataMap / minor breaking - cleanup of API")])]),e._v(" "),r("p",[e._v("Special thanks to Andrew Smith for working hard on TimeZone support. Credits go also to our vibrant community actively helping on mailing list and reporting issues and creating pull requests.")]),e._v(" "),r("Download")],1)}),[],!1,null,null,null);n.default=o.exports}}]);
\ No newline at end of file
diff --git a/assets/js/18.729d30ae.js b/assets/js/18.729d30ae.js
new file mode 100644
index 000000000..120dcfdb1
--- /dev/null
+++ b/assets/js/18.729d30ae.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{392:function(t,s,e){"use strict";e.r(s);var n=e(26),i=Object(n.a)({},(function(){var t=this.$createElement,s=this._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[s("p",[this._v("This is a maintenance release containing strongly singed dlls.")]),this._v(" "),s("p",[s("strong",[this._v("FIXES")])]),this._v(" "),s("ul",[s("li",[this._v("assemblies are missing strong name due to error in ilmerge parameters")])]),this._v(" "),s("Download")],1)}),[],!1,null,null,null);s.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/19.e79f2201.js b/assets/js/19.e79f2201.js
new file mode 100644
index 000000000..1709b7df4
--- /dev/null
+++ b/assets/js/19.e79f2201.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{393:function(e,t,i){"use strict";i.r(t);var s=i(26),n=Object(s.a)({},(function(){var e=this.$createElement,t=this._self._c||e;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("p",[this._v("This is a maintenance release fixing issue where .NET 4.0 DLLs required 4.5 runtime due to ilmerge missing special framework parameter.")]),this._v(" "),t("p",[t("strong",[this._v("FIXES")])]),this._v(" "),t("ul",[t("li",[this._v("TypeLoadException: Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' with .NET 4.0")])]),this._v(" "),t("Download")],1)}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/20.649245c0.js b/assets/js/20.649245c0.js
new file mode 100644
index 000000000..7464532a0
--- /dev/null
+++ b/assets/js/20.649245c0.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{394:function(e,t,r){"use strict";r.r(t);var o=r(26),i=Object(o.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("p",[e._v("This release contains important bug fixes, new functionality and minor breaking changes.")]),e._v(" "),r("p",[r("strong",[e._v("UPGRADING")])]),e._v(" "),r("p",[e._v("Please examine and run the database\\schema_20_to_22_upgrade.sql script if you are using AdoJobStore\nthis script adds a new column SCHED_TIME to table QRTZ_FIRED_TRIGGERS\nfile contains the alter command for SQL Server and other database samples in comments")]),e._v(" "),r("p",[r("strong",[e._v("BREAKING CHANGES")])]),e._v(" "),r("ul",[r("li",[e._v("database schema needs upgrade")]),e._v(" "),r("li",[e._v("add SchedulerStarting() method to ISchedulerListener interface")]),e._v(" "),r("li",[e._v("make the scheduler's TypeLoadHelper available to plugins when they are initialized")]),e._v(" "),r("li",[e._v("dbFailureRetryInterval parameter was removed from DirectSchedulerFactory APIs")])]),e._v(" "),r("p",[r("strong",[e._v("NEW FEATURES")])]),e._v(" "),r("ul",[r("li",[e._v("ability to override worker thread names (when using SimpleThreadPool)")]),e._v(" "),r("li",[e._v("add new IScheduler method: ScheduleJob(IJobDetail job, ISet trigger) to schedule multiple triggers for a job all at once")]),e._v(" "),r("li",[e._v("allow 'triggerless' initial storing of non-durable jobs.")]),e._v(" "),r("li",[e._v("improvements for job recovery information")]),e._v(" "),r("li",[e._v("package job_scheduling_data_2_0.xsd to nuget package's content folder")]),e._v(" "),r("li",[e._v("allow scheduler exported with remoting to be used from local machine only")]),e._v(" "),r("li",[e._v("support for Oracle managed ODP driver")])]),e._v(" "),r("p",[r("strong",[e._v("FIXES")])]),e._v(" "),r("ul",[r("li",[e._v("job ending with exception and trigger not going to fire again, trigger is incorrectly not removed from job store")]),e._v(" "),r("li",[e._v("XML schema supports multiple schedule elements but processor does not")]),e._v(" "),r("li",[e._v("DailyTimeIntervalTriggerPersistenceDelegate does not handle empty time interval properly")]),e._v(" "),r("li",[e._v("DailyTimeIntervalScheduleBuilder.EndingDailyAfterCount(...) doesn't pass validation")]),e._v(" "),r("li",[e._v("trace throwing exception")]),e._v(" "),r("li",[e._v("bug in QuartzSchedulerThread.GetRandomizedIdleWaitTime()")]),e._v(" "),r("li",[e._v("can't delete or replace job without the referenced class")])]),e._v(" "),r("p",[r("strong",[e._v("MISC")])]),e._v(" "),r("ul",[r("li",[e._v("Performance improvements, including improvements to some select statements in AdoJobStore")])]),e._v(" "),r("Download")],1)}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/21.1a3614c5.js b/assets/js/21.1a3614c5.js
new file mode 100644
index 000000000..37f6bc60e
--- /dev/null
+++ b/assets/js/21.1a3614c5.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{395:function(e,t,r){"use strict";r.r(t);var i=r(26),o=Object(i.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("p",[e._v("This is a minor release containing mostly bug fixes.")]),e._v(" "),r("p",[r("strong",[e._v("NEW FEATURES")])]),e._v(" "),r("ul",[r("li",[e._v("GroupMatcher.AnyGroup() support")]),e._v(" "),r("li",[e._v("Add network credential and SMTP port definition support to SendMailJob")])]),e._v(" "),r("p",[r("strong",[e._v("FIXES")])]),e._v(" "),r("ul",[r("li",[e._v("SchedulerException constructor unnecessarily uses Exception.ToString as message")]),e._v(" "),r("li",[e._v("Thread name prefix for thread pool is not set")]),e._v(" "),r("li",[e._v("Triggers should not be excluded based on the fire time of the first selected trigger")]),e._v(" "),r("li",[e._v("Quarts server does not properly log possible exception when starting the service")]),e._v(" "),r("li",[e._v("DailyTimeIntervalTrigger GetFireTimeAfter produces incorrect result when date is in the past")]),e._v(" "),r("li",[e._v("batchTriggerAcquisitionMaxCount acquires one trigger unless batchTriggerAcquisitionFireAheadTimeWindow is also set")]),e._v(" "),r("li",[e._v("Oracle ODP Managed provider should set BindByName to true for OracleCommands")])]),e._v(" "),r("Download")],1)}),[],!1,null,null,null);t.default=o.exports}}]);
\ No newline at end of file
diff --git a/assets/js/22.8a66bf8f.js b/assets/js/22.8a66bf8f.js
new file mode 100644
index 000000000..def4720d6
--- /dev/null
+++ b/assets/js/22.8a66bf8f.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{396:function(t,e,s){"use strict";s.r(e);var n=s(26),o=Object(n.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("The whole website has moved to using GitHub pages. It should be now easier to contribute to documentation, the tutorial for version 2.x is currently in the works so stay tuned. You can fork and create pull requests from the "),e("a",{attrs:{href:"https://github.com/quartznet/quartznet/tree/gh-pages",target:"_blank",rel:"noopener noreferrer"}},[this._v("gh-pages branch of the repository"),e("OutboundLink")],1),this._v(".")]),this._v(" "),e("p",[this._v("There still might be some small glitches with links and content.")])])}),[],!1,null,null,null);e.default=o.exports}}]);
\ No newline at end of file
diff --git a/assets/js/23.e7ae5d25.js b/assets/js/23.e7ae5d25.js
new file mode 100644
index 000000000..b7babb36e
--- /dev/null
+++ b/assets/js/23.e7ae5d25.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{397:function(t,e,n){"use strict";n.r(e);var s=n(26),o=Object(s.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("With the latest switch to GitHub Pages it's been a joy to create content. There tutorial has now been split\nto two separate tutorials for Quartz.NET 1.x and 2.x respectively.")]),this._v(" "),e("p",[e("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/index.html"}},[this._v("Check the new tutorial with the 2.x API changes")])],1)])}),[],!1,null,null,null);e.default=o.exports}}]);
\ No newline at end of file
diff --git a/assets/js/24.cde296f3.js b/assets/js/24.cde296f3.js
new file mode 100644
index 000000000..4937470eb
--- /dev/null
+++ b/assets/js/24.cde296f3.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{398:function(e,t,i){"use strict";i.r(t);var n=i(26),r=Object(n.a)({},(function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[i("p",[e._v("This is a minor release fixing couple of minor bugs.")]),e._v(" "),i("p",[i("strong",[e._v("FIXES")])]),e._v(" "),i("ul",[i("li",[e._v("long properties incorrectly read as int in SimplePropertiesTriggerPersistenceDelegateSupport")]),e._v(" "),i("li",[e._v("RecoveringTriggerKey in JobExecutionContext has group and name wrong way around")]),e._v(" "),i("li",[e._v("Make SQL Server table create script Azure SQL compliant")]),e._v(" "),i("li",[e._v("Add missing clustered index for QRTZ_BLOB_TRIGGERS table\n** You need to manually add this to existing installation (tables created with old script), see ALTER TABLE [dbo].QRTZ_BLOB_TRIGGERS WITH NOCHECK ADD... in script")])]),e._v(" "),i("Download")],1)}),[],!1,null,null,null);t.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/25.346eb63b.js b/assets/js/25.346eb63b.js
new file mode 100644
index 000000000..f45882fd5
--- /dev/null
+++ b/assets/js/25.346eb63b.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{399:function(e,t,o){"use strict";o.r(t);var r=o(26),n=Object(r.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v("This is a bug fix release which has some critical fixes, especially for CalendarIntevalTrigger\nfuture date calculation and trigger's next fires not being processed in a timely fashion when AdoJobStore is used\nwith DisallowConcurrentExecutionAttribute and trigger has short repeat interval.")]),e._v(" "),o("p",[e._v("This update is highly recommended for all users.")]),e._v(" "),o("p",[o("strong",[e._v("FIXES")])]),e._v(" "),o("ul",[o("li",[e._v("StdAdoConstants.SqlSelectSchedulerStates does not filter on the SCHED_NAME column")]),e._v(" "),o("li",[e._v("CalendarIntervalTrigger produces incorrect schedule")]),e._v(" "),o("li",[e._v("Trigger completion signaling from AdoJobStore does not work properly when DisallowConcurrentExecution is set")])]),e._v(" "),o("p",[o("strong",[e._v("NEW FEATURES")])]),e._v(" "),o("ul",[o("li",[e._v("IDisposable jobs should be disposed after execution")]),e._v(" "),o("li",[e._v("Support for defining DbMetadata via App.config's quartz section")])]),e._v(" "),o("Download")],1)}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/26.4a2442fe.js b/assets/js/26.4a2442fe.js
new file mode 100644
index 000000000..a7e132abd
--- /dev/null
+++ b/assets/js/26.4a2442fe.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[26],{400:function(e,t,s){"use strict";s.r(t);var i=s(26),n=Object(i.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("p",[e._v("This is a bug fix release addressing some minor issues.")]),e._v(" "),s("p",[s("strong",[e._v("FIXES")])]),e._v(" "),s("ul",[s("li",[e._v("Cannot register trigger persistence delegates with assembly qualified names")]),e._v(" "),s("li",[e._v("Set example server's current directory to the one where server.exe is")]),e._v(" "),s("li",[e._v("Fix TimeZoneInfo.GetUtcOffset(DateTimeOffset dateTimeOffset) not implemented in Mono")]),e._v(" "),s("li",[e._v("Gracefully handle mixed useProperties usage when reading from DB when useproperties value has changed")]),e._v(" "),s("li",[e._v("FindSystemTimeZoneById should work with both 'Coordinated Universal Time' and 'UTC'")]),e._v(" "),s("li",[e._v("Latest release (2.2.3) didn't include Dbprovider constant string in StdSchedulerFactory - running examples fails")])]),e._v(" "),s("Download")],1)}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/27.1ced7f91.js b/assets/js/27.1ced7f91.js
new file mode 100644
index 000000000..e52e21a63
--- /dev/null
+++ b/assets/js/27.1ced7f91.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{401:function(e,i,t){"use strict";t.r(i);var r=t(26),n=Object(r.a)({},(function(){var e=this,i=e.$createElement,t=e._self._c||i;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("This is a bug fix release with some changes that warrant a minor version increment.")]),e._v(" "),t("p",[t("strong",[e._v("NEW FEATURE")])]),e._v(" "),t("ul",[t("li",[e._v("Upgrade to Common.Logging 2.3.1")]),e._v(" "),t("li",[e._v("Add ability to check if calendar exists in job store")]),e._v(" "),t("li",[e._v("Add FirebirdDelegate and update Firebird driver")])]),e._v(" "),t("p",[t("strong",[e._v("FIXES")])]),e._v(" "),t("ul",[t("li",[e._v("DailyTimeIntervalTriggerImpl fires twice during daylight saving time day")]),e._v(" "),t("li",[e._v("No wait time between db connection failures with AcquireNextTriggers causes excessive logging")]),e._v(" "),t("li",[e._v("Configure the quartz server in the "),t("code",[e._v("")]),e._v(" section fails")]),e._v(" "),t("li",[e._v("CronExpression ctor incorrectly uses the non-uppercased string")]),e._v(" "),t("li",[e._v("Triggers fired milliseconds too early")]),e._v(" "),t("li",[e._v("Loading of Quartz 4.0 DLL fails on systems with no .NET 4.5 installed")])]),e._v(" "),t("Download")],1)}),[],!1,null,null,null);i.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/28.8cf196b8.js b/assets/js/28.8cf196b8.js
new file mode 100644
index 000000000..de331d425
--- /dev/null
+++ b/assets/js/28.8cf196b8.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[28],{402:function(e,t,o){"use strict";o.r(t);var r=o(26),i=Object(r.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v("This is a bug fix release with upgraded Common.Logging dependency, also problems running\nunder .NET 4.0 should now be finally fixed.")]),e._v(" "),o("p",[o("strong",[e._v("NEW FEATURE")])]),e._v(" "),o("ul",[o("li",[e._v("Upgrade to Common.Logging 3.0.0")])]),e._v(" "),o("p",[o("strong",[e._v("FIXES")])]),e._v(" "),o("ul",[o("li",[e._v("JobDetailImpl members should be virtual")]),e._v(" "),o("li",[e._v("Triggers do not transition to error state in AdoJobStore when job retrieval fails during trigger acquisition")]),e._v(" "),o("li",[e._v("Quartz.Server.exe.config refers to wrong Common.Logging.Log4Net assembly")]),e._v(" "),o("li",[e._v("Incorrect NextFireTime when 'schedule-trigger-relative-to-replaced-trigger' = 'true'")]),e._v(" "),o("li",[e._v("Could not load type 'System.Runtime.CompilerServices.ExtensionAttribute' from assembly mscorlib")]),e._v(" "),o("li",[e._v("TriggerBuilder.UsingJobData(JobDataMap newJobDataMap) should ovewrite existing data")])]),e._v(" "),o("Download")],1)}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/29.d3bbf14c.js b/assets/js/29.d3bbf14c.js
new file mode 100644
index 000000000..55500dbd4
--- /dev/null
+++ b/assets/js/29.d3bbf14c.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{403:function(e,r,n){"use strict";n.r(r);var l=n(26),t=Object(l.a)({},(function(){var e=this,r=e.$createElement,n=e._self._c||r;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("p",[e._v("This is a minor release containing mostly bug fixes.")]),e._v(" "),n("p",[n("strong",[e._v("NEW FEATURE")])]),e._v(" "),n("ul",[n("li",[e._v("Add mysql 6.9.5 provider support")])]),e._v(" "),n("p",[n("strong",[e._v("FIXES")])]),e._v(" "),n("ul",[n("li",[e._v("Avoid unnecessary object allocations in CronExpression")]),e._v(" "),n("li",[e._v("CalendarIntervalTrigger and DailyTimeIntervalTrigger produce incorrect schedule builders")]),e._v(" "),n("li",[e._v("Incorrect multiplication factor in DailyTimeIntervalScheduleBuilder.EndingDailyAfterCount()")]),e._v(" "),n("li",[e._v("AnnualCalendar SetDayExcluded does not update internal data structures if base calendar excludes date")]),e._v(" "),n("li",[e._v("Ensure IDriverDelegate members in StdAdoDelegate are virtual")]),e._v(" "),n("li",[e._v("Several XML documentation spelling error fixes")])]),e._v(" "),n("Download")],1)}),[],!1,null,null,null);r.default=t.exports}}]);
\ No newline at end of file
diff --git a/assets/js/3.836353be.js b/assets/js/3.836353be.js
new file mode 100644
index 000000000..c055b529a
--- /dev/null
+++ b/assets/js/3.836353be.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{319:function(t,e,n){"use strict";n.d(e,"d",(function(){return r})),n.d(e,"a",(function(){return a})),n.d(e,"i",(function(){return s})),n.d(e,"f",(function(){return u})),n.d(e,"g",(function(){return l})),n.d(e,"h",(function(){return c})),n.d(e,"b",(function(){return h})),n.d(e,"e",(function(){return f})),n.d(e,"k",(function(){return p})),n.d(e,"l",(function(){return d})),n.d(e,"c",(function(){return v})),n.d(e,"j",(function(){return m}));n(50),n(70),n(320),n(321),n(179),n(49),n(72),n(73),n(27),n(101),n(170);var r=/#.*$/,i=/\.(md|html)$/,a=/\/$/,s=/^[a-z]+:/i;function o(t){return decodeURI(t).replace(r,"").replace(i,"")}function u(t){return s.test(t)}function l(t){return/^mailto:/.test(t)}function c(t){return/^tel:/.test(t)}function h(t){if(u(t))return t;var e=t.match(r),n=e?e[0]:"",i=o(t);return a.test(i)?t:i+".html"+n}function f(t,e){var n=decodeURIComponent(t.hash),i=function(t){var e=t.match(r);if(e)return e[0]}(e);return(!i||n===i)&&o(t.path)===o(e)}function p(t,e,n){if(u(e))return{type:"external",path:e};n&&(e=function(t,e,n){var r=t.charAt(0);if("/"===r)return t;if("?"===r||"#"===r)return e+t;var i=e.split("/");n&&i[i.length-1]||i.pop();for(var a=t.replace(/^\//,"").split("/"),s=0;s3&&void 0!==arguments[3]?arguments[3]:1;if("string"==typeof e)return p(n,e,r);if(Array.isArray(e))return Object.assign(p(n,e[0],r),{title:e[1]});var a=e.children||[];return 0===a.length&&e.path?Object.assign(p(n,e.path,r),{title:e.title}):{type:"group",path:e.path,title:e.title,sidebarDepth:e.sidebarDepth,initialOpenGroupIndex:e.initialOpenGroupIndex,children:a.map((function(e){return t(e,n,r,i+1)})),collapsable:!1!==e.collapsable}}(t,i,l)})):[]}return[]}function g(t){var e=v(t.headers||[]);return[{type:"group",collapsable:!1,title:t.title,path:null,children:e.map((function(e){return{type:"auto",title:e.title,basePath:t.path,path:t.path+"#"+e.slug,children:e.children||[]}}))}]}function v(t){var e;return(t=t.map((function(t){return Object.assign({},t)}))).forEach((function(t){2===t.level?e=t:e&&(e.children||(e.children=[])).push(t)})),t.filter((function(t){return 2===t.level}))}function m(t){return Object.assign(t,{type:t.items&&t.items.length?"links":"link"})}},320:function(t,e,n){"use strict";var r=n(176),i=n(5),a=n(14),s=n(21),o=n(177),u=n(178);r("match",1,(function(t,e,n){return[function(e){var n=s(this),r=null==e?void 0:e[t];return void 0!==r?r.call(e,n):new RegExp(e)[t](String(n))},function(t){var r=n(e,t,this);if(r.done)return r.value;var s=i(t),l=String(this);if(!s.global)return u(s,l);var c=s.unicode;s.lastIndex=0;for(var h,f=[],p=0;null!==(h=u(s,l));){var d=String(h[0]);f[p]=d,""===d&&(s.lastIndex=o(l,a(s.lastIndex),c)),p++}return 0===p?null:f}]}))},321:function(t,e,n){"use strict";var r=n(176),i=n(173),a=n(5),s=n(21),o=n(105),u=n(177),l=n(14),c=n(178),h=n(109),f=n(175).UNSUPPORTED_Y,p=[].push,d=Math.min;r("split",2,(function(t,e,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,n){var r=String(s(this)),a=void 0===n?4294967295:n>>>0;if(0===a)return[];if(void 0===t)return[r];if(!i(t))return e.call(r,t,a);for(var o,u,l,c=[],f=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),d=0,g=new RegExp(t.source,f+"g");(o=h.call(g,r))&&!((u=g.lastIndex)>d&&(c.push(r.slice(d,o.index)),o.length>1&&o.index=a));)g.lastIndex===o.index&&g.lastIndex++;return d===r.length?!l&&g.test("")||c.push(""):c.push(r.slice(d)),c.length>a?c.slice(0,a):c}:"0".split(void 0,0).length?function(t,n){return void 0===t&&0===n?[]:e.call(this,t,n)}:e,[function(e,n){var i=s(this),a=null==e?void 0:e[t];return void 0!==a?a.call(e,i,n):r.call(String(i),e,n)},function(t,i){var s=n(r,t,this,i,r!==e);if(s.done)return s.value;var h=a(t),p=String(this),g=o(h,RegExp),v=h.unicode,m=(h.ignoreCase?"i":"")+(h.multiline?"m":"")+(h.unicode?"u":"")+(f?"g":"y"),b=new g(f?"^(?:"+h.source+")":h,m),k=void 0===i?4294967295:i>>>0;if(0===k)return[];if(0===p.length)return null===c(b,p)?[p]:[];for(var y=0,_=0,x=[];_-1)&&(e=e.replace(/y/g,""));var o=s(_?new m(t,e):m(t,e),r?this:b,L);return x&&n&&d(o,{sticky:n}),o},w=function(t){t in L||o(L,t,{configurable:!0,get:function(){return m[t]},set:function(e){m[t]=e}})},C=u(m),S=0;C.length>S;)w(C[S++]);b.constructor=L,L.prototype=b,f(i,"RegExp",L)}g("RegExp")},327:function(t,e,n){"use strict";var r=n(11),i=n(5),a=n(1),s=n(174),o=RegExp.prototype,u=o.toString,l=a((function(){return"/a/b"!=u.call({source:"a",flags:"b"})})),c="toString"!=u.name;(l||c)&&r(RegExp.prototype,"toString",(function(){var t=i(this),e=String(t.source),n=t.flags;return"/"+e+"/"+String(void 0===n&&t instanceof RegExp&&!("flags"in o)?s.call(t):n)}),{unsafe:!0})},328:function(t,e,n){},329:function(t,e,n){},330:function(t,e,n){},331:function(t,e,n){},332:function(t,e,n){},333:function(t,e,n){},334:function(t,e){t.exports=function(t){return null==t}},335:function(t,e,n){},336:function(t,e,n){},337:function(t,e,n){},338:function(t,e,n){},339:function(t,e,n){},340:function(t,e,n){},344:function(t,e,n){"use strict";n.r(e);n(99);var r=n(319),i={name:"SidebarGroup",components:{DropdownTransition:n(345).a},props:["item","open","collapsable","depth"],beforeCreate:function(){this.$options.components.SidebarLinks=n(344).default},methods:{isActive:r.e}},a=(n(371),n(26)),s=Object(a.a)(i,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("section",{staticClass:"sidebar-group",class:[{collapsable:t.collapsable,"is-sub-group":0!==t.depth},"depth-"+t.depth]},[t.item.path?n("RouterLink",{staticClass:"sidebar-heading clickable",class:{open:t.open,active:t.isActive(t.$route,t.item.path)},attrs:{to:t.item.path},nativeOn:{click:function(e){return t.$emit("toggle")}}},[n("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?n("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]):n("p",{staticClass:"sidebar-heading",class:{open:t.open},on:{click:function(e){return t.$emit("toggle")}}},[n("span",[t._v(t._s(t.item.title))]),t._v(" "),t.collapsable?n("span",{staticClass:"arrow",class:t.open?"down":"right"}):t._e()]),t._v(" "),n("DropdownTransition",[t.open||!t.collapsable?n("SidebarLinks",{staticClass:"sidebar-group-items",attrs:{items:t.item.children,"sidebar-depth":t.item.sidebarDepth,"initial-open-group-index":t.item.initialOpenGroupIndex,depth:t.depth+1}}):t._e()],1)],1)}),[],!1,null,null,null).exports;n(372),n(49);function o(t,e,n,r,i){var a={props:{to:e,activeClass:"",exactActiveClass:""},class:{active:r,"sidebar-link":!0}};return i>2&&(a.style={"padding-left":i+"rem"}),t("RouterLink",a,n)}function u(t,e,n,i,a){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:1;return!e||s>a?null:t("ul",{class:"sidebar-sub-headers"},e.map((function(e){var l=Object(r.e)(i,n+"#"+e.slug);return t("li",{class:"sidebar-sub-header"},[o(t,n+"#"+e.slug,e.title,l,e.level-1),u(t,e.children,n,i,a,s+1)])})))}var l={functional:!0,props:["item","sidebarDepth"],render:function(t,e){var n=e.parent,i=n.$page,a=(n.$site,n.$route),s=n.$themeConfig,l=n.$themeLocaleConfig,c=e.props,h=c.item,f=c.sidebarDepth,p=Object(r.e)(a,h.path),d="auto"===h.type?p||h.children.some((function(t){return Object(r.e)(a,h.basePath+"#"+t.slug)})):p,g="external"===h.type?function(t,e,n){return t("a",{attrs:{href:e,target:"_blank",rel:"noopener noreferrer"},class:{"sidebar-link":!0}},[n,t("OutboundLink")])}(t,h.path,h.title||h.path):o(t,h.path,h.title||h.path,d),v=[i.frontmatter.sidebarDepth,f,l.sidebarDepth,s.sidebarDepth,1].find((function(t){return void 0!==t})),m=l.displayAllHeaders||s.displayAllHeaders;return"auto"===h.type?[g,u(t,h.children,h.basePath,a,v)]:(d||m)&&h.headers&&!r.d.test(h.path)?[g,u(t,Object(r.c)(h.headers),h.path,a,v)]:g}};n(373);function c(t,e){if("group"===e.type){var n=e.path&&Object(r.e)(t,e.path),i=e.children.some((function(e){return"group"===e.type?c(t,e):"page"===e.type&&Object(r.e)(t,e.path)}));return n||i}return!1}var h={name:"SidebarLinks",components:{SidebarGroup:s,SidebarLink:Object(a.a)(l,void 0,void 0,!1,null,null,null).exports},props:["items","depth","sidebarDepth","initialOpenGroupIndex"],data:function(){return{openGroupIndex:this.initialOpenGroupIndex||0}},watch:{$route:function(){this.refreshIndex()}},created:function(){this.refreshIndex()},methods:{refreshIndex:function(){var t=function(t,e){for(var n=0;n-1&&(this.openGroupIndex=t)},toggleGroup:function(t){this.openGroupIndex=t===this.openGroupIndex?-1:t},isActive:function(t){return Object(r.e)(this.$route,t.regularPath)}}},f=Object(a.a)(h,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.items.length?n("ul",{staticClass:"sidebar-links"},t._l(t.items,(function(e,r){return n("li",{key:r},["group"===e.type?n("SidebarGroup",{attrs:{item:e,open:r===t.openGroupIndex,collapsable:e.collapsable||e.collapsible,depth:t.depth},on:{toggle:function(e){return t.toggleGroup(r)}}}):n("SidebarLink",{attrs:{"sidebar-depth":t.sidebarDepth,item:e}})],1)})),0):t._e()}),[],!1,null,null,null);e.default=f.exports},345:function(t,e,n){"use strict";var r={name:"DropdownTransition",methods:{setHeight:function(t){t.style.height=t.scrollHeight+"px"},unsetHeight:function(t){t.style.height=""}}},i=(n(363),n(26)),a=Object(i.a)(r,(function(){var t=this.$createElement;return(this._self._c||t)("transition",{attrs:{name:"dropdown"},on:{enter:this.setHeight,"after-enter":this.unsetHeight,"before-leave":this.setHeight}},[this._t("default")],2)}),[],!1,null,null,null);e.a=a.exports},346:function(t,e,n){"use strict";var r=n(0),i=n(347);r({target:"String",proto:!0,forced:n(348)("link")},{link:function(t){return i(this,"a","href",t)}})},347:function(t,e,n){var r=n(21),i=/"/g;t.exports=function(t,e,n,a){var s=String(r(t)),o="<"+e;return""!==n&&(o+=" "+n+'="'+String(a).replace(i,""")+'"'),o+">"+s+""+e+">"}},348:function(t,e,n){var r=n(1);t.exports=function(t){return r((function(){var e=""[t]('"');return e!==e.toLowerCase()||e.split('"').length>3}))}},349:function(t,e,n){"use strict";n(322)},350:function(t,e,n){var r=n(0),i=n(351);r({global:!0,forced:parseInt!=i},{parseInt:i})},351:function(t,e,n){var r=n(3),i=n(182).trim,a=n(183),s=r.parseInt,o=/^[+-]?0[Xx]/,u=8!==s(a+"08")||22!==s(a+"0x16");t.exports=u?function(t,e){var n=i(String(t));return s(n,e>>>0||(o.test(n)?16:10))}:s},352:function(t,e,n){var r=n(0),i=n(1),a=n(15),s=n(23).f,o=n(6),u=i((function(){s(1)}));r({target:"Object",stat:!0,forced:!o||u,sham:!o},{getOwnPropertyDescriptor:function(t,e){return s(a(t),e)}})},353:function(t,e,n){var r=n(0),i=n(6);r({target:"Object",stat:!0,forced:!i,sham:!i},{defineProperties:n(171)})},354:function(t,e,n){"use strict";n(12);var r,i=n(0),a=n(6),s=n(323),o=n(3),u=n(171),l=n(11),c=n(172),h=n(7),f=n(187),p=n(189),d=n(106).codeAt,g=n(355),v=n(51),m=n(356),b=n(32),k=o.URL,y=m.URLSearchParams,_=m.getState,x=b.set,L=b.getterFor("URL"),w=Math.floor,C=Math.pow,S=/[A-Za-z]/,$=/[\d+-.A-Za-z]/,O=/\d/,R=/^(0x|0X)/,I=/^[0-7]+$/,j=/^\d+$/,U=/^[\dA-Fa-f]+$/,P=/[\u0000\t\u000A\u000D #%/:?@[\\]]/,A=/[\u0000\t\u000A\u000D #/:?@[\\]]/,E=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,T=/[\t\u000A\u000D]/g,N=function(t,e){var n,r,i;if("["==e.charAt(0)){if("]"!=e.charAt(e.length-1))return"Invalid host";if(!(n=D(e.slice(1,-1))))return"Invalid host";t.host=n}else if(X(t)){if(e=g(e),P.test(e))return"Invalid host";if(null===(n=B(e)))return"Invalid host";t.host=n}else{if(A.test(e))return"Invalid host";for(n="",r=p(e),i=0;i4)return t;for(n=[],r=0;r1&&"0"==i.charAt(0)&&(a=R.test(i)?16:8,i=i.slice(8==a?1:2)),""===i)s=0;else{if(!(10==a?j:8==a?I:U).test(i))return t;s=parseInt(i,a)}n.push(s)}for(r=0;r=C(256,5-e))return null}else if(s>255)return null;for(o=n.pop(),r=0;r6)return;for(r=0;f();){if(i=null,r>0){if(!("."==f()&&r<4))return;h++}if(!O.test(f()))return;for(;O.test(f());){if(a=parseInt(f(),10),null===i)i=a;else{if(0==i)return;i=10*i+a}if(i>255)return;h++}u[l]=256*u[l]+i,2!=++r&&4!=r||l++}if(4!=r)return;break}if(":"==f()){if(h++,!f())return}else if(f())return;u[l++]=e}else{if(null!==c)return;h++,c=++l}}if(null!==c)for(s=l-c,l=7;0!=l&&s>0;)o=u[l],u[l--]=u[c+s-1],u[c+--s]=o;else if(8!=l)return;return u},q=function(t){var e,n,r,i;if("number"==typeof t){for(e=[],n=0;n<4;n++)e.unshift(t%256),t=w(t/256);return e.join(".")}if("object"==typeof t){for(e="",r=function(t){for(var e=null,n=1,r=null,i=0,a=0;a<8;a++)0!==t[a]?(i>n&&(e=r,n=i),r=null,i=0):(null===r&&(r=a),++i);return i>n&&(e=r,n=i),e}(t),n=0;n<8;n++)i&&0===t[n]||(i&&(i=!1),r===n?(e+=n?":":"::",i=!0):(e+=t[n].toString(16),n<7&&(e+=":")));return"["+e+"]"}return t},H={},W=f({},H,{" ":1,'"':1,"<":1,">":1,"`":1}),G=f({},W,{"#":1,"?":1,"{":1,"}":1}),M=f({},G,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),F=function(t,e){var n=d(t,0);return n>32&&n<127&&!h(e,t)?t:encodeURIComponent(t)},z={ftp:21,file:null,http:80,https:443,ws:80,wss:443},X=function(t){return h(z,t.scheme)},V=function(t){return""!=t.username||""!=t.password},J=function(t){return!t.host||t.cannotBeABaseURL||"file"==t.scheme},Y=function(t,e){var n;return 2==t.length&&S.test(t.charAt(0))&&(":"==(n=t.charAt(1))||!e&&"|"==n)},Z=function(t){var e;return t.length>1&&Y(t.slice(0,2))&&(2==t.length||"/"===(e=t.charAt(2))||"\\"===e||"?"===e||"#"===e)},K=function(t){var e=t.path,n=e.length;!n||"file"==t.scheme&&1==n&&Y(e[0],!0)||e.pop()},Q=function(t){return"."===t||"%2e"===t.toLowerCase()},tt={},et={},nt={},rt={},it={},at={},st={},ot={},ut={},lt={},ct={},ht={},ft={},pt={},dt={},gt={},vt={},mt={},bt={},kt={},yt={},_t=function(t,e,n,i){var a,s,o,u,l,c=n||tt,f=0,d="",g=!1,v=!1,m=!1;for(n||(t.scheme="",t.username="",t.password="",t.host=null,t.port=null,t.path=[],t.query=null,t.fragment=null,t.cannotBeABaseURL=!1,e=e.replace(E,"")),e=e.replace(T,""),a=p(e);f<=a.length;){switch(s=a[f],c){case tt:if(!s||!S.test(s)){if(n)return"Invalid scheme";c=nt;continue}d+=s.toLowerCase(),c=et;break;case et:if(s&&($.test(s)||"+"==s||"-"==s||"."==s))d+=s.toLowerCase();else{if(":"!=s){if(n)return"Invalid scheme";d="",c=nt,f=0;continue}if(n&&(X(t)!=h(z,d)||"file"==d&&(V(t)||null!==t.port)||"file"==t.scheme&&!t.host))return;if(t.scheme=d,n)return void(X(t)&&z[t.scheme]==t.port&&(t.port=null));d="","file"==t.scheme?c=pt:X(t)&&i&&i.scheme==t.scheme?c=rt:X(t)?c=ot:"/"==a[f+1]?(c=it,f++):(t.cannotBeABaseURL=!0,t.path.push(""),c=bt)}break;case nt:if(!i||i.cannotBeABaseURL&&"#"!=s)return"Invalid scheme";if(i.cannotBeABaseURL&&"#"==s){t.scheme=i.scheme,t.path=i.path.slice(),t.query=i.query,t.fragment="",t.cannotBeABaseURL=!0,c=yt;break}c="file"==i.scheme?pt:at;continue;case rt:if("/"!=s||"/"!=a[f+1]){c=at;continue}c=ut,f++;break;case it:if("/"==s){c=lt;break}c=mt;continue;case at:if(t.scheme=i.scheme,s==r)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query;else if("/"==s||"\\"==s&&X(t))c=st;else if("?"==s)t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query="",c=kt;else{if("#"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.path.pop(),c=mt;continue}t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,t.path=i.path.slice(),t.query=i.query,t.fragment="",c=yt}break;case st:if(!X(t)||"/"!=s&&"\\"!=s){if("/"!=s){t.username=i.username,t.password=i.password,t.host=i.host,t.port=i.port,c=mt;continue}c=lt}else c=ut;break;case ot:if(c=ut,"/"!=s||"/"!=d.charAt(f+1))continue;f++;break;case ut:if("/"!=s&&"\\"!=s){c=lt;continue}break;case lt:if("@"==s){g&&(d="%40"+d),g=!0,o=p(d);for(var b=0;b65535)return"Invalid port";t.port=X(t)&&_===z[t.scheme]?null:_,d=""}if(n)return;c=vt;continue}return"Invalid port"}d+=s;break;case pt:if(t.scheme="file","/"==s||"\\"==s)c=dt;else{if(!i||"file"!=i.scheme){c=mt;continue}if(s==r)t.host=i.host,t.path=i.path.slice(),t.query=i.query;else if("?"==s)t.host=i.host,t.path=i.path.slice(),t.query="",c=kt;else{if("#"!=s){Z(a.slice(f).join(""))||(t.host=i.host,t.path=i.path.slice(),K(t)),c=mt;continue}t.host=i.host,t.path=i.path.slice(),t.query=i.query,t.fragment="",c=yt}}break;case dt:if("/"==s||"\\"==s){c=gt;break}i&&"file"==i.scheme&&!Z(a.slice(f).join(""))&&(Y(i.path[0],!0)?t.path.push(i.path[0]):t.host=i.host),c=mt;continue;case gt:if(s==r||"/"==s||"\\"==s||"?"==s||"#"==s){if(!n&&Y(d))c=mt;else if(""==d){if(t.host="",n)return;c=vt}else{if(u=N(t,d))return u;if("localhost"==t.host&&(t.host=""),n)return;d="",c=vt}continue}d+=s;break;case vt:if(X(t)){if(c=mt,"/"!=s&&"\\"!=s)continue}else if(n||"?"!=s)if(n||"#"!=s){if(s!=r&&(c=mt,"/"!=s))continue}else t.fragment="",c=yt;else t.query="",c=kt;break;case mt:if(s==r||"/"==s||"\\"==s&&X(t)||!n&&("?"==s||"#"==s)){if(".."===(l=(l=d).toLowerCase())||"%2e."===l||".%2e"===l||"%2e%2e"===l?(K(t),"/"==s||"\\"==s&&X(t)||t.path.push("")):Q(d)?"/"==s||"\\"==s&&X(t)||t.path.push(""):("file"==t.scheme&&!t.path.length&&Y(d)&&(t.host&&(t.host=""),d=d.charAt(0)+":"),t.path.push(d)),d="","file"==t.scheme&&(s==r||"?"==s||"#"==s))for(;t.path.length>1&&""===t.path[0];)t.path.shift();"?"==s?(t.query="",c=kt):"#"==s&&(t.fragment="",c=yt)}else d+=F(s,G);break;case bt:"?"==s?(t.query="",c=kt):"#"==s?(t.fragment="",c=yt):s!=r&&(t.path[0]+=F(s,H));break;case kt:n||"#"!=s?s!=r&&("'"==s&&X(t)?t.query+="%27":t.query+="#"==s?"%23":F(s,H)):(t.fragment="",c=yt);break;case yt:s!=r&&(t.fragment+=F(s,W))}f++}},xt=function(t){var e,n,r=c(this,xt,"URL"),i=arguments.length>1?arguments[1]:void 0,s=String(t),o=x(r,{type:"URL"});if(void 0!==i)if(i instanceof xt)e=L(i);else if(n=_t(e={},String(i)))throw TypeError(n);if(n=_t(o,s,null,e))throw TypeError(n);var u=o.searchParams=new y,l=_(u);l.updateSearchParams(o.query),l.updateURL=function(){o.query=String(u)||null},a||(r.href=wt.call(r),r.origin=Ct.call(r),r.protocol=St.call(r),r.username=$t.call(r),r.password=Ot.call(r),r.host=Rt.call(r),r.hostname=It.call(r),r.port=jt.call(r),r.pathname=Ut.call(r),r.search=Pt.call(r),r.searchParams=At.call(r),r.hash=Et.call(r))},Lt=xt.prototype,wt=function(){var t=L(this),e=t.scheme,n=t.username,r=t.password,i=t.host,a=t.port,s=t.path,o=t.query,u=t.fragment,l=e+":";return null!==i?(l+="//",V(t)&&(l+=n+(r?":"+r:"")+"@"),l+=q(i),null!==a&&(l+=":"+a)):"file"==e&&(l+="//"),l+=t.cannotBeABaseURL?s[0]:s.length?"/"+s.join("/"):"",null!==o&&(l+="?"+o),null!==u&&(l+="#"+u),l},Ct=function(){var t=L(this),e=t.scheme,n=t.port;if("blob"==e)try{return new URL(e.path[0]).origin}catch(t){return"null"}return"file"!=e&&X(t)?e+"://"+q(t.host)+(null!==n?":"+n:""):"null"},St=function(){return L(this).scheme+":"},$t=function(){return L(this).username},Ot=function(){return L(this).password},Rt=function(){var t=L(this),e=t.host,n=t.port;return null===e?"":null===n?q(e):q(e)+":"+n},It=function(){var t=L(this).host;return null===t?"":q(t)},jt=function(){var t=L(this).port;return null===t?"":String(t)},Ut=function(){var t=L(this),e=t.path;return t.cannotBeABaseURL?e[0]:e.length?"/"+e.join("/"):""},Pt=function(){var t=L(this).query;return t?"?"+t:""},At=function(){return L(this).searchParams},Et=function(){var t=L(this).fragment;return t?"#"+t:""},Tt=function(t,e){return{get:t,set:e,configurable:!0,enumerable:!0}};if(a&&u(Lt,{href:Tt(wt,(function(t){var e=L(this),n=String(t),r=_t(e,n);if(r)throw TypeError(r);_(e.searchParams).updateSearchParams(e.query)})),origin:Tt(Ct),protocol:Tt(St,(function(t){var e=L(this);_t(e,String(t)+":",tt)})),username:Tt($t,(function(t){var e=L(this),n=p(String(t));if(!J(e)){e.username="";for(var r=0;r>1,t+=s(t/e);t>455;r+=36)t=s(t/35);return s(r+36*t/(t+38))},c=function(t){var e,n,r=[],i=(t=function(t){for(var e=[],n=0,r=t.length;n=55296&&i<=56319&&n=c&&ns((2147483647-h)/v))throw RangeError(a);for(h+=(g-c)*v,c=g,e=0;e2147483647)throw RangeError(a);if(n==c){for(var m=h,b=36;;b+=36){var k=b<=f?1:b>=f+26?26:b-f;if(m0?arguments[0]:void 0,c=this,p=[];if(C(c,{type:"URLSearchParams",entries:p,updateURL:function(){},updateSearchParams:B}),void 0!==l)if(v(l))if("function"==typeof(t=y(l)))for(n=(e=t.call(l)).next;!(r=n.call(e)).done;){if((s=(a=(i=k(g(r.value))).next).call(i)).done||(o=a.call(i)).done||!a.call(i).done)throw TypeError("Expected sequence with length 2");p.push({key:s.value+"",value:o.value+""})}else for(u in l)f(l,u)&&p.push({key:u,value:l[u]+""});else N(p,"string"==typeof l?"?"===l.charAt(0)?l.slice(1):l:l+"")},W=H.prototype;o(W,{append:function(t,e){D(arguments.length,2);var n=S(this);n.entries.push({key:t+"",value:e+""}),n.updateURL()},delete:function(t){D(arguments.length,1);for(var e=S(this),n=e.entries,r=t+"",i=0;it.key){i.splice(e,0,t);break}e===n&&i.push(t)}r.updateURL()},forEach:function(t){for(var e,n=S(this).entries,r=p(t,arguments.length>1?arguments[1]:void 0,3),i=0;i1&&(v(e=arguments[1])&&(n=e.body,"URLSearchParams"===d(n)&&((r=e.headers?new L(e.headers):new L).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),e=m(e,{body:b(0,String(n)),headers:b(0,r)}))),i.push(e)),x.apply(this,i)}}),t.exports={URLSearchParams:H,getState:S}},357:function(t,e,n){var r=n(5),i=n(100);t.exports=function(t){var e=i(t);if("function"!=typeof e)throw TypeError(String(t)+" is not iterable");return r(e.call(t))}},358:function(t,e,n){"use strict";n(324)},359:function(t,e,n){var r=n(1),i=n(183);t.exports=function(t){return r((function(){return!!i[t]()||" "!=" "[t]()||i[t].name!==t}))}},360:function(t,e,n){"use strict";var r,i=n(0),a=n(23).f,s=n(14),o=n(107),u=n(21),l=n(108),c=n(22),h="".endsWith,f=Math.min,p=l("endsWith");i({target:"String",proto:!0,forced:!!(c||p||(r=a(String.prototype,"endsWith"),!r||r.writable))&&!p},{endsWith:function(t){var e=String(u(this));o(t);var n=arguments.length>1?arguments[1]:void 0,r=s(e.length),i=void 0===n?r:f(s(n),r),a=String(t);return h?h.call(e,a,i):e.slice(i-a.length,i)===a}})},361:function(t,e,n){"use strict";n(328)},362:function(t,e,n){"use strict";n(329)},363:function(t,e,n){"use strict";n(330)},364:function(t,e,n){"use strict";n(331)},365:function(t,e,n){"use strict";n(332)},366:function(t,e,n){"use strict";n(333)},367:function(t,e,n){"use strict";n(335)},368:function(t,e,n){var r=n(36),i=n(17),a=n(30);t.exports=function(t){return"string"==typeof t||!i(t)&&a(t)&&"[object String]"==r(t)}},369:function(t,e,n){"use strict";n(336)},370:function(t,e,n){"use strict";n(337)},371:function(t,e,n){"use strict";n(338)},372:function(t,e,n){"use strict";var r=n(0),i=n(34).find,a=n(103),s=!0;"find"in[]&&Array(1).find((function(){s=!1})),r({target:"Array",proto:!0,forced:s},{find:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}}),a("find")},373:function(t,e,n){"use strict";n(339)},374:function(t,e,n){"use strict";n(340)},381:function(t,e,n){"use strict";n.r(e);n(346),n(99),n(71);var r=n(319),i={name:"NavLink",props:{item:{required:!0}},computed:{link:function(){return Object(r.b)(this.item.link)},exact:function(){var t=this;return this.$site.locales?Object.keys(this.$site.locales).some((function(e){return e===t.link})):"/"===this.link},isNonHttpURI:function(){return Object(r.g)(this.link)||Object(r.h)(this.link)},isBlankTarget:function(){return"_blank"===this.target},isInternal:function(){return!Object(r.f)(this.link)&&!this.isBlankTarget},target:function(){return this.isNonHttpURI?null:this.item.target?this.item.target:Object(r.f)(this.link)?"_blank":""},rel:function(){return this.isNonHttpURI||!1===this.item.rel?null:this.item.rel?this.item.rel:this.isBlankTarget?"noopener noreferrer":null}},methods:{focusoutAction:function(){this.$emit("focusout")}}},a=n(26),s=Object(a.a)(i,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return t.isInternal?n("RouterLink",{staticClass:"nav-link",attrs:{to:t.link,exact:t.exact},nativeOn:{focusout:function(e){return t.focusoutAction(e)}}},[t._v("\n "+t._s(t.item.text)+"\n")]):n("a",{staticClass:"nav-link external",attrs:{href:t.link,target:t.target,rel:t.rel},on:{focusout:t.focusoutAction}},[t._v("\n "+t._s(t.item.text)+"\n "),t.isBlankTarget?n("OutboundLink"):t._e()],1)}),[],!1,null,null,null).exports,o={name:"Home",components:{NavLink:s},computed:{data:function(){return this.$page.frontmatter},actionLink:function(){return{link:this.data.actionLink,text:this.data.actionText}}}},u=(n(349),Object(a.a)(o,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("main",{staticClass:"home",attrs:{"aria-labelledby":null!==t.data.heroText?"main-title":null}},[n("header",{staticClass:"hero"},[t.data.heroImage?n("img",{attrs:{src:t.$withBase(t.data.heroImage),alt:t.data.heroAlt||"hero"}}):t._e(),t._v(" "),null!==t.data.heroText?n("h1",{attrs:{id:"main-title"}},[t._v("\n "+t._s(t.data.heroText||t.$title||"Hello")+"\n ")]):t._e(),t._v(" "),null!==t.data.tagline?n("p",{staticClass:"description"},[t._v("\n "+t._s(t.data.tagline||t.$description||"Welcome to your VuePress site")+"\n ")]):t._e(),t._v(" "),t.data.actionText&&t.data.actionLink?n("p",{staticClass:"action"},[n("NavLink",{staticClass:"action-button",attrs:{item:t.actionLink}})],1):t._e()]),t._v(" "),t.data.features&&t.data.features.length?n("div",{staticClass:"features"},t._l(t.data.features,(function(e,r){return n("div",{key:r,staticClass:"feature"},[n("h2",[t._v(t._s(e.title))]),t._v(" "),n("p",[t._v(t._s(e.details))])])})),0):t._e(),t._v(" "),n("Content",{staticClass:"theme-default-content custom"}),t._v(" "),t.data.footer?n("div",{staticClass:"footer"},[t._v("\n "+t._s(t.data.footer)+"\n ")]):t._e()],1)}),[],!1,null,null,null).exports),l=(n(350),n(35),n(27),n(352),n(72),n(73),n(188),n(353),n(110),n(98));function c(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),n.push.apply(n,r)}return n}function h(t){for(var e=1;e',this.initialize(t,e)}}}),d=(n(358),Object(a.a)(p,(function(){var t=this.$createElement,e=this._self._c||t;return e("form",{staticClass:"algolia-search-wrapper search-box",attrs:{id:"search-form",role:"search"}},[e("input",{staticClass:"search-query",attrs:{id:"algolia-search-input",placeholder:this.placeholder}})])}),[],!1,null,null,null).exports),g=(n(325),n(170),n(101),n(320),n(190),n(191),n(179),n(326),n(327),n(49),n(321),n(360),n(192)),v=n.n(g),m=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,r=v()(e,"title","");return v()(e,"frontmatter.tags")&&(r+=" ".concat(e.frontmatter.tags.join(" "))),n&&(r+=" ".concat(n)),b(t,r)},b=function(t,e){var n=function(t){return t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")},r=new RegExp("[^\0-]"),i=t.split(/\s+/g).map((function(t){return t.trim()})).filter((function(t){return!!t}));if(r.test(t))return i.some((function(t){return e.toLowerCase().indexOf(t)>-1}));var a=t.endsWith(" ");return new RegExp(i.map((function(t,e){return i.length!==e+1||a?"(?=.*\\b".concat(n(t),"\\b)"):"(?=.*\\b".concat(n(t),")")})).join("")+".+","gi").test(e)},k={name:"SearchBox",data:function(){return{query:"",focused:!1,focusIndex:0,placeholder:void 0}},computed:{showSuggestions:function(){return this.focused&&this.suggestions&&this.suggestions.length},suggestions:function(){var t=this.query.trim().toLowerCase();if(t){for(var e=this.$site.pages,n=this.$site.themeConfig.searchMaxSuggestions||5,r=this.$localePath,i=[],a=0;a=n);a++){var s=e[a];if(this.getPageLocalePath(s)===r&&this.isSearchable(s))if(m(t,s))i.push(s);else if(s.headers)for(var o=0;o=n);o++){var u=s.headers[o];u.title&&m(t,s,u.title)&&i.push(Object.assign({},s,{path:s.path+"#"+u.slug,header:u}))}}return i}},alignRight:function(){return(this.$site.themeConfig.nav||[]).length+(this.$site.repo?1:0)<=2}},mounted:function(){this.placeholder=this.$site.themeConfig.searchPlaceholder||"",document.addEventListener("keydown",this.onHotkey)},beforeDestroy:function(){document.removeEventListener("keydown",this.onHotkey)},methods:{getPageLocalePath:function(t){for(var e in this.$site.locales||{})if("/"!==e&&0===t.path.indexOf(e))return e;return"/"},isSearchable:function(t){var e=null;return null===e||(e=Array.isArray(e)?e:new Array(e)).filter((function(e){return t.path.match(e)})).length>0},onHotkey:function(t){t.srcElement===document.body&&["s","/"].includes(t.key)&&(this.$refs.input.focus(),t.preventDefault())},onUp:function(){this.showSuggestions&&(this.focusIndex>0?this.focusIndex--:this.focusIndex=this.suggestions.length-1)},onDown:function(){this.showSuggestions&&(this.focusIndex "+t._s(e.header.title))]):t._e()])])})),0):t._e()])}),[],!1,null,null,null).exports),_=(n(362),Object(a.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"sidebar-button",on:{click:function(e){return t.$emit("toggle-sidebar")}}},[n("svg",{staticClass:"icon",attrs:{xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",role:"img",viewBox:"0 0 448 512"}},[n("path",{attrs:{fill:"currentColor",d:"M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"}})])])}),[],!1,null,null,null).exports),x=n(46),L=n(345),w=n(193),C=n.n(w),S={name:"DropdownLink",components:{NavLink:s,DropdownTransition:L.a},props:{item:{required:!0}},data:function(){return{open:!1}},computed:{dropdownAriaLabel:function(){return this.item.ariaLabel||this.item.text}},watch:{$route:function(){this.open=!1}},methods:{setOpen:function(t){this.open=t},isLastItemOfArray:function(t,e){return C()(e)===t},handleDropdown:function(){0===event.detail&&this.setOpen(!this.open)}}},$=(n(364),{name:"NavLinks",components:{NavLink:s,DropdownLink:Object(a.a)(S,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"dropdown-wrapper",class:{open:t.open}},[n("button",{staticClass:"dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:t.handleDropdown}},[n("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),n("span",{staticClass:"arrow down"})]),t._v(" "),n("button",{staticClass:"mobile-dropdown-title",attrs:{type:"button","aria-label":t.dropdownAriaLabel},on:{click:function(e){return t.setOpen(!t.open)}}},[n("span",{staticClass:"title"},[t._v(t._s(t.item.text))]),t._v(" "),n("span",{staticClass:"arrow",class:t.open?"down":"right"})]),t._v(" "),n("DropdownTransition",[n("ul",{directives:[{name:"show",rawName:"v-show",value:t.open,expression:"open"}],staticClass:"nav-dropdown"},t._l(t.item.items,(function(e,r){return n("li",{key:e.link||r,staticClass:"dropdown-item"},["links"===e.type?n("h4",[t._v("\n "+t._s(e.text)+"\n ")]):t._e(),t._v(" "),"links"===e.type?n("ul",{staticClass:"dropdown-subitem-wrapper"},t._l(e.items,(function(r){return n("li",{key:r.link,staticClass:"dropdown-subitem"},[n("NavLink",{attrs:{item:r},on:{focusout:function(n){t.isLastItemOfArray(r,e.items)&&t.isLastItemOfArray(e,t.item.items)&&t.setOpen(!1)}}})],1)})),0):n("NavLink",{attrs:{item:e},on:{focusout:function(n){t.isLastItemOfArray(e,t.item.items)&&t.setOpen(!1)}}})],1)})),0)])],1)}),[],!1,null,null,null).exports},computed:{userNav:function(){return this.$themeLocaleConfig.nav||this.$site.themeConfig.nav||[]},nav:function(){var t=this,e=this.$site.locales;if(e&&Object.keys(e).length>1){var n=this.$page.path,r=this.$router.options.routes,i=this.$site.themeConfig.locales||{},a={text:this.$themeLocaleConfig.selectText||"Languages",ariaLabel:this.$themeLocaleConfig.ariaLabel||"Select language",items:Object.keys(e).map((function(a){var s,o=e[a],u=i[a]&&i[a].label||o.lang;return o.lang===t.$lang?s=n:(s=n.replace(t.$localeConfig.path,a),r.some((function(t){return t.path===s}))||(s=a)),{text:u,link:s}}))};return[].concat(Object(x.a)(this.userNav),[a])}return this.userNav},userLinks:function(){return(this.nav||[]).map((function(t){return Object.assign(Object(r.j)(t),{items:(t.items||[]).map(r.j)})}))},repoLink:function(){var t=this.$site.themeConfig.repo;return t?/^https?:/.test(t)?t:"https://github.com/".concat(t):null},repoLabel:function(){if(this.repoLink){if(this.$site.themeConfig.repoLabel)return this.$site.themeConfig.repoLabel;for(var t=this.repoLink.match(/^https?:\/\/[^/]+/)[0],e=["GitHub","GitLab","Bitbucket"],n=0;nMath.abs(n)&&Math.abs(e)>40&&(e>0&&this.touchStart.x<=80?this.toggleSidebar(!0):this.toggleSidebar(!1))}}}),X=Object(a.a)(z,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"theme-container",class:t.pageClasses,on:{touchstart:t.onTouchStart,touchend:t.onTouchEnd}},[t.shouldShowNavbar?n("Navbar",{on:{"toggle-sidebar":t.toggleSidebar}}):t._e(),t._v(" "),n("div",{staticClass:"sidebar-mask",on:{click:function(e){return t.toggleSidebar(!1)}}}),t._v(" "),n("Sidebar",{attrs:{items:t.sidebarItems},on:{"toggle-sidebar":t.toggleSidebar},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("sidebar-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("sidebar-bottom")]},proxy:!0}],null,!0)}),t._v(" "),t.$page.frontmatter.home?n("Home"):n("Page",{attrs:{"sidebar-items":t.sidebarItems},scopedSlots:t._u([{key:"top",fn:function(){return[t._t("page-top")]},proxy:!0},{key:"bottom",fn:function(){return[t._t("page-bottom")]},proxy:!0}],null,!0)})],1)}),[],!1,null,null,null);e.default=X.exports}}]);
\ No newline at end of file
diff --git a/assets/js/30.2285aa3b.js b/assets/js/30.2285aa3b.js
new file mode 100644
index 000000000..350109b46
--- /dev/null
+++ b/assets/js/30.2285aa3b.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[30],{404:function(e,t,o){"use strict";o.r(t);var i=o(26),r=Object(i.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v("This is a minor release containing mostly bug fixes.")]),e._v(" "),o("p",[o("strong",[e._v("NEW FEATURE")])]),e._v(" "),o("ul",[o("li",[e._v("Support generic job types with AdoJobStore")])]),e._v(" "),o("p",[o("strong",[e._v("FIXES")])]),e._v(" "),o("ul",[o("li",[e._v("AdoJobStore doesn't notify about removing orphaned job")]),e._v(" "),o("li",[e._v("Store null JobData in JobDetails if it's empty")]),e._v(" "),o("li",[e._v("Documentation error in SimpleTriggerImpl UpdateAfterMisfire")]),e._v(" "),o("li",[e._v("Ensure IDriverDelegate members in StdAdoDelegate are virtual")])]),e._v(" "),o("Download")],1)}),[],!1,null,null,null);t.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/31.de5c4db1.js b/assets/js/31.de5c4db1.js
new file mode 100644
index 000000000..fafe3dba5
--- /dev/null
+++ b/assets/js/31.de5c4db1.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{405:function(e,t,a){"use strict";a.r(t);var o=a(26),n=Object(o.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("p",[e._v("This is the first alpha release from the long-awaited v3 branch. This is a big overhaul (and still in progress). Internals are being modernized whilst still trying to keep sane upgrade path.")]),e._v(" "),a("p",[e._v("A big thank you goes to "),a("a",{attrs:{href:"https://github.com/mjrousos",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mike Rousos"),a("OutboundLink")],1),e._v(" who really made it possible to get Quartz.NET working on .NET Core. "),a("a",{attrs:{href:"https://github.com/danielmarbach",target:"_blank",rel:"noopener noreferrer"}},[e._v("Daniel Marbach"),a("OutboundLink")],1),e._v(" also contributed a lot with ideas and code to async side. And of course never forgetting the community members that have provided feedback and fixes.")]),e._v(" "),a("p",[e._v("Please see the "),a("RouterLink",{attrs:{to:"/documentation/quartz-3.x/migration-guide.html"}},[e._v("migration guide")]),e._v(" that is a work in progess.")],1),e._v(" "),a("p",[a("strong",[e._v("Use at your own risk, might not be that production ready yet")])]),e._v(" "),a("p",[e._v("What does alpha mean?")]),e._v(" "),a("ul",[a("li",[e._v("All existing (and new) tests passing")]),e._v(" "),a("li",[e._v("Cheese might still get moved, alpha means that APIs can change, features can come and go")])]),e._v(" "),a("p",[a("strong",[e._v("NEW FEATURE")])]),e._v(" "),a("ul",[a("li",[e._v("Task based jobs with async/await support, internals work in async/await manner")]),e._v(" "),a("li",[e._v("Support .NET Core / netstandard 1.3")]),e._v(" "),a("li",[e._v("Separate NuGet package Quartz.Serialization.Json to enable JSON based AdoJobStore serialization (no binary serialization available in .NET Core)")]),e._v(" "),a("li",[e._v("Common.Logging removed from dependencies")]),e._v(" "),a("li",[e._v("C5 Collections removed from ILMerge process, no longer needed")])]),e._v(" "),a("p",[a("strong",[e._v("BREAKING CHANGES")])]),e._v(" "),a("ul",[a("li",[e._v(".NET 4.5/netstandard1.3 required")]),e._v(" "),a("li",[e._v("SimpleThreadPool is gone, old owned threads are gone")]),e._v(" "),a("li",[e._v("Scheduler methods have been changed to be Task based, remember to await them")]),e._v(" "),a("li",[e._v("IJob interface now returns a task")]),e._v(" "),a("li",[e._v("Some IList properties have been changed to IReadOnlyList to properly reflect intent")]),e._v(" "),a("li",[e._v("SQL Server CE support has been dropped")]),e._v(" "),a("li",[e._v("DailyCalendar uses now datetimes for excluded dates and has ISet interface to access them")]),e._v(" "),a("li",[e._v("IObjectSerializer has new method, void Initialize(), that has to be implemented")]),e._v(" "),a("li",[e._v("IInterruptableJob removed in favor of context's CancellationToken")])]),e._v(" "),a("p",[a("strong",[e._v("KNOWN ISSUES")])]),e._v(" "),a("ul",[a("li",[e._v("Issues with time zone ids between Windows and Linux, they use different ids for the same zone")]),e._v(" "),a("li",[e._v("No remoting support")]),e._v(" "),a("li",[e._v("Documentation lacking")])]),e._v(" "),a("p",[e._v("Check NuGet for pre-release packages.")])])}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/32.35d4940b.js b/assets/js/32.35d4940b.js
new file mode 100644
index 000000000..cd9e5ce0d
--- /dev/null
+++ b/assets/js/32.35d4940b.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{406:function(e,n,t){"use strict";t.r(n);var o=t(26),l=Object(o.a)({},(function(){var e=this,n=e.$createElement,t=e._self._c||n;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("Right on the heels of [Quartz.NET 3.0 Alpha 1]({% post_url 2016-08-16-quartznet-3.0-alpha1-released %}) we now have\na small maintenance version. With version 2.4 we are slowing things down with 2.x series and concentrate effors on v3 development.")]),e._v(" "),t("p",[t("strong",[e._v("NEW FEATURE")])]),e._v(" "),t("ul",[t("li",[e._v("Add SQL limit support for MySQLDelegate")]),e._v(" "),t("li",[e._v("Removed dbFailureRetryInterval since it is no longer used")]),e._v(" "),t("li",[e._v("Update Common Logging to v3.3.1")])]),e._v(" "),t("p",[t("strong",[e._v("FIXES")])]),e._v(" "),t("ul",[t("li",[e._v("Batch acquisition can cause early firing of triggers")]),e._v(" "),t("li",[e._v("Should not rely on "),t("code",[e._v("C5.TreeSet")]),e._v(" on HolidayCalendar field serialization")])]),e._v(" "),t("Download")],1)}),[],!1,null,null,null);n.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/33.32a324dc.js b/assets/js/33.32a324dc.js
new file mode 100644
index 000000000..c35ca32c3
--- /dev/null
+++ b/assets/js/33.32a324dc.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{407:function(t,e,n){"use strict";n.r(e);var s=n(26),o=Object(s.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[this._v("Minor release that just makes Common.Logging 3.3.1 bound by compilation process\nand not just by NuGet version reference.")]),this._v(" "),e("p",[e("strong",[this._v("FIXES")])]),this._v(" "),e("ul",[e("li",[this._v("Fix Common.Logging version 3.3.1 to be a true binary reference instead of just NuGet dependency")])]),this._v(" "),e("Download")],1)}),[],!1,null,null,null);e.default=o.exports}}]);
\ No newline at end of file
diff --git a/assets/js/34.4cefe782.js b/assets/js/34.4cefe782.js
new file mode 100644
index 000000000..2779c8ae6
--- /dev/null
+++ b/assets/js/34.4cefe782.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[34],{408:function(e,t,s){"use strict";s.r(t);var o=s(26),i=Object(o.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("p",[e._v("This is the second alpha of v3. This release fixes problems with schedule signaling when AdoJobStore is in use.\nThis release removes the last bits of Quartz's usage of thread local storage and thus makes async-based operations a lot safer.")]),e._v(" "),s("p",[s("strong",[e._v("FIXES")])]),e._v(" "),s("ul",[s("li",[e._v("fix scheduler signaling not working with AdoJobStore due to thread local storage")]),e._v(" "),s("li",[e._v("thread local state removed altogether")]),e._v(" "),s("li",[e._v("quartz.serializer.type was required even though non-serializing RAMJobStore was in use")]),e._v(" "),s("li",[e._v("JSON serialization incorrectly called serialization callbacks")])]),e._v(" "),s("p",[s("strong",[e._v("BREAKING CHANGES")])]),e._v(" "),s("ul",[s("li",[e._v("IStatefulJob was removed, been obsolete since 2.x")]),e._v(" "),s("li",[e._v("ISemaphore interface now passes Guid requestorId that defines lock owner instead of implicit thread name")])]),e._v(" "),s("p",[s("strong",[e._v("KNOWN ISSUES")])]),e._v(" "),s("ul",[s("li",[e._v("Issues with time zone ids between Windows and Linux, they use different ids for the same zone")]),e._v(" "),s("li",[e._v("No remoting support")]),e._v(" "),s("li",[e._v("Documentation lacking")])]),e._v(" "),s("p",[e._v("Check NuGet for pre-release packages.")])])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/35.3912f4fb.js b/assets/js/35.3912f4fb.js
new file mode 100644
index 000000000..0e44d587f
--- /dev/null
+++ b/assets/js/35.3912f4fb.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{409:function(e,t,r){"use strict";r.r(t);var n=r(26),i=Object(n.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("p",[e._v("This release contains mainly bug fixes but because there's a behavioral change in\nDST handling (for the better) that warrants for a minor version number increment.")]),e._v(" "),r("p",[e._v("See "),r("a",{attrs:{href:"https://github.com/quartznet/quartznet/pull/317",target:"_blank",rel:"noopener noreferrer"}},[e._v("the GitHub issue "),r("OutboundLink")],1),e._v(" for details.")]),e._v(" "),r("p",[r("strong",[e._v("FIXES")])]),e._v(" "),r("ul",[r("li",[e._v("Jobs get stuck in the Blocked state after the DB connection is lost in NotifyJobListenersComplete (#282)")]),e._v(" "),r("li",[e._v("Oracle rownum based queries can work wrong after Oracle SQL tuning task has ran (#413)")]),e._v(" "),r("li",[e._v("Handle DST better (#317)")]),e._v(" "),r("li",[e._v("RAMJobStore fails to resume when paused without triggers (#433)")]),e._v(" "),r("li",[e._v('CronExpression doesn\'t properly check the range when an "/interval" is specified (#432)')]),e._v(" "),r("li",[e._v("Fix JobDataMap dirty flag when constructing from existing map (#431)")]),e._v(" "),r("li",[e._v("Store triggers by job in RAMJobStore for better performance (#430)")]),e._v(" "),r("li",[e._v("Create WorkerThread in virtual method (#426)")]),e._v(" "),r("li",[e._v("SqlSelectJobForTrigger is not using primary key join and causes index scan (#407)")])]),e._v(" "),r("Download")],1)}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/36.3b387353.js b/assets/js/36.3b387353.js
new file mode 100644
index 000000000..b2daab423
--- /dev/null
+++ b/assets/js/36.3b387353.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[36],{410:function(e,t,i){"use strict";i.r(t);var o=i(26),r=Object(o.a)({},(function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[i("p",[i("strong",[e._v("Addition of column required to database")])]),e._v(" "),i("ul",[i("li",[e._v("This release fixes a long standing issue, DailyTimeIntervalTrigger's time zone is now finally persisted to database")]),e._v(" "),i("li",[e._v("This requires running "),i("a",{attrs:{href:"https://github.com/quartznet/quartznet/blob/2.x/database/schema_25_to_26_upgrade.sql",target:"_blank",rel:"noopener noreferrer"}},[e._v("schema_25_to_26_upgrade.sql"),i("OutboundLink")],1),e._v(" to add new column to QRTZ_SIMPROP_TRIGGERS table")])]),e._v(" "),i("p",[e._v("A slight performance boost can also be unlocked when using PostgreSQL by switching PostgreSqlDelegate.")]),e._v(" "),i("p",[i("strong",[e._v("NEW FEATURE")])]),e._v(" "),i("ul",[i("li",[e._v("Add support for eager validation of job scheduling XML file on plugin start (#492)")]),e._v(" "),i("li",[e._v("Add support for extra custom time zone resolver function in TimeZoneUtil (#290)")])]),e._v(" "),i("p",[i("strong",[e._v("FIXES")])]),e._v(" "),i("ul",[i("li",[e._v("CalendarIntervalTrigger's first fire time doesn't consider time zone (#505)")]),e._v(" "),i("li",[e._v("QRTZ_FIRED_TRIGGERS.ENTRY_ID column length too small (#474)")]),e._v(" "),i("li",[e._v("Decrease log level for message when host name is too long (#471)")]),e._v(" "),i("li",[e._v("Quartz should not log transient faults related to azure db connection as errors (#470)")]),e._v(" "),i("li",[e._v("RemotingSchedulerExporter can't create remoting channel on Mono (#464)")]),e._v(" "),i("li",[e._v("Regression in 2.5, TriggerBuilder.UsingJobData(JobDataMap newJobDataMap) should ovewrite existing (#460)")]),e._v(" "),i("li",[e._v("QuartzScheduler.Clear does not clear QRTZ_FIRED_TRIGGERS table (#437)")]),e._v(" "),i("li",[e._v("No wait time between db connection failures with AcquireNextTriggers (#428)")]),e._v(" "),i("li",[e._v("DailyTimeIntervalTriggerImpl prevents altering EndTimeOfDay to a later time of day (#382)")]),e._v(" "),i("li",[e._v("Quartz.CronExpression.IsSatisfiedBy claims to ignore milliseconds but doesn't (#349)")]),e._v(" "),i("li",[e._v("Add back PostgreSqlDelegate to support database LIMIT in trigger acquiring (#318)")]),e._v(" "),i("li",[e._v("Bug in XSD schema: cannot set "),i("misfire-instruction",[e._v("IgnoreMisfirePolicy")]),e._v(" (#280)")],1),e._v(" "),i("li",[e._v("Quartz.Xml.XMLSchedulingDataProcessor uses GetType() instead of typeof(Quartz.Xml.XMLSchedulingDataProcessor) (#277)")]),e._v(" "),i("li",[e._v("With SQLite default isolation level should be set to serializable (#242)")]),e._v(" "),i("li",[e._v("DailyTimeIntervalTrigger's time zone is not persisted into database (#136)")]),e._v(" "),i("li",[e._v("XMLSchedulingDataProcessorPlugin incompatible with StdAdoDelegate when useProperties=true (#44)")]),e._v(" "),i("li",[e._v("Trigger loop encountered using DailyTimeIntervalTrigger across DST start boundary (#332)")])]),e._v(" "),i("Download")],1)}),[],!1,null,null,null);t.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/37.193bf8a1.js b/assets/js/37.193bf8a1.js
new file mode 100644
index 000000000..eb1e0c42f
--- /dev/null
+++ b/assets/js/37.193bf8a1.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{411:function(e,o,n){"use strict";n.r(o);var i=n(26),t=Object(i.a)({},(function(){var e=this,o=e.$createElement,n=e._self._c||o;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("p",[e._v("This is the third alpha of v3. APIs have had some love in form of adding CancellationToken support and\nusing more "),n("code",[e._v("IReadOnlyCollection")]),e._v("s more concisely. Unfortunately we still don't have the story done for\nremote management support (HTTP API).")]),e._v(" "),n("p",[n("strong",[e._v("When using AdoJobStore: make sure to run both 2.6 and 3.0 SQL migration scripts if you are upgrading from 2.5, otherwise just 3.0 migration script")])]),e._v(" "),n("p",[n("strong",[e._v("NEW FEATURE")])]),e._v(" "),n("ul",[n("li",[e._v("support for .NET Standard 2.0 preview (#486)")]),e._v(" "),n("li",[e._v("support for MySQL on .NET Standard via provider 'MySql' (#493)")]),e._v(" "),n("li",[e._v("change SQL database IMAGE types to VARBINARY - requires migration schema_26_to_30.sql")]),e._v(" "),n("li",[e._v("add ISchedulerListener.JobInterrupted(JobKey jobKey, CancellationToken cancellationToken) (#467)")])]),e._v(" "),n("p",[n("strong",[e._v("FIXES")])]),e._v(" "),n("ul",[n("li",[e._v("fix PosgreSQL db provider configuration for .NET Core (#449)")]),e._v(" "),n("li",[e._v("CancellationToken is now supported in async methods (#444)")]),e._v(" "),n("li",[e._v("fix regression with XML schema validation")])]),e._v(" "),n("p",[n("strong",[e._v("BREAKING CHANGES")])]),e._v(" "),n("ul",[n("li",[e._v("possibly breaking, cron expression validation is now stricter (#315 #485)")]),e._v(" "),n("li",[e._v(".NET 4.6 required instead of old 4.5")]),e._v(" "),n("li",[e._v("API methods have been revisited to mainly use "),n("code",[e._v("IReadOnlyCollection")]),e._v(", this hides both "),n("code",[e._v("HashSet")]),e._v("s and "),n("code",[e._v("List")]),e._v("s")]),e._v(" "),n("li",[e._v("LibLog has been hidden as internal (ILog etc), like it was originally intended to be")])]),e._v(" "),n("p",[n("strong",[e._v("KNOWN ISSUES")])]),e._v(" "),n("ul",[n("li",[e._v("Issues with time zone ids between Windows and Linux, they use different ids for the same zone")]),e._v(" "),n("li",[e._v("No remoting support")]),e._v(" "),n("li",[e._v("Documentation lacking")])]),e._v(" "),n("p",[e._v("Check NuGet for pre-release packages.")])])}),[],!1,null,null,null);o.default=t.exports}}]);
\ No newline at end of file
diff --git a/assets/js/38.83de4ad0.js b/assets/js/38.83de4ad0.js
new file mode 100644
index 000000000..bdb296b0e
--- /dev/null
+++ b/assets/js/38.83de4ad0.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[38],{412:function(e,r,t){"use strict";t.r(r);var i=t(26),o=Object(i.a)({},(function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("This is the first beta of v3. Stabilization and testing has been well underway.")]),e._v(" "),t("p",[t("strong",[e._v("When using AdoJobStore: make sure to run both 2.6 and 3.0 SQL migration scripts if you are upgrading from 2.5, otherwise just 3.0 migration script")])]),e._v(" "),t("p",[t("strong",[e._v("NEW FEATURE")])]),e._v(" "),t("ul",[t("li",[e._v("returned .NET Framework 4.5.2 compatibility to better support library consumers like NServiceBus and MassTransit")]),e._v(" "),t("li",[e._v("netstandard 2.0 is now minimum for .NET Core")]),e._v(" "),t("li",[e._v("support for Microsoft.Data.Sqlite via provider name SQLite-Microsoft, the old provider SQLite also still works")]),e._v(" "),t("li",[e._v("Firebird is supported in .NET Core")]),e._v(" "),t("li",[e._v("Added preliminary support for SQL Server Memory-Optimized tables and Quartz.Impl.AdoJobStore.UpdateLockRowSemaphoreMOT")])]),e._v(" "),t("p",[t("strong",[e._v("BREAKING CHANGES")])]),e._v(" "),t("ul",[t("li",[e._v("Jobs and plugins are now in a separate assemblies/NuGet packages Quartz.Jobs and Quartz.Plugins")]),e._v(" "),t("li",[e._v("ADO.NET provider names have been simplified, the provider names are without version, e.g. SqlServer-20 => SqlServer")])]),e._v(" "),t("p",[t("strong",[e._v("KNOWN ISSUES")])]),e._v(" "),t("ul",[t("li",[e._v("Issues with time zone ids between Windows and Linux, they use different ids for the same zone")]),e._v(" "),t("li",[e._v("No remoting support for .NET Core")]),e._v(" "),t("li",[e._v("Documentation lacking")])]),e._v(" "),t("p",[e._v("Check NuGet for pre-release packages.")])])}),[],!1,null,null,null);r.default=o.exports}}]);
\ No newline at end of file
diff --git a/assets/js/39.9607a50c.js b/assets/js/39.9607a50c.js
new file mode 100644
index 000000000..abfba4422
--- /dev/null
+++ b/assets/js/39.9607a50c.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[39],{413:function(e,n,s){"use strict";s.r(n);var i=s(26),t=Object(i.a)({},(function(){var e=this,n=e.$createElement,s=e._self._c||n;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("p",[e._v("This is a maintenance release fixing an issue where misfire handling is being too slow at times. This regression has been present since version 2.4.")]),e._v(" "),s("p",[s("strong",[e._v("NEW FEATURE")])]),e._v(" "),s("ul",[s("li",[e._v("Allow performing misfire handling more frequently than misfireThreshold (#532)")])]),e._v(" "),s("p",[s("strong",[e._v("FIXES")])]),e._v(" "),s("ul",[s("li",[e._v("Incomplete recovery of misfired jobs when using database-specific delegate types (#531)")])]),e._v(" "),s("Download")],1)}),[],!1,null,null,null);n.default=t.exports}}]);
\ No newline at end of file
diff --git a/assets/js/4.9a469852.js b/assets/js/4.9a469852.js
new file mode 100644
index 000000000..270c3a5fb
--- /dev/null
+++ b/assets/js/4.9a469852.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{341:function(t,e,n){},375:function(t,e,n){"use strict";n(341)},523:function(t,e,n){"use strict";n.r(e);var i={functional:!0,props:{type:{type:String,default:"tip"},text:String,vertical:{type:String,default:"top"}},render:function(t,e){var n=e.props,i=e.slots;return t("span",{class:["badge",n.type],style:{verticalAlign:n.vertical}},n.text||i().default)}},r=(n(375),n(26)),p=Object(r.a)(i,void 0,void 0,!1,null,"15b7b770",null);e.default=p.exports}}]);
\ No newline at end of file
diff --git a/assets/js/40.e5ff7906.js b/assets/js/40.e5ff7906.js
new file mode 100644
index 000000000..dcfcc9a22
--- /dev/null
+++ b/assets/js/40.e5ff7906.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{414:function(e,t,o){"use strict";o.r(t);var r=o(26),i=Object(r.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v("The wait is over, Quartz.NET 3.0 is here with .NET Core support and async/await!")]),e._v(" "),o("p",[e._v("A big thank you goes to "),o("a",{attrs:{href:"https://github.com/mjrousos",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mike Rousos"),o("OutboundLink")],1),e._v(" who really made it possible to get Quartz.NET working on .NET Core.\n"),o("a",{attrs:{href:"https://github.com/danielmarbach",target:"_blank",rel:"noopener noreferrer"}},[e._v("Daniel Marbach"),o("OutboundLink")],1),e._v(" also contributed a lot with ideas and code to async side.\nAnd of course never forgetting the community members that have provided feedback and fixes.")]),e._v(" "),o("p",[e._v("Please see the "),o("RouterLink",{attrs:{to:"/documentation/quartz-3.x/migration-guide.html"}},[e._v("migration guide")]),e._v(".")],1),e._v(" "),o("p",[o("strong",[e._v("NEW FEATURE")])]),e._v(" "),o("ul",[o("li",[e._v("Task based jobs with async/await support, internals work in async/await manner")]),e._v(" "),o("li",[e._v("Support .NET Core / netstandard 2.0 and .NET Framework 4.5.2 and later")]),e._v(" "),o("li",[e._v("Support for Microsoft.Data.Sqlite via provider name SQLite-Microsoft, the old provider SQLite also still works")]),e._v(" "),o("li",[e._v("Added preliminary support for SQL Server Memory-Optimized tables and Quartz.Impl.AdoJobStore.UpdateLockRowSemaphoreMOT")]),e._v(" "),o("li",[e._v("Common.Logging removed from dependencies")]),e._v(" "),o("li",[e._v("C5 Collections removed from ILMerge process, no longer needed")]),e._v(" "),o("li",[e._v("Add support for eager validation of job scheduling XML file on plugin start")]),e._v(" "),o("li",[e._v("Add support for extra custom time zone resolver function in TimeZoneUtil")])]),e._v(" "),o("p",[o("strong",[e._v("BREAKING CHANGES")])]),e._v(" "),o("ul",[o("li",[e._v("Jobs and plugins are now in a separate assemblies/NuGet packages Quartz.Jobs and Quartz.Plugins")]),e._v(" "),o("li",[e._v("ADO.NET provider names have been simplified, the provider names are without version, e.g. SqlServer-20 => SqlServer")]),e._v(" "),o("li",[e._v("API methods have been revisited to mainly use "),o("code",[e._v("IReadOnlyCollection")]),e._v(", this hides both "),o("code",[e._v("HashSet")]),e._v("s and "),o("code",[e._v("List")]),e._v("s")]),e._v(" "),o("li",[e._v("LibLog has been hidden as internal (ILog etc), like it was originally intended to be")]),e._v(" "),o("li",[e._v("SimpleThreadPool is gone, old owned threads are gone")]),e._v(" "),o("li",[e._v("Scheduler methods have been changed to be Task based, remember to await them")]),e._v(" "),o("li",[e._v("IJob interface now returns a task")]),e._v(" "),o("li",[e._v("Some IList properties have been changed to IReadOnlyList to properly reflect intent")]),e._v(" "),o("li",[e._v("SQL Server CE support has been dropped")]),e._v(" "),o("li",[e._v("DailyCalendar uses now datetimes for excluded dates and has ISet interface to access them")]),e._v(" "),o("li",[e._v("IObjectSerializer has new method, void Initialize(), that has to be implemented")]),e._v(" "),o("li",[e._v("IInterruptableJob removed in favor of context's CancellationToken")])]),e._v(" "),o("p",[o("strong",[e._v("KNOWN ISSUES")])]),e._v(" "),o("ul",[o("li",[e._v("Issues with time zone ids between Windows and Linux, they use different ids for the same zone")]),e._v(" "),o("li",[e._v("No remoting support for .NET Core")])]),e._v(" "),o("Download")],1)}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/41.7affac67.js b/assets/js/41.7affac67.js
new file mode 100644
index 000000000..876611437
--- /dev/null
+++ b/assets/js/41.7affac67.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{415:function(t,e,a){"use strict";a.r(e);var n=a(26),s=Object(n.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[t._v("This is a bug fix release that fixes cron expression parsing bug and reverts IRemotableQuartzScheduler\ninterface back to its original form without Tasks and CancellationTokens - so that's it's actually usable\nthrough .NET Remoting infrastructure. Now zip packing is also back and includes Quartz.Server.")]),t._v(" "),a("p",[a("strong",[t._v("FIXES")])]),t._v(" "),a("ul",[a("li",[t._v("Create zip package as part of release, including Quartz.Server (#572)")]),t._v(" "),a("li",[t._v('A specific CronExpression fails with "Input string was not in a correct format." (#568)')]),t._v(" "),a("li",[t._v("Cannot use remoting due to Task and CancellationToken signatures (#571)")])]),t._v(" "),a("Download")],1)}),[],!1,null,null,null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/42.00fe8e23.js b/assets/js/42.00fe8e23.js
new file mode 100644
index 000000000..89d853c7d
--- /dev/null
+++ b/assets/js/42.00fe8e23.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{416:function(t,s,e){"use strict";e.r(s);var i=e(26),l=Object(i.a)({},(function(){var t=this.$createElement,s=this._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[s("p",[this._v("This is a minor fix release that fixes single issue that still prevented full usage of remoting.")]),this._v(" "),s("p",[s("strong",[this._v("FIXES")])]),this._v(" "),s("ul",[s("li",[this._v("Mark ReadOnlyCompatibleHashSet as serializable (#576)")])]),this._v(" "),s("Download")],1)}),[],!1,null,null,null);s.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/43.4f7d0962.js b/assets/js/43.4f7d0962.js
new file mode 100644
index 000000000..20e51b85e
--- /dev/null
+++ b/assets/js/43.4f7d0962.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[43],{417:function(e,t,r){"use strict";r.r(t);var i=r(26),n=Object(i.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("p",[e._v("This is a minor fix release.")]),e._v(" "),r("p",[r("strong",[e._v("FIXES")])]),e._v(" "),r("ul",[r("li",[e._v("XML scheduling requires write access to source XML file (#591)")]),e._v(" "),r("li",[e._v("Improve listener error handling (#589)")]),e._v(" "),r("li",[e._v("SQL command parameters are not defined in 'IsTriggerStillPresent' method (#579)")]),e._v(" "),r("li",[e._v("Source distribution couldn't be built with build.cmd/.sh when no .git directory present (#596)")]),e._v(" "),r("li",[e._v("Currently executing jobs cannot be retrieved via remoting (#580)")])]),e._v(" "),r("Download")],1)}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/44.fd58bb75.js b/assets/js/44.fd58bb75.js
new file mode 100644
index 000000000..63d22c661
--- /dev/null
+++ b/assets/js/44.fd58bb75.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[44],{418:function(e,s,t){"use strict";t.r(s);var a=t(26),n=Object(a.a)({},(function(){var e=this,s=e.$createElement,t=e._self._c||s;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("This release fixes a nasty memory leak caused by QuartzSchedulerThread sharing its CancellationTokenSource with calls it makes.\nEveryone using 3.x is advised to upgrade.")]),e._v(" "),t("p",[t("strong",[e._v("FIXES")])]),e._v(" "),t("ul",[t("li",[e._v("Memory leak caused by CancellationTokenSource sharing (#600)")]),e._v(" "),t("li",[e._v("tables_oracle.sql should use NUMBER(19) instead of NUMBER(13) for long properties (#598)")])]),e._v(" "),t("Download")],1)}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/45.07c03278.js b/assets/js/45.07c03278.js
new file mode 100644
index 000000000..d4b877f53
--- /dev/null
+++ b/assets/js/45.07c03278.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[45],{419:function(e,s,t){"use strict";t.r(s);var r=t(26),n=Object(r.a)({},(function(){var e=this,s=e.$createElement,t=e._self._c||s;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("This is a maintenance release fixing some bugs.")]),e._v(" "),t("p",[t("strong",[e._v("FIXES")])]),e._v(" "),t("ul",[t("li",[e._v("trigger loop encountered using DailyTimeIntervalTrigger across DST start boundary (#610)")]),e._v(" "),t("li",[e._v("tables_oracle.sql should use NUMBER(19) instead of NUMBER(13) for long properties (#598)")]),e._v(" "),t("li",[e._v("XML scheduling requires write access to source XML file (#591)")])]),e._v(" "),t("Download")],1)}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/46.6b0f5704.js b/assets/js/46.6b0f5704.js
new file mode 100644
index 000000000..191884dfd
--- /dev/null
+++ b/assets/js/46.6b0f5704.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[46],{420:function(e,r,s){"use strict";s.r(r);var t=s(26),a=Object(t.a)({},(function(){var e=this,r=e.$createElement,s=e._self._c||r;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("p",[e._v("This release fixes couple bugs and adds support for .NET Core version of Oracle's managed data access library.")]),e._v(" "),s("p",[s("strong",[e._v("NEW FEATURE")])]),e._v(" "),s("ul",[s("li",[e._v("Support Oracle.ManagedDataAccess.Core (#609)")])]),e._v(" "),s("p",[s("strong",[e._v("FIXES")])]),e._v(" "),s("ul",[s("li",[e._v("trigger loop encountered using DailyTimeIntervalTrigger across DST start boundary (#610)")]),e._v(" "),s("li",[e._v("Missing ConfigureAwait(false) in some parts of code (#618)")])]),e._v(" "),s("Download")],1)}),[],!1,null,null,null);r.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/47.1b566e3b.js b/assets/js/47.1b566e3b.js
new file mode 100644
index 000000000..514bc0b2e
--- /dev/null
+++ b/assets/js/47.1b566e3b.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[47],{421:function(e,o,r){"use strict";r.r(o);var t=r(26),n=Object(t.a)({},(function(){var e=this,o=e.$createElement,r=e._self._c||o;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("p",[e._v("This release fixes a nasty bug with JSON calendar database serialization and .NET Core SQL Server client libraries\nhave been updated to mitigiate possible hangs when connection drops occur.")]),e._v(" "),r("p",[e._v("Also some other minor bugs have been also addressed.")]),e._v(" "),r("p",[e._v("You should now be able to debug into Quartz.NET sources with added SourceLink support.")]),e._v(" "),r("p",[r("strong",[e._v("NEW FEATURE")])]),e._v(" "),r("ul",[r("li",[e._v("Add SourceLink support (#642)")]),e._v(" "),r("li",[e._v("Make JobInterrupted method virtual in class SchedulerListenerSupport (#631)")])]),e._v(" "),r("p",[r("strong",[e._v("FIXES")])]),e._v(" "),r("ul",[r("li",[e._v("Trigger group can be left as paused when all triggers have been removed (#641)")]),e._v(" "),r("li",[e._v("PlatformNotSupportedException on RaspberryPi (Windows IoT) (#630)")]),e._v(" "),r("li",[e._v("JSON serialisation returning defaults for derived calendar settings (#634)")]),e._v(" "),r("li",[e._v(".NET Core version not able to recover from DB connection drops (#637)")])]),e._v(" "),r("Download")],1)}),[],!1,null,null,null);o.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/48.31882e6a.js b/assets/js/48.31882e6a.js
new file mode 100644
index 000000000..3bf7dcbba
--- /dev/null
+++ b/assets/js/48.31882e6a.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{422:function(e,r,n){"use strict";n.r(r);var o=n(26),t=Object(o.a)({},(function(){var e=this,r=e.$createElement,n=e._self._c||r;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("p",[e._v("This release brings .NET Core 2.1 version of example server and adds new plugin\nQuartz.Plugins.TimeZoneConverter which allows usage of "),n("a",{attrs:{href:"https://github.com/mj1856/TimeZoneConverter",target:"_blank",rel:"noopener noreferrer"}},[e._v("TimeZoneConverter library"),n("OutboundLink")],1),e._v(" to get consistent time zone id parsing between\nLinux and Windows.")]),e._v(" "),n("p",[e._v("There are also some bug fixes related to AdoJobStore.")]),e._v(" "),n("p",[n("strong",[e._v("NEW FEATURE")])]),e._v(" "),n("ul",[n("li",[e._v("Add .NET Core 2.1 version of example server (#682)")]),e._v(" "),n("li",[e._v("New plugin "),n("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.Plugins.TimeZoneConverter",target:"_blank",rel:"noopener noreferrer"}},[e._v("Quartz.Plugins.TimeZoneConverter"),n("OutboundLink")],1),e._v(" which allows usage of TimeZoneConverter library (#647)")])]),e._v(" "),n("p",[n("strong",[e._v("FIXES")])]),e._v(" "),n("ul",[n("li",[e._v("Added transient codes from EF into new JobStore (#681)")]),e._v(" "),n("li",[e._v("Parametrized queries produced by ReplaceTablePrefix should be cached (#651)")]),e._v(" "),n("li",[e._v("Use TypeNameHandling.Auto for JsonObjectSerializer (#621)")]),e._v(" "),n("li",[e._v("Fix a race condition that could cause duplicate trigger firings (#690)")]),e._v(" "),n("li",[e._v("ISchedulerListener.JobScheduled not called when scheduling multiple jobs (ScheduleJobs) (#678)")])]),e._v(" "),n("Download")],1)}),[],!1,null,null,null);r.default=t.exports}}]);
\ No newline at end of file
diff --git a/assets/js/49.350a7768.js b/assets/js/49.350a7768.js
new file mode 100644
index 000000000..635313a0e
--- /dev/null
+++ b/assets/js/49.350a7768.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{423:function(e,t,s){"use strict";s.r(t);var r=s(26),n=Object(r.a)({},(function(){var e=this.$createElement,t=this._self._c||e;return t("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[t("p",[this._v("The Quartz.NET website has been refreshed using "),t("a",{attrs:{href:"https://vuepress.vuejs.org/",target:"_blank",rel:"noopener noreferrer"}},[this._v("VuePress"),t("OutboundLink")],1),this._v(".")]),this._v(" "),t("p",[this._v("The new format should make the documentation more modern, easier to navigate and more compatible with mobile devices.")])])}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/5.b59b1de3.js b/assets/js/5.b59b1de3.js
new file mode 100644
index 000000000..2e6266f41
--- /dev/null
+++ b/assets/js/5.b59b1de3.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{342:function(t,e,a){},376:function(t,e,a){"use strict";a(342)},386:function(t,e,a){"use strict";a.r(e);var n={name:"CodeBlock",props:{title:{type:String,required:!0},active:{type:Boolean,default:!1}},mounted:function(){this.$parent&&this.$parent.loadTabs&&this.$parent.loadTabs()}},i=(a(376),a(26)),s=Object(i.a)(n,(function(){var t=this.$createElement;return(this._self._c||t)("div",{staticClass:"theme-code-block",class:{"theme-code-block__active":this.active}},[this._t("default")],2)}),[],!1,null,"759a7d02",null);e.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/50.511e3e44.js b/assets/js/50.511e3e44.js
new file mode 100644
index 000000000..147c80676
--- /dev/null
+++ b/assets/js/50.511e3e44.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{424:function(e,r,t){"use strict";t.r(r);var n=t(26),a=Object(n.a)({},(function(){var e=this,r=e.$createElement,t=e._self._c||r;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"quartz-net-3-1-beta-1-released"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quartz-net-3-1-beta-1-released"}},[e._v("#")]),e._v(" Quartz.NET 3.1 beta 1 Released")]),e._v(" "),t("p",[e._v("The wait is almost over, after more than two years of hiatus, Quartz.NET 3.1 beta 1 is here with exciting new features. This release concentrates on performance and bringing support to de facto Microsoft libraries like dependency injection and ASP.NET Core hosting.")]),e._v(" "),t("h3",{attrs:{id:"support-for-asp-net-core-dependency-injection-and-hosted-services"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#support-for-asp-net-core-dependency-injection-and-hosted-services"}},[e._v("#")]),e._v(" Support for ASP.NET Core Dependency Injection and Hosted Services")]),e._v(" "),t("p",[e._v("You can find the revisited packages as:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.Extensions.DependencyInjection/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Quartz.Extensions.DependencyInjection"),t("OutboundLink")],1),e._v(" - Microsoft DI integration")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.AspNetCore",target:"_blank",rel:"noopener noreferrer"}},[e._v("Quartz.AspNetCore"),t("OutboundLink")],1),e._v(" - ASP.NET Core integration")])]),e._v(" "),t("p",[e._v("I would like to thank both "),t("a",{attrs:{href:"https://github.com/fglaeser",target:"_blank",rel:"noopener noreferrer"}},[e._v("Facundo Glaeser"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://github.com/zlzforever",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lewis Zou"),t("OutboundLink")],1),e._v(" for working with the new integration packages and their logistics.")]),e._v(" "),t("p",[e._v("The best resource the see the new DI integration in progress is to head to "),t("a",{attrs:{href:"https://github.com/quartznet/quartznet/tree/master/src/Quartz.Examples.AspNetCore",target:"_blank",rel:"noopener noreferrer"}},[e._v("the example ASP.NET Core application"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"index-and-query-performance-improvements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#index-and-query-performance-improvements"}},[e._v("#")]),e._v(" Index and query performance improvements")]),e._v(" "),t("p",[e._v("A big change on the persistent store side is that now SQL queries use parametrized scheduler name, which allows database server to reuse query plans and use indexes more optimally. This will help especially clusters which have large number of nodes. The SQL server indexes were also revisited and their amount reduced by using smarter covering indexes.")]),e._v(" "),t("p",[e._v("See the "),t("a",{attrs:{href:"https://github.com/quartznet/quartznet/blob/42af207fa815789936e8e4ce5ebd4516a23d7c72/database/tables/tables_sqlServer.sql#L349-L388",target:"_blank",rel:"noopener noreferrer"}},[e._v("updated create index definition"),t("OutboundLink")],1),e._v(" for more details.")]),e._v(" "),t("p",[e._v("There are also some minor bug fixes present.")]),e._v(" "),t("h3",{attrs:{id:"known-issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#known-issues"}},[e._v("#")]),e._v(" Known Issues")]),e._v(" "),t("p",[e._v("The documentation for the new integration features is still being worked on.")]),e._v(" "),t("h3",{attrs:{id:"github-issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#github-issues"}},[e._v("#")]),e._v(" GitHub Issues")]),e._v(" "),t("p",[t("strong",[e._v("BREAKING CHANGES")])]),e._v(" "),t("ul",[t("li",[e._v("minimum supported .NET Full Framework is now 4.6.1")])]),e._v(" "),t("p",[t("strong",[e._v("NEW FEATURE")])]),e._v(" "),t("ul",[t("li",[e._v("Microsoft DI integration via package Quartz.Extensions.DependencyInjection (also allows briding to Microsoft Logging)")]),e._v(" "),t("li",[e._v("ASP.NET Core / Hosting integration and health checks via revisited NuGet package Quartz.AspNetCore (thank you zlzforever for contributing the work)")]),e._v(" "),t("li",[e._v("Introduced a config parameter "),t("code",[e._v("ClusterCheckinMisfireThreshold")]),e._v(" (#692)")]),e._v(" "),t("li",[e._v("Giving meaningful names to examples folders (#701)")]),e._v(" "),t("li",[e._v("Added search patterns/sub directory search to directoty scanner job (#411, #708)")]),e._v(" "),t("li",[e._v("Fluent interface for scheduler configuration (#791)")]),e._v(" "),t("li",[e._v("Support every nth week in cron expression (#790)")]),e._v(" "),t("li",[e._v("Enable SQLite job store provider for NetStandard (#802)")]),e._v(" "),t("li",[e._v("Add configurable params for StdRowLockSemaphore for Failure obtaining db row lock")]),e._v(" "),t("li",[e._v("SchedName added to queries as sql paramteter (#818)")]),e._v(" "),t("li",[e._v("Server, example and test projects upgraded to user .NET Core 3.1")]),e._v(" "),t("li",[e._v("Nullable reference type annotations have been enabled")]),e._v(" "),t("li",[e._v("Symbols are now provided as a separate NuGet symbol package (snupkg)")]),e._v(" "),t("li",[e._v("SQL Server indexes have been fine-tuned, redudancies were removed and you can follow the current scripts to update to latest version of them")])]),e._v(" "),t("p",[t("strong",[e._v("FIXES")])]),e._v(" "),t("ul",[t("li",[e._v("Allow binary serialization for DirectoryScanJob data (#658)")]),e._v(" "),t("li",[e._v("LibLog - Fixed NLog + Log4net callsite. Added support for NLog structured logging. Optimized Log4net-logger (#705)")]),e._v(" "),t("li",[e._v("Upgrade LibLog to latest version (#749)")]),e._v(" "),t("li",[e._v("RAMJobStore performance improvements (#718, #719, #720)")]),e._v(" "),t("li",[e._v("General performance improvements (#725, #723, #727)")]),e._v(" "),t("li",[e._v("GetTimeBefore() and GetFinalFireTime() should throw NotImplementedException instead of returning null (#731)")]),e._v(" "),t("li",[e._v("Switch to official TimeZoneConverter NuGet package (#739)")]),e._v(" "),t("li",[e._v("Remove invalid TimeSpanParseRule.Days (#782)")]),e._v(" "),t("li",[e._v("Update tables_sqlServer.sql to follow current SQL syntax and structures (#787)")]),e._v(" "),t("li",[e._v("Fix China Standard Time mapping in TimeZoneUtil.cs (#765)")]),e._v(" "),t("li",[e._v("Release BLOCKED triggers in ReleaseAcquiredTrigger (#741 #800)")]),e._v(" "),t("li",[e._v("DailyTimeIntervalTrigger failed to set endingDailyAfterCount = 1")]),e._v(" "),t("li",[e._v("CronTrigger: cover all valid misfire policies, and provide a sensible default and logging when seeing an invalid one")])]),e._v(" "),t("Download")],1)}),[],!1,null,null,null);r.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/51.86078c87.js b/assets/js/51.86078c87.js
new file mode 100644
index 000000000..d58d7a8ce
--- /dev/null
+++ b/assets/js/51.86078c87.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[51],{425:function(e,t,s){"use strict";s.r(t);var r=s(26),a=Object(r.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("h2",{attrs:{id:"quartz-net-3-1-beta-2-released"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#quartz-net-3-1-beta-2-released"}},[e._v("#")]),e._v(" Quartz.NET 3.1 beta 2 Released")]),e._v(" "),s("p",[e._v("The wait is almost over, after more than two years of hiatus, Quartz.NET 3.1 beta 2 is here with exciting new features.\nThis release builds on top of "),s("RouterLink",{attrs:{to:"/2020/07/08/quartznet-3-1-beta-1-released/"}},[e._v("beta 1")]),e._v(" adding more fixes and improvements. Read the "),s("RouterLink",{attrs:{to:"/2020/07/08/quartznet-3-1-beta-1-released/"}},[e._v("beta 1 release notes")]),e._v(" to know more.")],1),e._v(" "),s("h3",{attrs:{id:"known-issues"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#known-issues"}},[e._v("#")]),e._v(" Known Issues")]),e._v(" "),s("p",[e._v("The documentation for the new integration features is still being worked on.")]),e._v(" "),s("h3",{attrs:{id:"github-issues"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#github-issues"}},[e._v("#")]),e._v(" GitHub Issues")]),e._v(" "),s("p",[s("strong",[e._v("NEW FEATURE")])]),e._v(" "),s("ul",[s("li",[e._v("DI configuration now supports adding scheduler, job and trigger listeners (#877)")]),e._v(" "),s("li",[e._v('DI configuration now processes appsettings.json section "Quartz" looking for key value pairs (#877)')]),e._v(" "),s("li",[e._v("Use Microsoft.Data.SqlClient as SQL Server connection library (#839)")])]),e._v(" "),s("p",[s("strong",[e._v("FIXES")])]),e._v(" "),s("ul",[s("li",[e._v("Fix potential scheduler deadlock caused by changed lock request id inside ExecuteInNonManagedTXLock (#794)")]),e._v(" "),s("li",[e._v("Ensure NuGet.exe is part of produced zip to ensure build works (#881)")]),e._v(" "),s("li",[e._v("JobDataMap with enum values persisted as JSON can now be set back to job members via PropertySettingJobFactory (#770)")]),e._v(" "),s("li",[e._v("Ensure GetScheduleBuilder for triggers respects IgnoreMisfirePolicy (#750)")]),e._v(" "),s("li",[e._v("Remove cron expression validation from XML schema and rely on CronExpression itself (#729)")])]),e._v(" "),s("Download")],1)}),[],!1,null,null,null);t.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/52.b04217a8.js b/assets/js/52.b04217a8.js
new file mode 100644
index 000000000..30827b887
--- /dev/null
+++ b/assets/js/52.b04217a8.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{426:function(e,t,a){"use strict";a.r(t);var s=a(26),r=Object(s.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h2",{attrs:{id:"quartz-net-3-1-beta-3-released"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#quartz-net-3-1-beta-3-released"}},[e._v("#")]),e._v(" Quartz.NET 3.1 beta 3 Released")]),e._v(" "),a("p",[e._v("The wait is almost over, after more than two years of hiatus, Quartz.NET 3.1 beta 2 is here with exciting new features.\nThis release builds on top of beta 1 and beta 2 adding more fixes and improvements.")]),e._v(" "),a("p",[e._v("Read the "),a("RouterLink",{attrs:{to:"/2020/07/08/quartznet-3-1-beta-1-released/"}},[e._v("beta 1 release notes")]),e._v(" and "),a("RouterLink",{attrs:{to:"/2020/07/14/quartznet-3-1-beta-2-released/"}},[e._v("beta 2 release notes")]),e._v(" to know more.")],1),e._v(" "),a("h3",{attrs:{id:"known-issues"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#known-issues"}},[e._v("#")]),e._v(" Known Issues")]),e._v(" "),a("p",[e._v("The documentation for the new integration features is still being worked on.")]),e._v(" "),a("h3",{attrs:{id:"github-issues"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#github-issues"}},[e._v("#")]),e._v(" GitHub Issues")]),e._v(" "),a("p",[a("strong",[e._v("NEW FEATURE")])]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[e._v("* Upgrade MySqlConnector to 1.0 (namespace has changed) (#890)\n* Support Microsoft.Extensions.Logging.Abstractions (#756)\n* Support Microsoft.Data.SQLite with full framework (#893)\n* Support custom calendar JSON serialization (#697)\n")])])]),a("p",[a("strong",[e._v("FIXES")])]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[e._v("* Remove internal dependencies from examples (#742)\n* Properly assign MaxConcurrency in CreateVolatileScheduler (#726) \n")])])]),a("Download")],1)}),[],!1,null,null,null);t.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/53.d4849106.js b/assets/js/53.d4849106.js
new file mode 100644
index 000000000..b97257c8a
--- /dev/null
+++ b/assets/js/53.d4849106.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{427:function(t,e,n){"use strict";n.r(e);var s=n(26),r=Object(s.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("Redirect",{attrs:{to:"/2020/07/24/quartznet-3-1-released"}})],1)}),[],!1,null,null,null);e.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/54.568a20d9.js b/assets/js/54.568a20d9.js
new file mode 100644
index 000000000..59914b5e2
--- /dev/null
+++ b/assets/js/54.568a20d9.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[54],{428:function(e,t,r){"use strict";r.r(t);var a=r(26),n=Object(a.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("p",[e._v("This release concentrates on performance and bringing support for standard integrations.\nQuartz 3.1 supports "),r("code",[e._v("netstandard2.0")]),e._v(" and "),r("code",[e._v("net461")]),e._v(" targets (for integrations they may be different).")]),e._v(" "),r("p"),r("div",{staticClass:"table-of-contents"},[r("ul",[r("li",[r("a",{attrs:{href:"#new-integrations"}},[e._v("New Integrations")]),r("ul",[r("li",[r("a",{attrs:{href:"#support-for-asp-net-core-dependency-injection-and-hosted-services"}},[e._v("Support for ASP.NET Core Dependency Injection and Hosted Services")])]),r("li",[r("a",{attrs:{href:"#opentelemetry-integration"}},[e._v("OpenTelemetry Integration")])])])]),r("li",[r("a",{attrs:{href:"#database"}},[e._v("Database")]),r("ul",[r("li",[r("a",{attrs:{href:"#better-indexes-for-sql-server-and-smarter-parametrized-queries"}},[e._v("Better Indexes for SQL Server and smarter parametrized queries")])]),r("li",[r("a",{attrs:{href:"#bug-fix-for-cluster-locking"}},[e._v("Bug fix for cluster locking")])]),r("li",[r("a",{attrs:{href:"#microsoft-data-sqlclient-as-sql-server-connection-library"}},[e._v("Microsoft.Data.SqlClient as SQL Server connection library")])]),r("li",[r("a",{attrs:{href:"#upgrade-mysqlconnector-to-1-0-namespace-has-changed"}},[e._v("Upgrade MySqlConnector to 1.0 (namespace has changed)")])])])]),r("li",[r("a",{attrs:{href:"#known-issues"}},[e._v("Known Issues")])]),r("li",[r("a",{attrs:{href:"#github-issues"}},[e._v("GitHub Issues")])])])]),r("p"),e._v(" "),r("h2",{attrs:{id:"new-integrations"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#new-integrations"}},[e._v("#")]),e._v(" New Integrations")]),e._v(" "),r("h3",{attrs:{id:"support-for-asp-net-core-dependency-injection-and-hosted-services"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#support-for-asp-net-core-dependency-injection-and-hosted-services"}},[e._v("#")]),e._v(" Support for ASP.NET Core Dependency Injection and Hosted Services")]),e._v(" "),r("p",[e._v("New NuGet packages "),r("a",{attrs:{href:"/documentation/quartz-3.x/packages/aspnet-core-integration"}},[e._v("ASP.NET Core Integration")]),e._v(" and "),r("a",{attrs:{href:"/documentation/quartz-3.x/packages/microsoft-di-integration"}},[e._v("Quartz.Extensions.DependencyInjection")]),e._v("\nfinally bring built-in support for integrating Quartz.NET with reliable manner with the Microsoft DI container and hosted services infrastructure.")]),e._v(" "),r("p",[e._v("The best resource the see the new DI integration in progress is to head to "),r("a",{attrs:{href:"https://github.com/quartznet/quartznet/tree/master/src/Quartz.Examples.AspNetCore",target:"_blank",rel:"noopener noreferrer"}},[e._v("the example ASP.NET Core application"),r("OutboundLink")],1),e._v(".")]),e._v(" "),r("p",[e._v("I would like to thank both "),r("a",{attrs:{href:"https://github.com/fglaeser",target:"_blank",rel:"noopener noreferrer"}},[e._v("Facundo Glaeser"),r("OutboundLink")],1),e._v(" and "),r("a",{attrs:{href:"https://github.com/zlzforever",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lewis Zou"),r("OutboundLink")],1),e._v(" for working with the new integration packages and their logistics.")]),e._v(" "),r("h3",{attrs:{id:"opentelemetry-integration"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#opentelemetry-integration"}},[e._v("#")]),e._v(" OpenTelemetry Integration")]),e._v(" "),r("p",[e._v("New experimental NuGet package "),r("RouterLink",{attrs:{to:"/documentation/quartz-3.x/packages/opentelemetry-integration.html"}},[e._v("Quartz.OpenTelemetry.Instrumentation")]),e._v(" brings support for emerging OpenTelemetry standard.")],1),e._v(" "),r("p",[e._v("First version of integration is able transmit job execution ("),r("code",[e._v("Started")]),e._v(", "),r("code",[e._v("Ended")]),e._v(", "),r("code",[e._v("Exception")]),e._v(") information to exporters. With this infrastructure is should also be easier to implement job history\nusing battle-tested log backends for storing data. "),r("a",{attrs:{href:"https://github.com/quartznet/quartznet/tree/master/src/Quartz.Examples.AspNetCore",target:"_blank",rel:"noopener noreferrer"}},[e._v("The example ASP.NET Core application"),r("OutboundLink")],1),e._v(" integrates\nwith Jaeger and transmits this data.")]),e._v(" "),r("h2",{attrs:{id:"database"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#database"}},[e._v("#")]),e._v(" Database")]),e._v(" "),r("h3",{attrs:{id:"better-indexes-for-sql-server-and-smarter-parametrized-queries"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#better-indexes-for-sql-server-and-smarter-parametrized-queries"}},[e._v("#")]),e._v(" Better Indexes for SQL Server and smarter parametrized queries")]),e._v(" "),r("p",[e._v("A big change on the persistent store side is that now SQL queries use parametrized scheduler name, which allows database server to reuse query plans and use indexes more optimally.\nThis will help especially clusters which have large number of nodes. The SQL server indexes were also revisited and their amount reduced by using smarter covering indexes.")]),e._v(" "),r("p",[e._v("See the "),r("a",{attrs:{href:"https://github.com/quartznet/quartznet/blob/42af207fa815789936e8e4ce5ebd4516a23d7c72/database/tables/tables_sqlServer.sql#L349-L388",target:"_blank",rel:"noopener noreferrer"}},[e._v("updated create index definition"),r("OutboundLink")],1),e._v(" for more details.")]),e._v(" "),r("div",{staticClass:"custom-block tip"},[r("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),r("p",[e._v("You need to re-run the index script to take advantage of changes, this will drop old indexes and rebuild/create new ones, it can be time-consuming!")])]),e._v(" "),r("h3",{attrs:{id:"bug-fix-for-cluster-locking"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#bug-fix-for-cluster-locking"}},[e._v("#")]),e._v(" Bug fix for cluster locking")]),e._v(" "),r("p",[e._v("There is also a very important bug fix present for lock handling on retries. There was a possibility for a deadlock in cluster's database lock handling in some situations.")]),e._v(" "),r("h3",{attrs:{id:"microsoft-data-sqlclient-as-sql-server-connection-library"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#microsoft-data-sqlclient-as-sql-server-connection-library"}},[e._v("#")]),e._v(" Microsoft.Data.SqlClient as SQL Server connection library")]),e._v(" "),r("p",[e._v("Quartz now uses "),r("a",{attrs:{href:"https://www.nuget.org/packages/Microsoft.Data.SqlClient/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Microsoft.Data.SqlClient"),r("OutboundLink")],1),e._v(" as the connection library for SQL Server as it's the one going to get new features.\nIt is dependency for Quartz library (for now) so you shouldn't need to do any manual install steps.")]),e._v(" "),r("h3",{attrs:{id:"upgrade-mysqlconnector-to-1-0-namespace-has-changed"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#upgrade-mysqlconnector-to-1-0-namespace-has-changed"}},[e._v("#")]),e._v(" Upgrade MySqlConnector to 1.0 (namespace has changed)")]),e._v(" "),r("p",[e._v("You need to use the latest "),r("a",{attrs:{href:"https://www.nuget.org/packages/MySqlConnector/",target:"_blank",rel:"noopener noreferrer"}},[e._v("MySqlConnector 1.0.0"),r("OutboundLink")],1),e._v(" in order to use with default Quartz configuration.\nAs the namespace for library has changed it's not backwards compatible.\nIf you need to use the old version, you should manually register DB provider with the old details.")]),e._v(" "),r("h2",{attrs:{id:"known-issues"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#known-issues"}},[e._v("#")]),e._v(" Known Issues")]),e._v(" "),r("p",[e._v("No known issues. Documentation might require additions and community contributions are welcomed. Edits should be easy now with the new publishing framework.")]),e._v(" "),r("h2",{attrs:{id:"github-issues"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#github-issues"}},[e._v("#")]),e._v(" GitHub Issues")]),e._v(" "),r("p",[r("strong",[e._v("BREAKING CHANGES")])]),e._v(" "),r("ul",[r("li",[e._v("minimum supported .NET Full Framework is now 4.6.1")]),e._v(" "),r("li",[e._v("changed SQL commands format in "),r("code",[e._v("Quartz.Impl.AdoJobStore.JobStoreSupport")]),e._v(" (see also "),r("a",{attrs:{href:"https://github.com/quartznet/quartznet/pull/818",target:"_blank",rel:"noopener noreferrer"}},[e._v("#818"),r("OutboundLink")],1),e._v("). Affected are only schedulers that use customized configurations of SQL commands in "),r("code",[e._v("Quartz.Impl.AdoJobStore.JobStoreSupport")]),e._v(", e.g. "),r("code",[e._v("SelectWithLockSQL")]),e._v(". Migration example:")])]),e._v(" "),r("div",{staticClass:"language-xml extra-class"},[r("pre",{pre:!0,attrs:{class:"language-xml"}},[r("code",[r("span",{pre:!0,attrs:{class:"token comment"}},[e._v("\x3c!-- Quartz <=3.0.7 --\x3e")]),e._v("\n"),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("<")]),e._v("item")]),e._v(" "),r("span",{pre:!0,attrs:{class:"token attr-name"}},[e._v("key")]),r("span",{pre:!0,attrs:{class:"token attr-value"}},[r("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[e._v("=")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v('"')]),e._v("quartz.jobStore.selectWithLockSQL"),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v('"')])]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])]),e._v("SELECT * FROM {0}LOCKS WITH (UPDLOCK,ROWLOCK) WHERE SCHED_NAME = {1} AND LOCK_NAME = @lockName"),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("")]),e._v("item")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])]),e._v("\n"),r("span",{pre:!0,attrs:{class:"token comment"}},[e._v("\x3c!-- Quartz >=3.1.0 --\x3e")]),e._v("\n"),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("<")]),e._v("item")]),e._v(" "),r("span",{pre:!0,attrs:{class:"token attr-name"}},[e._v("key")]),r("span",{pre:!0,attrs:{class:"token attr-value"}},[r("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[e._v("=")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v('"')]),e._v("quartz.jobStore.selectWithLockSQL"),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v('"')])]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])]),e._v("SELECT * FROM {0}LOCKS WITH (UPDLOCK,ROWLOCK) WHERE SCHED_NAME = @schedulerName AND LOCK_NAME = @lockName"),r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token tag"}},[r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("")]),e._v("item")]),r("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])]),e._v("\n")])])]),r("p",[r("strong",[e._v("NEW FEATURE")])]),e._v(" "),r("ul",[r("li",[e._v("Microsoft DI integration via package Quartz.Extensions.DependencyInjection (also allows bridging to Microsoft Logging)")]),e._v(" "),r("li",[e._v("DI configuration now supports adding scheduler, job and trigger listeners (#877)")]),e._v(" "),r("li",[e._v('DI configuration now processes appsettings.json section "Quartz" looking for key value pairs (#877)')]),e._v(" "),r("li",[e._v("Add diagnostics source and OpenTelemetry support (#901)")]),e._v(" "),r("li",[e._v("Use Microsoft.Data.SqlClient as SQL Server connection library (#839)")]),e._v(" "),r("li",[e._v("ASP.NET Core / Hosting integration and health checks via revisited NuGet package Quartz.AspNetCore (thank you zlzforever for contributing the work)")]),e._v(" "),r("li",[e._v("Introduced a config parameter "),r("code",[e._v("ClusterCheckinMisfireThreshold")]),e._v(" (#692)")]),e._v(" "),r("li",[e._v("Giving meaningful names to examples folders (#701)")]),e._v(" "),r("li",[e._v("Added search patterns/sub directory search to directory scanner job (#411, #708)")]),e._v(" "),r("li",[e._v("Fluent interface for scheduler configuration (#791)")]),e._v(" "),r("li",[e._v("Support every nth week in cron expression (#790)")]),e._v(" "),r("li",[e._v("Enable SQLite job store provider for NetStandard (#802)")]),e._v(" "),r("li",[e._v("Add configurable params for StdRowLockSemaphore for Failure obtaining db row lock")]),e._v(" "),r("li",[e._v("SchedName added to queries as sql parameter (#818)")]),e._v(" "),r("li",[e._v("Server, example and test projects upgraded to user .NET Core 3.1")]),e._v(" "),r("li",[e._v("Nullable reference type annotations have been enabled")]),e._v(" "),r("li",[e._v("Symbols are now provided as a separate NuGet symbol package (snupkg)")]),e._v(" "),r("li",[e._v("SQL Server indexes have been fine-tuned, redundancies were removed and you can follow the current scripts to update to latest version of them")]),e._v(" "),r("li",[e._v("Upgrade MySqlConnector to 1.0 (namespace has changed) (#890)")]),e._v(" "),r("li",[e._v("Support Microsoft.Extensions.Logging.Abstractions (#756)")]),e._v(" "),r("li",[e._v("Support Microsoft.Data.SQLite with full framework (#893)")]),e._v(" "),r("li",[e._v("Support custom calendar JSON serialization (#697)")]),e._v(" "),r("li",[e._v("DI configuration now supports adding scheduler, job and trigger listeners (#877)")]),e._v(" "),r("li",[e._v('DI configuration now processes appsettings.json section "Quartz" looking for key value pairs (#877)')]),e._v(" "),r("li",[e._v("Use Microsoft.Data.SqlClient as SQL Server connection library (#839)")])]),e._v(" "),r("p",[r("strong",[e._v("FIXES")])]),e._v(" "),r("ul",[r("li",[e._v("Allow binary serialization for DirectoryScanJob data (#658)")]),e._v(" "),r("li",[e._v("LibLog - Fixed NLog + Log4net callsite. Added support for NLog structured logging. Optimized Log4net-logger (#705)")]),e._v(" "),r("li",[e._v("Upgrade LibLog to latest version (#749)")]),e._v(" "),r("li",[e._v("RAMJobStore performance improvements (#718, #719, #720)")]),e._v(" "),r("li",[e._v("General performance improvements (#725, #723, #727)")]),e._v(" "),r("li",[e._v("GetTimeBefore() and GetFinalFireTime() should throw NotImplementedException instead of returning null (#731)")]),e._v(" "),r("li",[e._v("Switch to official TimeZoneConverter NuGet package (#739)")]),e._v(" "),r("li",[e._v("Remove invalid TimeSpanParseRule.Days (#782)")]),e._v(" "),r("li",[e._v("Update tables_sqlServer.sql to follow current SQL syntax and structures (#787)")]),e._v(" "),r("li",[e._v("Fix China Standard Time mapping in TimeZoneUtil.cs (#765)")]),e._v(" "),r("li",[e._v("Release BLOCKED triggers in ReleaseAcquiredTrigger (#741 #800)")]),e._v(" "),r("li",[e._v("DailyTimeIntervalTrigger failed to set endingDailyAfterCount = 1")]),e._v(" "),r("li",[e._v("CronTrigger: cover all valid misfire policies, and provide a sensible default and logging when seeing an invalid one")]),e._v(" "),r("li",[e._v("Remove internal dependencies from examples (#742)")]),e._v(" "),r("li",[e._v("Properly assign MaxConcurrency in CreateVolatileScheduler (#726)")]),e._v(" "),r("li",[e._v("Fix potential scheduler deadlock caused by changed lock request id inside ExecuteInNonManagedTXLock (#794)")]),e._v(" "),r("li",[e._v("Ensure NuGet.exe is part of produced zip to ensure build works (#881)")]),e._v(" "),r("li",[e._v("JobDataMap with enum values persisted as JSON can now be set back to job members via PropertySettingJobFactory (#770)")]),e._v(" "),r("li",[e._v("Ensure GetScheduleBuilder for triggers respects IgnoreMisfirePolicy (#750)")]),e._v(" "),r("li",[e._v("Remove cron expression validation from XML schema and rely on CronExpression itself (#729)")])]),e._v(" "),r("Download")],1)}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/55.b96bcec3.js b/assets/js/55.b96bcec3.js
new file mode 100644
index 000000000..463682840
--- /dev/null
+++ b/assets/js/55.b96bcec3.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[55],{429:function(t,a,s){"use strict";s.r(a);var n=s(26),e=Object(n.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("This release concentrates on tweaking the DI story and fixing some found dependency issues.")]),t._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#quartz-extensions-hosting"}},[t._v("Quartz.Extensions.Hosting")])]),s("li",[s("a",{attrs:{href:"#refining-di-integration-api"}},[t._v("Refining DI integration API")]),s("ul",[s("li",[s("a",{attrs:{href:"#options-pattern"}},[t._v("Options pattern")])]),s("li",[s("a",{attrs:{href:"#schedulejob"}},[t._v("ScheduleJob")])]),s("li",[s("a",{attrs:{href:"#addcalendar"}},[t._v("AddCalendar")])])])]),s("li",[s("a",{attrs:{href:"#microsoft-sql-server"}},[t._v("Microsoft SQL Server")]),s("ul",[s("li",[s("a",{attrs:{href:"#full-framework"}},[t._v("Full Framework")])]),s("li",[s("a",{attrs:{href:"#net-core"}},[t._v(".NET Core")])]),s("li",[s("a",{attrs:{href:"#query-plan-cache-pollution-fix"}},[t._v("Query plan cache pollution fix")])])])]),s("li",[s("a",{attrs:{href:"#github-issues"}},[t._v("GitHub Issues")])])])]),s("p"),t._v(" "),s("h2",{attrs:{id:"quartz-extensions-hosting"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#quartz-extensions-hosting"}},[t._v("#")]),t._v(" Quartz.Extensions.Hosting")]),t._v(" "),s("p",[t._v("A new package "),s("a",{attrs:{href:"https://www.nuget.org/packages/Quartz.Extensions.Hosting/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Quartz.Extensions.Hosting"),s("OutboundLink")],1),t._v("\nwas created with the help of "),s("a",{attrs:{href:"https://andrewlock.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Andrew Lock"),s("OutboundLink")],1),t._v(". If you are using generic host and you don't need\nASP.NET specific functionality like health checks, you can switch to this new package to reduce dependencies.")]),t._v(" "),s("h2",{attrs:{id:"refining-di-integration-api"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#refining-di-integration-api"}},[t._v("#")]),t._v(" Refining DI integration API")]),t._v(" "),s("p",[t._v("Some work was done to improve the MS DI integration API.")]),t._v(" "),s("h3",{attrs:{id:"options-pattern"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#options-pattern"}},[t._v("#")]),t._v(" Options pattern")]),t._v(" "),s("p",[t._v("Now the API uses "),s("a",{attrs:{href:"https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options",target:"_blank",rel:"noopener noreferrer"}},[t._v("options pattern"),s("OutboundLink")],1),t._v("\nproperly and you can attach your own configurators to alter "),s("code",[t._v("QuartzOptions")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// we can use options pattern to support hooking your own configuration")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// because we don't use service registration api")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// we need to manally ensure the job is present in DI")]),t._v("\nservices"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddTransient")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ExampleJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \nservices"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Configure")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("SampleOptions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Configuration"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetSection")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Sample"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nservices"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddOptions")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("QuartzOptions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Configure")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("IOptions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("SampleOptions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("options"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" dep"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("IsNullOrWhiteSpace")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dep"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("CronSchedule"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" jobKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("JobKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options-custom-job"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"custom"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n options"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddJob")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ExampleJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("j "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" j"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jobKey"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n options"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddTrigger")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("trigger "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" trigger\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"options-custom-trigger"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"custom"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jobKey"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithCronSchedule")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("dep"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Value"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("CronSchedule"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),s("h3",{attrs:{id:"schedulejob"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#schedulejob"}},[t._v("#")]),t._v(" ScheduleJob")]),t._v(" "),s("p",[t._v("A new shorthand was created to quickly define a job with trigger using a single call.")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v("q"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ExampleJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("trigger "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" trigger\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Combined Configuration Trigger"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartAt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("EvenSecondDate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateTimeOffset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddSeconds")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithDailyTimeIntervalSchedule")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithInterval")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" IntervalUnit"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Second"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithDescription")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my awesome trigger configured for a job with single call"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h3",{attrs:{id:"addcalendar"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#addcalendar"}},[t._v("#")]),t._v(" AddCalendar")]),t._v(" "),s("p",[t._v("You can now add calendars using the DI API.")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" calendarName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myHolidayCalendar"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nq"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddCalendar")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("HolidayCalendar"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token named-parameter punctuation"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" calendarName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token named-parameter punctuation"}},[t._v("replace")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token named-parameter punctuation"}},[t._v("updateTriggers")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddExcludedDate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("DateTime")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nq"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddTrigger")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("t "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" t\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Daily Trigger"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jobKey"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartAt")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("EvenSecondDate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateTimeOffset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddSeconds")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithDailyTimeIntervalSchedule")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithInterval")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" IntervalUnit"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Second"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithDescription")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"my awesome daily time interval trigger"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ModifiedByCalendar")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("calendarName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("h2",{attrs:{id:"microsoft-sql-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#microsoft-sql-server"}},[t._v("#")]),t._v(" Microsoft SQL Server")]),t._v(" "),s("p",[t._v("Now Quartz no longer has hard dependency on "),s("code",[t._v("Microsoft.Data.SqlClient")]),t._v(" package.\nFull framework defaults now back to same behavior as it was with Quartz 3.0 (using built-in System.Data.SqlClient driver).")]),t._v(" "),s("h3",{attrs:{id:"full-framework"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#full-framework"}},[t._v("#")]),t._v(" Full Framework")]),t._v(" "),s("p",[t._v("You can use either one of the two providers, "),s("code",[t._v("SqlServer")]),t._v(" (default) or "),s("code",[t._v("SystemDataSqlClient")]),t._v(". Former uses "),s("code",[t._v("System.Data.SqlClient")]),t._v(" and latter\nthe new "),s("a",{attrs:{href:"https://www.nuget.org/packages/Microsoft.Data.SqlClient",target:"_blank",rel:"noopener noreferrer"}},[t._v("Microsoft.Data.SqlClient package"),s("OutboundLink")],1),t._v(".\nIf you choose to use the new package, make sure you have the NuGet package installed.")]),t._v(" "),s("h3",{attrs:{id:"net-core"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#net-core"}},[t._v("#")]),t._v(" .NET Core")]),t._v(" "),s("p",[t._v("You need to ensure you have "),s("a",{attrs:{href:"https://www.nuget.org/packages/Microsoft.Data.SqlClient",target:"_blank",rel:"noopener noreferrer"}},[t._v("Microsoft.Data.SqlClient package"),s("OutboundLink")],1),t._v(" installed.")]),t._v(" "),s("h3",{attrs:{id:"query-plan-cache-pollution-fix"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#query-plan-cache-pollution-fix"}},[t._v("#")]),t._v(" Query plan cache pollution fix")]),t._v(" "),s("p",[t._v("There was an important fix for SQL Server where varying text parameter sizes caused query plan cache pollution. Now when no parameter size is\ndefined for string parameter, default value of 4000 will be used. This problem has been present since the beginning.")]),t._v(" "),s("h2",{attrs:{id:"github-issues"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#github-issues"}},[t._v("#")]),t._v(" GitHub Issues")]),t._v(" "),s("p",[s("strong",[t._v("BREAKING CHANGES")])]),t._v(" "),s("ul",[s("li",[t._v("Remove dependency on Microsoft.Data.SqlClient (#912)")]),t._v(" "),s("li",[t._v("LogContext moved from Quartz namespace to Quartz.Logging namespace (#915)")]),t._v(" "),s("li",[t._v("For Full Framework, System.Data.SqlClient is again the default provider, Microsoft.Data can be used via provider MicrosoftDataSqlClient (#916)")])]),t._v(" "),s("p",[s("strong",[t._v("NEW FEATURE")])]),t._v(" "),s("ul",[s("li",[t._v("Introduce separate Quartz.Extensions.Hosting (#911)")]),t._v(" "),s("li",[t._v("You can now schedule job and trigger in MS DI integration with single .ScheduleJob call (#943)")]),t._v(" "),s("li",[t._v("Support adding calendars to MS DI via AddCalendar (#945)")])]),t._v(" "),s("p",[s("strong",[t._v("FIXES")])]),t._v(" "),s("ul",[s("li",[t._v("Revert change in 3.1: CronExpression/cron trigger throwing "),s("code",[t._v("NotImplementedException")]),t._v(" when calculating final fire time (#905)")]),t._v(" "),s("li",[t._v("Use 2.1 as the minimum version for the .NET Platform Extensions (#923)")]),t._v(" "),s("li",[t._v("ServiceCollection.AddQuartz() should register default ITypeLoadHelper if none supplied (#924)")]),t._v(" "),s("li",[t._v("SqlServer AdoJobStore SqlParameter without text size generates pressure on server (#939)")]),t._v(" "),s("li",[t._v("DbProvider initialization logic should also read quartz.config (#951)")]),t._v(" "),s("li",[t._v("LoggingJobHistoryPlugin and LoggingTriggerHistoryPlugin names are null with IoC configuration (#926)")]),t._v(" "),s("li",[t._v("Improve options pattern to allow better custom configuration story (#955)")])]),t._v(" "),s("Download")],1)}),[],!1,null,null,null);a.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/56.6c9b74df.js b/assets/js/56.6c9b74df.js
new file mode 100644
index 000000000..70385ae36
--- /dev/null
+++ b/assets/js/56.6c9b74df.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[56],{430:function(e,t,o){"use strict";o.r(t);var n=o(26),i=Object(n.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v("This is a maintenance release containing mostly bug fixes.")]),e._v(" "),o("p",[e._v("MS dependency injection job factory configuration was unified and you can now configure relevant options\nlike whether to create a separate scope with using just the "),o("code",[e._v("UseMicrosoftDependencyInjectionJobFactory")]),e._v(" and its callback.\nNow scoped jobs also get their properties set from job data map.")]),e._v(" "),o("p",[e._v("Pre-configuring Quartz options from "),o("code",[e._v("appsettings.json")]),e._v(" with "),o("code",[e._v('services.Configure(Configuration.GetSection("Quartz"));')]),e._v("\nnow also works as expected.")]),e._v(" "),o("h2",{attrs:{id:"github-issues"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#github-issues"}},[e._v("#")]),e._v(" GitHub Issues")]),e._v(" "),o("p",[o("strong",[e._v("FIXES")])]),e._v(" "),o("ul",[o("li",[e._v("Make QuartzOptions Triggers and JobDetails public (#981)")]),e._v(" "),o("li",[e._v("Fix configuration system injection for dictionary/quartz.jobStore.misfireThreshold in DI (#983)")]),e._v(" "),o("li",[e._v("XMLSchedulingDataProcessor can cause IOException due to file locking (#993)")])]),e._v(" "),o("p",[o("strong",[e._v("IMPROVEMENTS")])]),e._v(" "),o("ul",[o("li",[e._v("Unify MS dependency injection job factory logic and configuration (#995)")]),e._v(" "),o("li",[e._v("Improve job dispatch performance to reduce latency before hitting Execute (RAMJobStore) (#996)")])]),e._v(" "),o("Download")],1)}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/57.00f4144b.js b/assets/js/57.00f4144b.js
new file mode 100644
index 000000000..1b9f5f17f
--- /dev/null
+++ b/assets/js/57.00f4144b.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[57],{431:function(s,e,t){"use strict";t.r(e);var o=t(26),r=Object(o.a)({},(function(){var s=this,e=s.$createElement,t=s._self._c||e;return t("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[t("p",[s._v("This release addresses regression in scoped job resolution which was introduced by job factory refactoring done in 3.2.1.")]),s._v(" "),t("h2",{attrs:{id:"github-issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#github-issues"}},[s._v("#")]),s._v(" GitHub Issues")]),s._v(" "),t("p",[t("strong",[s._v("FIXES")])]),s._v(" "),t("ul",[t("li",[s._v("Fix scoped job resolution (#998)")])]),s._v(" "),t("Download")],1)}),[],!1,null,null,null);e.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/58.816401b6.js b/assets/js/58.816401b6.js
new file mode 100644
index 000000000..3210c5452
--- /dev/null
+++ b/assets/js/58.816401b6.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[58],{432:function(t,e,a){"use strict";a.r(e);var n=a(26),r=Object(n.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[t._v("This release addresses issue with Autofac integration and adds new integration package\n"),a("a",{attrs:{href:"/documentation/quartz-3.x/packages/opentracing-integration"}},[t._v("Quartz.OpenTracing")]),t._v(" to allow\nintegration with OpenTracing contributed by "),a("a",{attrs:{href:"https://github.com/PavelStefanov",target:"_blank",rel:"noopener noreferrer"}},[t._v("Pavel Stefanov"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"github-issues"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#github-issues"}},[t._v("#")]),t._v(" GitHub Issues")]),t._v(" "),a("p",[a("strong",[t._v("NEW FEATURE")])]),t._v(" "),a("ul",[a("li",[t._v("Add Quartz.OpenTracing support (#1006)")]),t._v(" "),a("li",[t._v("Add UseZeroSizeThreadPool to configuration (#1003)")])]),t._v(" "),a("p",[a("strong",[t._v("FIXES")])]),t._v(" "),a("ul",[a("li",[t._v("Xamarin Android can't get scheduler (#1008)")]),t._v(" "),a("li",[t._v("Autofac job factory registration fails (#1011)")])]),t._v(" "),a("Download")],1)}),[],!1,null,null,null);e.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/59.39f29e19.js b/assets/js/59.39f29e19.js
new file mode 100644
index 000000000..95ee8e1a4
--- /dev/null
+++ b/assets/js/59.39f29e19.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{433:function(e,t,i){"use strict";i.r(t);var n=i(26),s=Object(n.a)({},(function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[i("p",[e._v("This release is a maintenance release with couple of bug fixes. The most important fix for this release is that\nnow Quartz distinguishes between external code task cancellation (say "),i("code",[e._v("HttpClient")]),e._v(") and job cancellation triggered by using\nthe Quartz API's "),i("code",[e._v("Interrupt")]),e._v(" method. Earlier Quartz incorrectly considered also other "),i("code",[e._v("OperationCanceledException")]),e._v("s as clean instead of being errors.")]),e._v(" "),i("h2",{attrs:{id:"github-issues"}},[i("a",{staticClass:"header-anchor",attrs:{href:"#github-issues"}},[e._v("#")]),e._v(" GitHub Issues")]),e._v(" "),i("p",[i("strong",[e._v("FIXES")])]),e._v(" "),i("ul",[i("li",[i("code",[e._v("JobRunShell")]),e._v(" silently handles "),i("code",[e._v("OperationCanceledException")]),e._v(" which is not correct in terms of job retry handling (#1064)")]),e._v(" "),i("li",[e._v("Handled exceptions thrown while retrieving the misfired trigger (#1040)")]),e._v(" "),i("li",[i("code",[e._v("FileScanJob")]),e._v(" is faling after upgrading from 3.0.7 to 3.2.3 (#1027)")]),e._v(" "),i("li",[i("code",[e._v("JobBuilder.UsingJobData(string key, string value)")]),e._v(" should be "),i("code",[e._v("JobBuilder.UsingJobData(string key, string? value)")]),e._v(" (#1025)")])]),e._v(" "),i("Download")],1)}),[],!1,null,null,null);t.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/6.4b03a90b.js b/assets/js/6.4b03a90b.js
new file mode 100644
index 000000000..decd7faa8
--- /dev/null
+++ b/assets/js/6.4b03a90b.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{343:function(e,t,a){},377:function(e,t,a){"use strict";a(343)},387:function(e,t,a){"use strict";a.r(t);a(49),a(27),a(72),a(73);var o={name:"CodeGroup",data:function(){return{codeTabs:[],activeCodeTabIndex:-1}},watch:{activeCodeTabIndex:function(e){this.activateCodeTab(e)}},mounted:function(){this.loadTabs()},methods:{changeCodeTab:function(e){this.activeCodeTabIndex=e},loadTabs:function(){var e=this;this.codeTabs=(this.$slots.default||[]).filter((function(e){return Boolean(e.componentOptions)})).map((function(t,a){return""===t.componentOptions.propsData.active&&(e.activeCodeTabIndex=a),{title:t.componentOptions.propsData.title,elm:t.elm}})),-1===this.activeCodeTabIndex&&this.codeTabs.length>0&&(this.activeCodeTabIndex=0),this.activateCodeTab(0)},activateCodeTab:function(e){this.codeTabs.forEach((function(e){e.elm&&e.elm.classList.remove("theme-code-block__active")})),this.codeTabs[e].elm&&this.codeTabs[e].elm.classList.add("theme-code-block__active")}}},n=(a(377),a(26)),c=Object(n.a)(o,(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ClientOnly",[a("div",{staticClass:"theme-code-group"},[a("div",{staticClass:"theme-code-group__nav"},[a("ul",{staticClass:"theme-code-group__ul"},e._l(e.codeTabs,(function(t,o){return a("li",{key:t.title,staticClass:"theme-code-group__li"},[a("button",{staticClass:"theme-code-group__nav-tab",class:{"theme-code-group__nav-tab-active":o===e.activeCodeTabIndex},on:{click:function(t){return e.changeCodeTab(o)}}},[e._v("\n "+e._s(t.title)+"\n ")])])})),0)]),e._v(" "),e._t("default"),e._v(" "),e.codeTabs.length<1?a("pre",{staticClass:"pre-blank"},[e._v("// Make sure to add code blocks to your code group")]):e._e()],2)])}),[],!1,null,"deefee04",null);t.default=c.exports}}]);
\ No newline at end of file
diff --git a/assets/js/60.65653623.js b/assets/js/60.65653623.js
new file mode 100644
index 000000000..c575b2f84
--- /dev/null
+++ b/assets/js/60.65653623.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[60],{434:function(e,o,t){"use strict";t.r(o);var r=t(26),i=Object(r.a)({},(function(){var e=this,o=e.$createElement,t=e._self._c||o;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[e._v("This release addresses problems with using Quartz with .NET Full Framework lower than 4.7.2. ValueTask loading\ncould fail due the dependencies brought with activity source support. Now activity sources are only supported when\nusing .NET Framework >= 4.7.2 and netstandard >= 2.0. This also raises requirement the same way for package\nQuartz.OpenTelemetry.Instrumentation.")]),e._v(" "),t("p",[e._v("This release also improves trigger acquisition performance when using persistent job store, mostly by reducing network round-trips.\nThe semaphore implementations were also re-written to gain more performance.")]),e._v(" "),t("p",[e._v("Also some bug fixes included, thanks to all contributors!")]),e._v(" "),t("h2",{attrs:{id:"github-issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#github-issues"}},[e._v("#")]),e._v(" GitHub Issues")]),e._v(" "),t("p",[t("strong",[e._v("BREAKING CHANGES")])]),e._v(" "),t("ul",[t("li",[e._v("Activity source listener is not longer part of "),t("code",[e._v("net461")]),e._v(" build, only "),t("code",[e._v("net472")])]),e._v(" "),t("li",[t("code",[e._v("Quartz.AspNetCore")]),e._v(" integration package minimum .NET Core version is now 3.1 for HealthChecks support")])]),e._v(" "),t("p",[t("strong",[e._v("NEW FEATURES")])]),e._v(" "),t("ul",[t("li",[e._v("Separate build configuration for .NET Framework 4.7.2")]),e._v(" "),t("li",[e._v("OpenTelemetry integration upgraded to target OpenTelemetry 1.0.0-rc1.1")]),e._v(" "),t("li",[e._v("Ported "),t("code",[e._v("JobInterruptMonitorPlugin")]),e._v(" from Java version which allows automatic interrupt calls for registered jobs (#1110)")]),e._v(" "),t("li",[e._v("Rewrite semaphore implementations (#1115)")]),e._v(" "),t("li",[t("code",[e._v("UsingJobData")]),e._v(" now has "),t("code",[e._v("Guid")]),e._v(" and "),t("code",[e._v("char")]),e._v(" overloads (#1141)")]),e._v(" "),t("li",[e._v("Add a regular "),t("code",[e._v("AddJob(Type)")]),e._v(" (#1090)")])]),e._v(" "),t("p",[t("strong",[e._v("FIXES")])]),e._v(" "),t("ul",[t("li",[e._v("Jobs not firing after upgrade to 3.2.x (from 3.0.7) on Microsoft Server 2008 R2 (#1083)")]),e._v(" "),t("li",[e._v("Jobs are not fired (#1072)")]),e._v(" "),t("li",[t("code",[e._v("MicrosoftDependencyInjectionJobFactory")]),e._v(" does not inject job properties for scoped jobs (#1106)")]),e._v(" "),t("li",[e._v("XSD schema no longer requires defining "),t("code",[e._v("durable")]),e._v(" element if you just want to define "),t("code",[e._v("recover")]),e._v(" (#1128)")]),e._v(" "),t("li",[e._v("Stack trace logging fixed in case of reporting invalid lock acquire (#1133)")]),e._v(" "),t("li",[e._v("Disposable job is disposed twice when using "),t("code",[e._v("UseMicrosoftDependencyInjectionScopedJobFactory")]),e._v(" (#1120)")]),e._v(" "),t("li",[t("code",[e._v("QuartzHostedService.StopAsync")]),e._v(" throws "),t("code",[e._v("NullReferenceException")]),e._v(" if "),t("code",[e._v("StartAsync")]),e._v(" hasn't been run (#1123)")])]),e._v(" "),t("Download")],1)}),[],!1,null,null,null);o.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/61.7418f9a5.js b/assets/js/61.7418f9a5.js
new file mode 100644
index 000000000..9d4908b6f
--- /dev/null
+++ b/assets/js/61.7418f9a5.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{435:function(t,s,e){"use strict";e.r(s);var i=e(26),n=Object(i.a)({},(function(){var t=this.$createElement,s=this._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[s("p",[this._v("This release fixes assembly signing problem introduced in 3.3.")]),this._v(" "),s("p",[s("strong",[this._v("FIXES")])]),this._v(" "),s("ul",[s("li",[this._v("Remove PublicSign property from csproj (#1155)")])]),this._v(" "),s("Download")],1)}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/62.0bc12fc5.js b/assets/js/62.0bc12fc5.js
new file mode 100644
index 000000000..2d051b73b
--- /dev/null
+++ b/assets/js/62.0bc12fc5.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{436:function(e,t,o){"use strict";o.r(t);var r=o(26),s=Object(r.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v("This release returns the possibility to resolve jobs from Microsoft DI container. Now container is checked first and if not found then\nActivatorUtilities is used to construct the type with constructor injection support. Now both "),o("code",[e._v("AllowDefaultConstructor")]),e._v(" and "),o("code",[e._v("CreateScope")]),e._v(" have\nbeen obsoleted as behavior is now either via DI construction or "),o("code",[e._v("ActivatorUtilities")]),e._v(" and scope is always created to prevent resource leaks / double disposal.")]),e._v(" "),o("p",[e._v("Also a problem with host name resolution under WSL2 scenario was fixed.")]),e._v(" "),o("p",[o("strong",[e._v("FIXES")])]),e._v(" "),o("ul",[o("li",[e._v("Try resolving jobs from service provider before resorting to ActivatorUtilities (#1159)")]),e._v(" "),o("li",[e._v("Can't get hostname on WSL2+docker host network (#1158)")])]),e._v(" "),o("Download")],1)}),[],!1,null,null,null);t.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/63.a9ad1d02.js b/assets/js/63.a9ad1d02.js
new file mode 100644
index 000000000..e40e3dbf6
--- /dev/null
+++ b/assets/js/63.a9ad1d02.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[63],{437:function(e,t,o){"use strict";o.r(t);var n=o(26),i=Object(n.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v("This is a maintenance release mostly fixing some smaller bugs and improving DI API story.")]),e._v(" "),o("p",[o("strong",[e._v("FIXES")])]),e._v(" "),o("ul",[o("li",[e._v("Lock 'TRIGGER_ACCESS' attempt to return by: de9325af-3e1c-4ae9-a99b-24be994b75f4 -- but not owner! (#1236)")]),e._v(" "),o("li",[e._v("ScheduleJob shorthand: Job name should match trigger name by default (#1211)")]),e._v(" "),o("li",[e._v("CronTriggerImpl.WillFireOn returns wrong result when TimeZone is specified (#1187)")]),e._v(" "),o("li",[e._v("Race condition in DI scheduler listener initialization (#1117)")]),e._v(" "),o("li",[e._v("JobRunShell handle Job CancellationToken (#1183)")]),e._v(" "),o("li",[e._v("Restore System.Data.SqlClient support on .NET Core (#1181)")])]),e._v(" "),o("p",[o("strong",[e._v("IMPROVEMENTS")])]),e._v(" "),o("ul",[o("li",[e._v("Replace static loggers with instance-based (#1264)")]),e._v(" "),o("li",[e._v("Expose more configuration options via programmatic APIs (#1263)")]),e._v(" "),o("li",[e._v("Add ConfigureScope extension point to MicrosoftDependencyInjectionJobFactory (#1189)")]),e._v(" "),o("li",[e._v("Update StdAdoConstants.cs (#1186)")]),e._v(" "),o("li",[e._v("Use custom InstantiateType for all instantiations in StdSchedulerFactory (#1185)")]),e._v(" "),o("li",[e._v("Add support for the ISchedulerFactory.StartDelayed in the QuartzHostedService (#1166)")]),e._v(" "),o("li",[e._v("Remove SimpleThreadPool from examples? (#1230)")])]),e._v(" "),o("Download")],1)}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/64.d0324155.js b/assets/js/64.d0324155.js
new file mode 100644
index 000000000..653af5083
--- /dev/null
+++ b/assets/js/64.d0324155.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[64],{438:function(t,s,e){"use strict";e.r(s);var n=e(26),l=Object(n.a)({},(function(){var t=this.$createElement,s=this._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[s("h1",{attrs:{id:"blog"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#blog"}},[this._v("#")]),this._v(" Blog")]),this._v(" "),s("BlogIndex")],1)}),[],!1,null,null,null);s.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/65.4e9653df.js b/assets/js/65.4e9653df.js
new file mode 100644
index 000000000..3759228e8
--- /dev/null
+++ b/assets/js/65.4e9653df.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[65],{439:function(t,a,r){"use strict";r.r(a);var i=r(26),o=Object(i.a)({},(function(){var t=this,a=t.$createElement,r=t._self._c||a;return r("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[r("ul",[r("li",[r("RouterLink",{attrs:{to:"/documentation/faq.html"}},[t._v("Frequently Asked Questions")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/documentation/best-practices.html"}},[t._v("Best Practices")])],1)]),t._v(" "),r("h2",{attrs:{id:"available-documents-quartz-3-x"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#available-documents-quartz-3-x"}},[t._v("#")]),t._v(" Available Documents (Quartz 3.x):")]),t._v(" "),r("ul",[r("li",[r("RouterLink",{attrs:{to:"/documentation/quartz-3.x/quick-start.html"}},[t._v("Quick Start Guide")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/index.html"}},[t._v("Tutorials for Developing with Quartz")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/documentation/quartz-3.x/tutorial/crontrigger.html"}},[t._v("CronTrigger Tutorial")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/documentation/quartz-3.x/migration-guide.html"}},[t._v("Migration Guide")])],1)]),t._v(" "),r("h2",{attrs:{id:"available-documents-quartz-2-x"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#available-documents-quartz-2-x"}},[t._v("#")]),t._v(" Available Documents (Quartz 2.x):")]),t._v(" "),r("ul",[r("li",[r("RouterLink",{attrs:{to:"/documentation/quartz-2.x/quick-start.html"}},[t._v("Quick Start Guide")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/index.html"}},[t._v("Tutorials for Developing with Quartz")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/crontrigger.html"}},[t._v("CronTrigger Tutorial")])],1),t._v(" "),r("li",[r("RouterLink",{attrs:{to:"/documentation/quartz-2.x/migration-guide.html"}},[t._v("Migration Guide")])],1)]),t._v(" "),r("h2",{attrs:{id:"available-documents-quartz-1-x"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#available-documents-quartz-1-x"}},[t._v("#")]),t._v(" Available Documents (Quartz 1.x):")]),t._v(" "),r("ul",[r("li",[r("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/index.html"}},[t._v("Tutorials for Developing with Quartz")])],1)])])}),[],!1,null,null,null);a.default=o.exports}}]);
\ No newline at end of file
diff --git a/assets/js/66.3e14e87f.js b/assets/js/66.3e14e87f.js
new file mode 100644
index 000000000..45473fcdb
--- /dev/null
+++ b/assets/js/66.3e14e87f.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{440:function(e,t,a){"use strict";a.r(t);var i=a(26),s=Object(i.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("p",[a("em",[e._v("This document was adapted from Quartz Java")])]),e._v(" "),a("h2",{attrs:{id:"jobdatamap-tips"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#jobdatamap-tips"}},[e._v("#")]),e._v(" JobDataMap Tips")]),e._v(" "),a("h3",{attrs:{id:"only-store-primitive-data-types-including-strings-in-the-jobdatamap"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#only-store-primitive-data-types-including-strings-in-the-jobdatamap"}},[e._v("#")]),e._v(" Only Store Primitive Data Types (including Strings) In the JobDataMap")]),e._v(" "),a("p",[e._v("Only store primitive data types (including strings) in JobDataMap to avoid data serialization issues short and long-term.")]),e._v(" "),a("h3",{attrs:{id:"use-the-merged-jobdatamap"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#use-the-merged-jobdatamap"}},[e._v("#")]),e._v(" Use the Merged JobDataMap")]),e._v(" "),a("p",[e._v("The JobDataMap that is found on the "),a("code",[e._v("JobExecutionContext")]),e._v(" during Job execution serves as a convenience.\nIt is a merge of the JobDataMap found on the JobDetail and the one found on the Trigger, with the value in the latter overriding any same-named values in the former.")]),e._v(" "),a("p",[e._v("Storing JobDataMap values on a Trigger can be useful in the case where you have a Job that is stored in the scheduler for regular/repeated use by multiple Triggers,\nyet with each independent triggering, you want to supply the Job with different data inputs.")]),e._v(" "),a("p",[e._v("In light of all of the above, we recommend as a best practice the following: Code within the "),a("code",[e._v("IJob.Execute(..)")]),e._v(" method should generally retrieve\nvalues from the JobDataMap on found on the JobExecutionContext, rather than directly from the one on the JobDetail.")]),e._v(" "),a("h2",{attrs:{id:"trigger-tips"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#trigger-tips"}},[e._v("#")]),e._v(" Trigger Tips")]),e._v(" "),a("h3",{attrs:{id:"use-triggerutils"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#use-triggerutils"}},[e._v("#")]),e._v(" Use TriggerUtils")]),e._v(" "),a("p",[e._v("TriggerUtils:")]),e._v(" "),a("ul",[a("li",[e._v("Offers a simple way to create Dates (for start/end dates)")]),e._v(" "),a("li",[e._v("Offers helpers for analyzing triggers (e.g. calculating future fire times)")])]),e._v(" "),a("h2",{attrs:{id:"ado-net-jobstore"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ado-net-jobstore"}},[e._v("#")]),e._v(" ADO.NET JobStore")]),e._v(" "),a("h3",{attrs:{id:"never-write-directly-to-quartz-s-tables"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#never-write-directly-to-quartz-s-tables"}},[e._v("#")]),e._v(" Never Write Directly To Quartz's Tables")]),e._v(" "),a("p",[e._v("Writing scheduling data directly to the database (via SQL) rather than using scheduling API:")]),e._v(" "),a("ul",[a("li",[e._v("Results in data corruption (deleted data, scrambled data)")]),e._v(" "),a("li",[e._v('Results in job seemingly "vanishing" without executing when a trigger\'s fire time arrives')]),e._v(" "),a("li",[e._v('Results in job not executing "just sitting there" when a trigger\'s fire time arrives')]),e._v(" "),a("li",[e._v("May result in: Dead-locks")]),e._v(" "),a("li",[e._v("Other strange problems and data corruption")])]),e._v(" "),a("h3",{attrs:{id:"never-point-a-non-clustered-scheduler-at-the-same-database-as-another-scheduler-with-the-same-scheduler-name"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#never-point-a-non-clustered-scheduler-at-the-same-database-as-another-scheduler-with-the-same-scheduler-name"}},[e._v("#")]),e._v(" Never Point A Non-Clustered Scheduler At the Same Database As Another Scheduler With The Same Scheduler Name")]),e._v(" "),a("p",[e._v("If you point more than one scheduler instance at the same set of database tables, and one or more of those instances is not configured for clustering, any of the following may occur:")]),e._v(" "),a("ul",[a("li",[e._v("Results in data corruption (deleted data, scrambled data)")]),e._v(" "),a("li",[e._v('Results in job seemingly "vanishing" without executing when a trigger\'s fire time arrives')]),e._v(" "),a("li",[e._v('Results in job not executing, "just sitting there" when a trigger\'s fire time arrives')]),e._v(" "),a("li",[e._v("May result in: Dead-locks")]),e._v(" "),a("li",[e._v("Other strange problems and data corruption")])]),e._v(" "),a("h3",{attrs:{id:"ensure-adequate-datasource-connection-size"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#ensure-adequate-datasource-connection-size"}},[e._v("#")]),e._v(" Ensure Adequate Datasource Connection Size")]),e._v(" "),a("p",[e._v("It is recommended that your Datasource max connection size be configured to be at least the number of worker threads in the thread pool plus three.\nYou may need additional connections if your application is also making frequent calls to the scheduler API.")]),e._v(" "),a("h2",{attrs:{id:"daylight-savings-time"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#daylight-savings-time"}},[e._v("#")]),e._v(" Daylight Savings Time")]),e._v(" "),a("h3",{attrs:{id:"avoid-scheduling-jobs-near-the-transition-hours-of-daylight-savings-time"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#avoid-scheduling-jobs-near-the-transition-hours-of-daylight-savings-time"}},[e._v("#")]),e._v(" Avoid Scheduling Jobs Near the Transition Hours of Daylight Savings Time")]),e._v(" "),a("p",[e._v("NOTE: Specifics of the transition hour and the amount of time the clock moves forward or back varies by locale see: "),a("a",{attrs:{href:"https://secure.wikimedia.org/wikipedia/en/wiki/Daylight_saving_time_around_the_world",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://secure.wikimedia.org/wikipedia/en/wiki/Daylight_saving_time_around_the_world"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("p",[e._v("SimpleTriggers are not affected by Daylight Savings Time as they always fire at an exact millisecond in time, and repeat an exact number of milliseconds apart.")]),e._v(" "),a("p",[e._v("Because CronTriggers fire at given hours/minutes/seconds, they are subject to some oddities when DST transitions occur.")]),e._v(" "),a("p",[e._v("As an example of possible issues, scheduling in the United States within TimeZones/locations that observe Daylight Savings time, the following problems may occur if using CronTrigger and scheduling fire times during the hours of 1:00 AM and 2:00 AM:")]),e._v(" "),a("ul",[a("li",[e._v("1:05 AM may occur twice! - duplicate firings on CronTrigger possible")]),e._v(" "),a("li",[e._v("2:05 AM may never occur! - missed firings on CronTrigger possible")])]),e._v(" "),a("p",[e._v("Again, specifics of time and amount of adjustment varies by locale.")]),e._v(" "),a("p",[e._v("Other trigger types that are based on sliding along a calendar (rather than exact amounts of time), such as CalenderIntervalTrigger, will be similarly affected - but rather than missing a firing, or firing twice, may end up having it's fire time shifted by an hour.")]),e._v(" "),a("h2",{attrs:{id:"jobs"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#jobs"}},[e._v("#")]),e._v(" Jobs")]),e._v(" "),a("h3",{attrs:{id:"waiting-for-conditions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#waiting-for-conditions"}},[e._v("#")]),e._v(" Waiting For Conditions")]),e._v(" "),a("p",[e._v("Long-running jobs prevent others from running (if all threads in the ThreadPool are busy).")]),e._v(" "),a("p",[e._v("If you feel the need to call Thread.sleep() on the worker thread executing the Job, it is typically a sign that the job is not ready to do the rest of its work because it needs to wait for some condition (such as the availability of a data record) to become true.")]),e._v(" "),a("p",[e._v("A better solution is to release the worker thread (exit the job) and allow other jobs to execute on that thread. The job can reschedule itself, or other jobs before it exits.")]),e._v(" "),a("h3",{attrs:{id:"throwing-exceptions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#throwing-exceptions"}},[e._v("#")]),e._v(" Throwing Exceptions")]),e._v(" "),a("p",[e._v("A Job's execute method should contain a try-catch block that handles all possible exceptions.")]),e._v(" "),a("p",[e._v("If a job throws an exception, Quartz will typically immediately re-execute it, meaning the job can and likely will throw the same exception again. This can lead to wasted resources and, in the worst cases, unstable or crashed applications.\nIt's better if the job catches all exceptions it may encounter, handles them, and reschedules itself or other jobs to work around the issue.")]),e._v(" "),a("h3",{attrs:{id:"recoverability-and-idempotence"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#recoverability-and-idempotence"}},[e._v("#")]),e._v(" Recoverability and Idempotence")]),e._v(" "),a("p",[e._v('In-progress Jobs marked "recoverable" are automatically re-executed after a scheduler fails. This means some of the job\'s "work" will be executed twice.')]),e._v(" "),a("p",[e._v("This means the job should be coded in such a way that its work is idempotent.")]),e._v(" "),a("h2",{attrs:{id:"listeners-triggerlistener-joblistener-schedulerlistener"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#listeners-triggerlistener-joblistener-schedulerlistener"}},[e._v("#")]),e._v(" Listeners (TriggerListener, JobListener, SchedulerListener)")]),e._v(" "),a("h3",{attrs:{id:"keep-code-in-listeners-concise-and-efficient"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#keep-code-in-listeners-concise-and-efficient"}},[e._v("#")]),e._v(" Keep Code In Listeners Concise And Efficient")]),e._v(" "),a("p",[e._v("Performing large amounts of work is discouraged, as the thread that would be executing the job (or completing the trigger and moving on to firing another job, etc.) will be tied up within the listener.")]),e._v(" "),a("h3",{attrs:{id:"handle-exceptions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#handle-exceptions"}},[e._v("#")]),e._v(" Handle Exceptions")]),e._v(" "),a("p",[e._v("Every listener method should contain a try-catch block that handles all possible exceptions.")]),e._v(" "),a("p",[e._v("If a listener throws an exception, it may cause other listeners not to be notified and/or prevent the execution of the job, etc.")]),e._v(" "),a("h2",{attrs:{id:"exposing-scheduler-functionality-through-applications"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#exposing-scheduler-functionality-through-applications"}},[e._v("#")]),e._v(" Exposing Scheduler Functionality Through Applications")]),e._v(" "),a("h3",{attrs:{id:"be-careful-of-security"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#be-careful-of-security"}},[e._v("#")]),e._v(" Be Careful of Security!")]),e._v(" "),a("p",[e._v("Some users expose Quartz's Scheduler functionality through an application user interface. This can be very useful, though it can also be extremely dangerous.")]),e._v(" "),a("p",[e._v("Be sure you don't mistakenly allow users to define jobs of any type they wish, with whatever parameters they wish.\nFor example, Quartz.Jobs package ships with a pre-made job "),a("code",[e._v("NativeJob")]),e._v(", which will execute any arbitrary native (operating system) system command that it is defined to.\nMalicious users could use this to take control of, or destroy your system.")]),e._v(" "),a("p",[e._v("Likewise other jobs such as "),a("code",[e._v("SendEmailJob")]),e._v(", and virtually any others could be used for malicious intent.")]),e._v(" "),a("p",[e._v("Allowing users to define whatever job they want effectively opens your system to all sorts of vulnerabilities comparable/equivalent to Command Injection Attacks as defined by OWASP and MITRE.")])])}),[],!1,null,null,null);t.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/67.1aade945.js b/assets/js/67.1aade945.js
new file mode 100644
index 000000000..5ab58d9b2
--- /dev/null
+++ b/assets/js/67.1aade945.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{441:function(e,t,a){"use strict";a.r(t);var o=a(26),n=Object(o.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),a("p",[e._v("This FAQ was adapted from Quartz Java")])]),e._v(" "),a("h1",{attrs:{id:"general-questions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#general-questions"}},[e._v("#")]),e._v(" General Questions")]),e._v(" "),a("h2",{attrs:{id:"what-is-quartz"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#what-is-quartz"}},[e._v("#")]),e._v(" What is Quartz")]),e._v(" "),a("p",[e._v('Quartz is a job scheduling system that can be integrated with, or used along\nside virtually any other software system. The term "job scheduler" seems to\nconjure different ideas for different people. As you read this tutorial, you\nshould be able to get a firm idea of what we mean when we use this term, but\nin short, a job scheduler is a system that is responsible for executing\n(or notifying) other software components when a pre-determined (scheduled)\ntime arrives.')]),e._v(" "),a("p",[e._v("Quartz is quite flexible, and contains multiple usage paradigms that can be\nused separately or together, in order to achieve your desired behavior, and\nenable you to write your code in the manner that seems most 'natural' to\nyour project.")]),e._v(" "),a("p",[e._v("Quartz is very light-weight, and requires very little setup/configuration -\nit can actually be used 'out-of-the-box' if your needs are relatively basic.")]),e._v(" "),a("p",[e._v("Quartz is fault-tolerant, and can persist ('remember') your scheduled\njobs between system restarts.")]),e._v(" "),a("p",[e._v("Although Quartz is extremely useful for simply running certain system\nprocesses on given schedules, the full potential of Quartz can be realized\nwhen you learn how to use it to drive the flow of your application's\nbusiness processes.")]),e._v(" "),a("h2",{attrs:{id:"what-is-quartz-from-a-software-component-view"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#what-is-quartz-from-a-software-component-view"}},[e._v("#")]),e._v(" What is Quartz - From a Software Component View?")]),e._v(" "),a("p",[e._v("Quartz is distributed as a small dynamically linked library (.dll file)\nthat contains all of the core Quartz functionality. The main interface (API) to this\nfunctionality is the Scheduler interface. It provides simple operations\nsuch as scheduling/unscheduling jobs, starting/stopping/pausing the scheduler.")]),e._v(" "),a("p",[e._v("If you wish to schedule your own software components for execution they must\nimplement the simple Job interface, which contains the method execute().\nIf you wish to have components notified when a scheduled fire-time arrives,\nthen the components should implement either the TriggerListener or JobListener\ninterface.")]),e._v(" "),a("p",[e._v("The main Quartz 'process' can be started and ran within your own application,\nor a stand-alone application (with an remote interface).")]),e._v(" "),a("h1",{attrs:{id:"why-not-just-use-system-timers-timer"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#why-not-just-use-system-timers-timer"}},[e._v("#")]),e._v(" Why not just use System.Timers.Timer?")]),e._v(" "),a("p",[e._v('.NET Framework has "built-in" timer capabilities, through the\nSystem.Timers.Timer class - why would someone use Quartz rather than these\nstandard features?')]),e._v(" "),a("p",[e._v("There are many reasons! Here are a few:")]),e._v(" "),a("ul",[a("li",[e._v("Timers have no persistence mechanism.")]),e._v(" "),a("li",[e._v("Timers have inflexible scheduling (only able to set start-time & repeat interval, nothing based on dates, time of day, etc.")]),e._v(" "),a("li",[e._v("Timers don't utilize a thread-pool (one thread per timer)")]),e._v(" "),a("li",[e._v("Timers have no real management schemes - you'd have to write your own mechanism for being able to remember, organize and retreive your tasks by name, etc.")])]),e._v(" "),a("p",[e._v("...of course to some simple applications these features may not be important,\nin which case it may then be the right decision not to use Quartz.NET.")]),e._v(" "),a("h1",{attrs:{id:"miscellaneous-questions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#miscellaneous-questions"}},[e._v("#")]),e._v(" Miscellaneous Questions")]),e._v(" "),a("h2",{attrs:{id:"how-many-jobs-is-quartz-capable-of-running"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-many-jobs-is-quartz-capable-of-running"}},[e._v("#")]),e._v(" How many jobs is Quartz capable of running?")]),e._v(" "),a("p",[e._v('This is a tough question to answer... the answer is basically "it depends".')]),e._v(" "),a("p",[e._v('I know you hate that answer, to here\'s some information about what it depends "on".')]),e._v(" "),a("p",[e._v('First off, the JobStore that you use plays a significant factor.\nThe RAM-based JobStore is MUCH (1000x) faster than the ADO.NET-based JobStore.\nThe speed of AdoJobStore depends almost entirely on the speed of the\nconnection to your database, which data base system that you use, and what\nhardware the database is running on. Quartz actually does very little\nprocessing itself, nearly all of the time is spent in the database. Of course\nRAMJobStore has a more finite limit on how many Jobs & Triggers can be stored,\nas you\'re sure to have less RAM than hard-drive space for a database.\nYou may also look at the FAQ "How do I improve the performance of AdoJobStore?"')]),e._v(" "),a("p",[e._v('So, the limitting factor of the number of Triggers and Jobs Quartz can "store"\nand monitor is really the amount of storage space available to the JobStore\n(either the amount of RAM or the amount of disk space).')]),e._v(" "),a("p",[e._v('Now, aside from "how many can I store?" is the question of "how many jobs\ncan Quartz be running at the same moment in time?"')]),e._v(" "),a("p",[e._v('One thing that CAN slow down quartz itself is using a lot of listeners\n(TriggerListeners, JobListeners, and SchedulerListeners). The time spent in\neach listener obviously adds into the time spent "processing" a job\'s\nexecution, outside of actual execution of the job. This doesn\'t mean that\nyou should be terrified of using listeners, it just means that you should\nuse them judiciously - don\'t create a bunch of "global" listeners if you can\nreally make more specialized ones. Also don\'t do "expensive" things in the\nlisteners, unless you really need to. Also be mindful that many\nplug-ins (such as the "history" plugin) are actually listeners.')]),e._v(" "),a("p",[e._v("The actual number of jobs that can be running at any moment in time is\nlimitted by the size of the thread pool. If there are five threads in\nthe pool, no more than five jobs can run at a time. Be careful of making a\nlot of threads though, as the VM, Operating System, and CPU all have a hard\ntime juggling lots of threads, and performance degrades just because of all\nof the management. In most cases performance starts to tank as you get into\nthe hundreds of threads. Be mindful that if you're running within an\napplication server, it probably has created at least a few dozen threads\nof its own!")]),e._v(" "),a("p",[e._v("Aside from those factors, it really comes down to what your jobs DO.\nIf your jobs take a long time to complete their work, and/or their work is\nvery CPU-intensive, then you're obviously not going to be able to run very\nmany jobs at once, nor very many in a given spanse of time.")]),e._v(" "),a("p",[e._v("Finally, if you just can't get enough horse-power out of one Quartz instance,\nyou can always load-balance many Quartz instances (on separate machines).\nEach will run the jobs out of the shared database on a first-come first-serve\nbasis, as quickly as the triggers need fired.")]),e._v(" "),a("p",[e._v('So here you are this far into the answer of "how many", and I still\nhaven\'t given you a number And I really hate to, because of all of the\nvariables mentioned above. So let me just say, there are installments of\nQuartz Java out there that are managing hundreds-of-thousands of Jobs and Triggers,\nand that at any given moment in time are executing dozens of jobs - and this\nexcludes using load-balancing. With this in mind, most people should feel\nconfident that they can get the performance out of Quartz that they need.')]),e._v(" "),a("h1",{attrs:{id:"questions-about-jobs"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#questions-about-jobs"}},[e._v("#")]),e._v(" Questions About Jobs")]),e._v(" "),a("h2",{attrs:{id:"how-can-i-control-the-instantiation-of-jobs"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-control-the-instantiation-of-jobs"}},[e._v("#")]),e._v(" How can I control the instantiation of Jobs?")]),e._v(" "),a("p",[e._v("See Quartz.Spi.IJobFactory and the Quartz.IScheduler.JobFactory property.")]),e._v(" "),a("h2",{attrs:{id:"how-do-i-keep-a-job-from-being-removed-after-it-completes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-keep-a-job-from-being-removed-after-it-completes"}},[e._v("#")]),e._v(" How do I keep a Job from being removed after it completes?")]),e._v(" "),a("p",[e._v('Set the property JobDetail.Durable = true - which instructs Quartz not to\ndelete the Job when it becomes an "orphan" (when the Job not longer has a\nTrigger referencing it).')]),e._v(" "),a("h2",{attrs:{id:"how-do-i-keep-a-job-from-firing-concurrently"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-keep-a-job-from-firing-concurrently"}},[e._v("#")]),e._v(" How do I keep a Job from firing concurrently?")]),e._v(" "),a("p",[a("strong",[e._v("Quartz.NET 2.x")])]),e._v(" "),a("p",[e._v("Implement "),a("strong",[e._v("IJob")]),e._v(" and also decorate your job class with "),a("code",[e._v("[DisallowConcurrentExecution]")]),e._v(" attribute. Read the API\ndocumentation for "),a("code",[e._v("DisallowConcurrentExecutionAttribute")]),e._v(" for more information.")]),e._v(" "),a("p",[a("strong",[e._v("Quartz.NET 1.x")])]),e._v(" "),a("p",[e._v("Make the job class implement "),a("code",[e._v("IStatefulJob")]),e._v(" rather than "),a("code",[e._v("IJob")]),e._v(". Read the API\ndocumentation for "),a("code",[e._v("IStatefulJob")]),e._v(" for more information.")]),e._v(" "),a("h2",{attrs:{id:"how-do-i-stop-a-job-that-is-currently-executing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-stop-a-job-that-is-currently-executing"}},[e._v("#")]),e._v(" How do I stop a Job that is currently executing?")]),e._v(" "),a("p",[e._v("Quartz 1.x and 2x: See the "),a("code",[e._v("Quartz.IInterruptableJob")]),e._v(" interface, and the "),a("code",[e._v("IScheduler.Interrupt(string, string)")]),e._v(" method.")]),e._v(" "),a("p",[e._v("Quartz 3.x: See "),a("code",[e._v("IJobExecutionContext")]),e._v("'s "),a("code",[e._v("CancellationToken.IsCancellationRequested")])]),e._v(" "),a("h1",{attrs:{id:"questions-about-triggers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#questions-about-triggers"}},[e._v("#")]),e._v(" Questions About Triggers")]),e._v(" "),a("h2",{attrs:{id:"how-do-i-chain-job-execution-or-how-do-i-create-a-workflow"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-chain-job-execution-or-how-do-i-create-a-workflow"}},[e._v("#")]),e._v(" How do I chain Job execution? Or, how do I create a workflow?")]),e._v(" "),a("p",[e._v('There currently is no "direct" or "free" way to chain triggers with Quartz.\nHowever there are several ways you can accomplish it without much effort.\nBelow is an outline of a couple approaches:')]),e._v(" "),a("p",[e._v("One way is to use a listener (i.e. a TriggerListener, JobListener or\nSchedulerListener) that can notice the completion of a job/trigger and then\nimmediately schedule a new trigger to fire. This approach can get a bit\ninvolved, since you'll have to inform the listener which job follows which")]),e._v(" "),a("ul",[a("li",[e._v("and you may need to worry about persistence of this information.")])]),e._v(" "),a("p",[e._v("Another way is to build a Job that contains within its JobDataMap the name\nof the next job to fire, and as the job completes (the last step in its\n"),a("code",[e._v("Execute()")]),e._v(" method) have the job schedule the next job. Several people are\ndoing this and have had good luck. Most have made a base (abstract) class\nthat is a Job that knows how to get the job name and group out of the\nJobDataMap using special keys (constants) and contains code to schedule the\nidentified job. Then they simply make extensions of this class that included\nthe additional work the job should do.")]),e._v(" "),a("p",[e._v("In the future, Quartz will provide a much cleaner way to do this, but until\nthen, you'll have to use one of the above approaches, or think of yet another\nthat works better for you.")]),e._v(" "),a("h2",{attrs:{id:"why-isn-t-my-trigger-firing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#why-isn-t-my-trigger-firing"}},[e._v("#")]),e._v(" Why isn't my trigger firing?")]),e._v(" "),a("p",[e._v("The most common reason for this is not having called "),a("code",[e._v("Scheduler.Start()")]),e._v(",\nwhich tells the scheduler to start firing triggers.")]),e._v(" "),a("p",[e._v("The second most common reason is that the trigger or trigger group\nhas been paused.")]),e._v(" "),a("h2",{attrs:{id:"daylight-saving-time-and-triggers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#daylight-saving-time-and-triggers"}},[e._v("#")]),e._v(" Daylight Saving Time and Triggers")]),e._v(" "),a("p",[e._v("CronTrigger and SimpleTrigger each handle daylight savings time in their own\nway - each in the way that is intuitive to the trigger type.")]),e._v(" "),a("p",[e._v("First, as a review of what daylight savings time is, please read this resource:\nhttp://webexhibits.org/daylightsaving/g.html . Some readers may be unaware\nthat the rules are different for different nations/contents. For example,\nthe 2005 daylight savings time starts in the United States on April 3, but\nin Egypt on April 29. It is also important to know that not only the dates\nare different for different locals, but the time of the shift is different\nas well. Many places shift at 2:00 am, but others shift time at 1:00 am,\nothers at 3:00 am, and still others right at midnight.")]),e._v(" "),a("p",[e._v('SimpleTrigger allows you to schedule jobs to fire every N milliseconds.\nAs such, it has to do nothing in particular with respect to daylight\nsavings time in order to "stay on schedule" - it simply keeps firing every\nN milliseconds. Regardless your SimpleTrigger is firing every 10 seconds,\nor every 15 minutes, or every hour or every 24 hours it will continue to do\nso. However the implication of this which confuses some users is that if\nyour SimpleTrigger is firing say every 12 hours, before daylight savings\nswitches it may be firing at what appears to be 3:00 am and 3:00 pm,\nbut after daylight savings 4:00 am and 4:00 pm. This is not a bug')]),e._v(" "),a("ul",[a("li",[e._v('the trigger has kept firing exacly every N milliseconds, it just that the\n"name" of that time that humans impose on that moment has changed.')])]),e._v(" "),a("p",[e._v('CronTrigger allows you to schedule jobs to fire at certain moments with\nrespect to a "gregorian calendar". Hence, if you create a trigger to fire\nevery day at 10:00 am, before and after daylight savings time switches it\nwill continue to do so. However, depending on whether it was the Spring or\nAutumn daylight savings event, for that particular Sunday, the actual time\ninterval between the firing of the trigger on Sundary morning at 10:00 am\nsince its firing on Saturday morning at 10:00 am will not be 24 hours,\nbut will instead be 23 or 25 hours respectively.')]),e._v(" "),a("p",[e._v("There is one additional point users must understand about CronTrigger with\nrespect to daylight savings. This is that you should take careful thought\nabout creating schedules that fire between midnight and 3:00 am (the critical\nwindow of time depends on your trigger's locale, as explained above).\nThe reason is that depending on your trigger's schedule, and the particular\ndaylight event, the trigger may be skipped or may appear to not fire for an\nhour or two. As examples, say you are in the United States, where daylight\nsavings events occur at 2:00 am. If you have a CronTrrigger that fires every\nday at 2:15 am, then on the day of the beginning of daylight savings time\nthe trigger will be skipped, since, 2:15 am never occurs that day. If you\nhave a CronTrigger that fires every 15 minutes of every hour of every day,\nthen on the day daylight savings time ends you will have an hour of time\nfor which no triggerings occur, because when 2:00 am arrives, it will become\n1:00 am again, however all of the firings during the one o'clock hour have\nalready occurred, and the trigger's next fire time was set to 2:00 am")]),e._v(" "),a("ul",[a("li",[e._v("hence for the next hour no triggerings will occur.")])]),e._v(" "),a("p",[e._v("In summary, all of this makes perfect sense, and should be easy to remember\nif you keep these two rules in mind:")]),e._v(" "),a("ul",[a("li",[e._v("SimpleTrigger ALWAYS fires exacly every N seconds, with no relation to the time of day.")]),e._v(" "),a("li",[e._v("CronTrigger ALWAYS fires at a given time of day and then computes its next time to fire. If that time does not occur on a given day, the trigger will be skipped. If the time occurs twice in a given day, it only fires once, because after firing on that time the first time, it computes the next time of day to fire on.")])]),e._v(" "),a("h1",{attrs:{id:"questions-about-adojobstore"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#questions-about-adojobstore"}},[e._v("#")]),e._v(" Questions About AdoJobStore")]),e._v(" "),a("h2",{attrs:{id:"how-do-i-improve-the-performance-of-adojobstore"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-improve-the-performance-of-adojobstore"}},[e._v("#")]),e._v(" How do I improve the performance of AdoJobStore?")]),e._v(" "),a("p",[e._v("There are a few known ways to speed up AdoJobStore, only one of which is\nvery practical.")]),e._v(" "),a("p",[e._v("First, the obvious, but not-so-practical:")]),e._v(" "),a("ul",[a("li",[e._v("Buy a better (faster) network between the machine that runs Quartz, and the machine that runs your RDBMS.")]),e._v(" "),a("li",[e._v("Buy a better (more powerful) machine to run your database on.")]),e._v(" "),a("li",[e._v("Buy a better RDBMS.")])]),e._v(" "),a("p",[e._v("Secondly, use driver delegate implementation that is specific to your database, like "),a("code",[e._v("SQLServerDelegate")]),e._v(", for best performance.")]),e._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),a("p",[e._v("You should also always prefer the latest version of the library. Quartz.NET 2.0 is much more efficient than 1.x series and 2.2.x line again has AdoJobStore related performance improvements over earlier 2.x releases.")])]),e._v(" "),a("h1",{attrs:{id:"quartz-in-web-environment"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#quartz-in-web-environment"}},[e._v("#")]),e._v(" Quartz in web environment")]),e._v(" "),a("h2",{attrs:{id:"scheduler-keeps-stopping-when-application-pool-gets-recycled"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#scheduler-keeps-stopping-when-application-pool-gets-recycled"}},[e._v("#")]),e._v(" Scheduler keeps stopping when application pool gets recycled")]),e._v(" "),a("p",[e._v("By default IIS recycles and stops app pools from time to time. This means that even if you have Application_Start event to start Quartz when web app is being first accessed, the scheduler might get disposed later on due to site inactivity.")]),e._v(" "),a("p",[e._v("If you have a IIS 8 available, you can configure your site to be preloaded and kept running. See "),a("a",{attrs:{href:"https://blogs.msdn.microsoft.com/vijaysk/2012/10/11/iis-8-whats-new-website-settings/",target:"_blank",rel:"noopener noreferrer"}},[e._v("this blog post"),a("OutboundLink")],1),e._v(" for details.")])])}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/68.ada97766.js b/assets/js/68.ada97766.js
new file mode 100644
index 000000000..339226e31
--- /dev/null
+++ b/assets/js/68.ada97766.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{442:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/69.3918d066.js b/assets/js/69.3918d066.js
new file mode 100644
index 000000000..5433ca461
--- /dev/null
+++ b/assets/js/69.3918d066.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{443:function(t,o,e){"use strict";e.r(o);var r=e(26),s=Object(r.a)({},(function(){var t=this,o=t.$createElement,e=t._self._c||o;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h2",{attrs:{id:"choose-a-lesson"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#choose-a-lesson"}},[t._v("#")]),t._v(" Choose a lesson:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/using-quartz.html"}},[t._v("Lesson 1: Using Quartz")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/jobs-and-triggers.html"}},[t._v("Lesson 2: Jobs And Triggers")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/more-about-jobs.html"}},[t._v("Lesson 3: More About Jobs & JobDetails")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/more-about-triggers.html"}},[t._v("Lesson 4: More About Triggers")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/simpletriggers.html"}},[t._v("Lesson 5: SimpleTriggers")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/crontriggers.html"}},[t._v("Lesson 6: CronTriggers")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/trigger-and-job-listeners.html"}},[t._v("Lesson 7: TriggerListeners & JobListeners")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/scheduler-listeners.html"}},[t._v("Lesson 8: SchedulerListeners")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/job-stores.html"}},[t._v("Lesson 9: JobStores")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/configuration-resource-usage-and-scheduler-factory.html"}},[t._v("Lesson 10: Configuration, Resource Usage and SchedulerFactory")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/advanced-enterprise-features.html"}},[t._v("Lesson 11: Advanced (Enterprise) Features")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/miscellaneous-features.html"}},[t._v("Lesson 12: Miscellaneous Features")])],1)])])}),[],!1,null,null,null);o.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/7.73b42248.js b/assets/js/7.73b42248.js
new file mode 100644
index 000000000..31177445a
--- /dev/null
+++ b/assets/js/7.73b42248.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{521:function(t,s,i){"use strict";i.r(s);var n=i(26),e=Object(n.a)({},(function(){var t=this.$createElement;this._self._c;return this._m(0)}),[function(){var t=this.$createElement,s=this._self._c||t;return s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[this._v("\n Version compatibility\n ")]),this._v(" "),s("p",[this._v("\n This documentation relates to Quartz version 3.0 and later.\n ")])])}],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/70.6d54ab0b.js b/assets/js/70.6d54ab0b.js
new file mode 100644
index 000000000..c647d7648
--- /dev/null
+++ b/assets/js/70.6d54ab0b.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[70],{444:function(e,t,r){"use strict";r.r(t);var n=r(26),i=Object(n.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h2",{attrs:{id:"clustering"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#clustering"}},[e._v("#")]),e._v(" Clustering")]),e._v(" "),r("p",[e._v('Clustering currently only works with the AdoJobstore (JobStoreTX). Features include load-balancing and job fail-over (if the JobDetail\'s "request recovery" flag is set to true).')]),e._v(" "),r("p",[e._v('Enable clustering by setting the "quartz.jobStore.clustered" property to "true".\nEach instance in the cluster should use the same copy of the quartz properties.\nExceptions of this would be to use properties that are identical, with the following allowable exceptions:\nDifferent thread pool size, and different value for the "quartz.scheduler.instanceId" property.\nEach node in the cluster MUST have a unique instanceId, which is easily done (without needing different properties files) by placing "AUTO" as the value of this property.')]),e._v(" "),r("p",[e._v("Never run clustering on separate machines, unless their clocks are synchronized using some form of time-sync service (daemon) that runs very regularly\n(the clocks must be within a second of each other). See "),r("a",{attrs:{href:"http://www.boulder.nist.gov/timefreq/service/its.htm"}},[e._v("http://www.boulder.nist.gov/timefreq/service/its.htm")]),e._v("\nif you are unfamiliar with how to do this.")]),e._v(" "),r("p",[e._v("Never fire-up a non-clustered instance against the same set of tables that any other instance is running against.\nYou may get serious data corruption, and will definitely experience eratic behavior.")])])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/71.a7334470.js b/assets/js/71.a7334470.js
new file mode 100644
index 000000000..e538f7e93
--- /dev/null
+++ b/assets/js/71.a7334470.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{445:function(e,t,o){"use strict";o.r(t);var r=o(26),n=Object(r.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v('Quartz is architected in modular way, and therefore to get it running, several components need to be "snapped" together.\nFortunately, some helpers exist for making this happen.')]),e._v(" "),o("p",[e._v("The major components that need to be configured before Quartz can do its work are:")]),e._v(" "),o("ul",[o("li",[e._v("ThreadPool")]),e._v(" "),o("li",[e._v("JobStore")]),e._v(" "),o("li",[e._v("DataSources (if necessary)")]),e._v(" "),o("li",[e._v("The Scheduler itself")])]),e._v(" "),o("p",[e._v("The ThreadPool provides a set of Threads for Quartz to use when executing Jobs.\nThe more threads in the pool, the greater number of Jobs that can run concurrently.\nHowever, too many threads may bog-down your system.\nMost Quartz users find that 5 or so threads are plenty- because they have fewer than 100 jobs at any given time,\nthe jobs are not generally scheduled to run at the same time, and the jobs are short-lived (complete quickly).\nOther users find that they need 10, 15, 50 or even 100 threads - because they have tens-of-thousands\nof triggers with various schedules - which end up having an average of between 10 and 100 jobs trying to\nexecute at any given moment. Finding the right size for your scheduler's pool is completely dependent on\nwhat you're using the scheduler for. There are no real rules, other than to keep the number of threads as\nsmall as possible (for the sake of your machine's resources) - but make sure you have enough for your Jobs to fire on time.\nNote that if a trigger's time to fire arrives, and there isn't an available thread,\nQuartz will block (pause) until a thread comes available, then the Job will execute -\nsome number of milliseconds later than it should have. This may even cause the tread to misfire - if\nthere is no available thread for the duration of the scheduler's configured \"misfire threshold\".")]),e._v(" "),o("p",[e._v("A IThreadPool interface is defined in the Quartz.Spi namespace, and you can create a IThreadPool implementation in any way you like.\nQuartz ships with a simple (but very satisfactory) thread pool named Quartz.Simpl.SimpleThreadPool.\nThis IThreadPool implementation simply maintains a fixed set of threads in its pool - never grows, never shrinks.\nBut it is otherwise quite robust and is very well tested - as nearly everyone using Quartz uses this pool.")]),e._v(" "),o("p",[e._v("JobStores and DataSrouces were discussed in Lesson 9 of this tutorial. Worth noting here, is the fact that all JobStores\nimplement the IJobStore interface - and that if one of the bundled JobStores does not fit your needs, then you can make your own.")]),e._v(" "),o("p",[e._v("Finally, you need to create your Scheduler instance. The Scheduler itself needs to be given a name and handed\ninstances of a JobStore and ThreadPool.")]),e._v(" "),o("h2",{attrs:{id:"stdschedulerfactory"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#stdschedulerfactory"}},[e._v("#")]),e._v(" StdSchedulerFactory")]),e._v(" "),o("p",[e._v("StdSchedulerFactory is an implementation of the ISchedulerFactory interface.\nIt uses a set of properties (NameValueCollection) to create and initialize a Quartz Scheduler.\nThe properties are generally stored in and loaded from a file, but can also be created by your program and handed directly to the factory.\nSimply calling getScheduler() on the factory will produce the scheduler, initialize it (and its ThreadPool, JobStore and DataSources),\nand return a handle to its public interface.")]),e._v(" "),o("p",[e._v('There are some sample configurations (including descriptions of the properties) in the "docs/config" directory of the Quartz distribution.\nYou can find complete documentation in the "Configuration" manual under the "Reference" section of the Quartz documentation.')]),e._v(" "),o("h2",{attrs:{id:"directschedulerfactory"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#directschedulerfactory"}},[e._v("#")]),e._v(" DirectSchedulerFactory")]),e._v(" "),o("p",[e._v("DirectSchedulerFactory is another SchedulerFactory implementation. It is useful to those wishing to create their Scheduler\ninstance in a more programatic way. Its use is generally discouraged for the following reasons: (1) it\nrequires the user to have a greater understanding of what they're doing, and (2) it does not allow for declaritive\nconfiguration - or in other words, you end up hard-coding all of the scheduler's settings.")]),e._v(" "),o("h2",{attrs:{id:"logging"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#logging"}},[e._v("#")]),e._v(" Logging")]),e._v(" "),o("p",[e._v("Quartz.NET uses the "),o("a",{attrs:{href:"http://netcommon.sourceforge.net/"}},[e._v("Common.Logging framework")]),e._v(' for all of its logging needs.\nQuartz does not produce much logging information - generally just some information during initialization, and\nthen only messages about serious problems while Jobs are executing. In order to "tune" the logging settings\n(such as the amount of output, and where the output goes), you need to understand the Commmon.Logging framework,\nwhich is beyond the scope of this document, please refer to '),o("a",{attrs:{href:"http://netcommon.sourceforge.net/documentation.html"}},[e._v("Common.Logging Documentation")]),e._v(".")])])}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/72.337891b4.js b/assets/js/72.337891b4.js
new file mode 100644
index 000000000..6074f6b0a
--- /dev/null
+++ b/assets/js/72.337891b4.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{446:function(e,t,s){"use strict";s.r(t);var n=s(26),a=Object(n.a)({},(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[s("p",[e._v("CronTriggers are often more useful than SimpleTrigger, if you need a job-firing schedule that recurs based on calendar-like notions,\nrather than on the exactly specified intervals of SimpleTrigger.")]),e._v(" "),s("p",[e._v('With CronTrigger, you can specify firing-schedules such as "every Friday at noon", or "every weekday and 9:30 am",\nor even "every 5 minutes between 9:00 am and 10:00 am on every Monday, Wednesday and Friday".')]),e._v(" "),s("p",[e._v("Even so, like SimpleTrigger, CronTrigger has a startTime which specifies when the schedule is in force, and an (optional)\nendTime that specifies when the schedule should be discontinued.")]),e._v(" "),s("h3",{attrs:{id:"cron-expressions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#cron-expressions"}},[e._v("#")]),e._v(" Cron Expressions")]),e._v(" "),s("p",[e._v("Cron-Expressions are used to configure instances of CronTrigger. Cron-Expressions are strings that are actually made up\nof seven sub-expressions, that describe individual details of the schedule. These sub-expression are separated with white-space, and represent:")]),e._v(" "),s("ul",[s("li",[s("ol",[s("li",[e._v("Seconds")])])]),e._v(" "),s("li",[s("ol",{attrs:{start:"2"}},[s("li",[e._v("Minutes")])])]),e._v(" "),s("li",[s("ol",{attrs:{start:"3"}},[s("li",[e._v("Hours")])])]),e._v(" "),s("li",[s("ol",{attrs:{start:"4"}},[s("li",[e._v("Day-of-Month")])])]),e._v(" "),s("li",[s("ol",{attrs:{start:"5"}},[s("li",[e._v("Month")])])]),e._v(" "),s("li",[s("ol",{attrs:{start:"6"}},[s("li",[e._v("Day-of-Week")])])]),e._v(" "),s("li",[s("ol",{attrs:{start:"7"}},[s("li",[e._v("Year (optional field)")])])])]),e._v(" "),s("p",[e._v('An example of a complete cron-expression is the string "0 0 12 ? * WED" - which means "every Wednesday at 12:00 pm".')]),e._v(" "),s("p",[e._v('Individual sub-expressions can contain ranges and/or lists. For example, the day of week field in the previous (which reads "WED")\nexample could be replaces with "MON-FRI", "MON, WED, FRI", or even "MON-WED,SAT".')]),e._v(" "),s("p",[e._v("Wild-cards (the '"),s("em",[e._v("' character) can be used to say \"every\" possible value of this field. Therefore the '")]),e._v('\' character in the\n"Month" field of the previous example simply means "every month". A \'*\' in the Day-Of-Week field would obviously mean "every day of the week".')]),e._v(" "),s("p",[e._v("All of the fields have a set of valid values that can be specified. These values should be fairly obvious - such as the numbers\n0 to 59 for seconds and minutes, and the values 0 to 23 for hours. Day-of-Month can be any value 0-31, but you need to be careful\nabout how many days are in a given month! Months can be specified as values between 0 and 11, or by using the strings\nJAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC. Days-of-Week can be specified as vaules between 1 and 7 (1 = Sunday)\nor by using the strings SUN, MON, TUE, WED, THU, FRI and SAT.")]),e._v(" "),s("p",[e._v("The '/' character can be used to specify increments to values. For example, if you put '0/15' in the Minutes field, it means 'every 15 minutes,\nstarting at minute zero'. If you used '3/20' in the Minutes field, it would mean 'every 20 minutes during the hour,\nstarting at minute three' - or in other words it is the same as specifying '3,23,43' in the Minutes field.")]),e._v(" "),s("p",[e._v("The '?' character is allowed for the day-of-month and day-of-week fields. It is used to specify \"no specific value\".\nThis is useful when you need to specify something in one of the two fields, but not the other.\nSee the examples below (and CronTrigger API documentation) for clarification.")]),e._v(" "),s("p",[e._v('The \'L\' character is allowed for the day-of-month and day-of-week fields. This character is short-hand for "last",\nbut it has different meaning in each of the two fields. For example, the value "L" in the day-of-month field means\n"the last day of the month" - day 31 for January, day 28 for February on non-leap years. If used in the day-of-week field by itself,\nit simply means "7" or "SAT". But if used in the day-of-week field after another value, it means "the last xxx day of the month" -\nfor example "6L" or "FRIL" both mean "the last friday of the month". When using the \'L\' option, it is important not to specify lists,\nor ranges of values, as you\'ll get confusing results.')]),e._v(" "),s("p",[e._v('The \'W\' is used to specify the weekday (Monday-Friday) nearest the given day. As an example, if you were to specify "15W" as the value for the day-of-month field, the meaning is: "the nearest weekday to the 15th of the month".')]),e._v(" "),s("p",[e._v('The \'#\' is used to specify "the nth" XXX weekday of the month. For example, the value of "6#3" or "FRI#3" in the day-of-week field means "the third Friday of the month".')]),e._v(" "),s("h2",{attrs:{id:"example-cron-expressions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#example-cron-expressions"}},[e._v("#")]),e._v(" Example Cron Expressions")]),e._v(" "),s("p",[e._v("Here are a few more examples of expressions and their meanings - you can find even more in the API documentation for CronTrigger")]),e._v(" "),s("p",[s("strong",[e._v("CronTrigger Example 1 - an expression to create a trigger that simply fires every 5 minutes")])]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",[s("code",[e._v('"0 0/5 * * * ?"\n')])])]),s("p",[s("strong",[e._v("CronTrigger Example 2 - an expression to create a trigger that fires every 5 minutes, at 10 seconds after the minute (i.e. 10:00:10 am, 10:05:10 am, etc.).")])]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",[s("code",[e._v('"10 0/5 * * * ?"\n')])])]),s("p",[s("strong",[e._v("CronTrigger Example 3 - an expression to create a trigger that fires at 10:30, 11:30, 12:30, and 13:30, on every Wednesday and Friday.")])]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",[s("code",[e._v('"0 30 10-13 ? * WED,FRI"\n')])])]),s("p",[s("strong",[e._v("CronTrigger Example 4 - an expression to create a trigger that fires every half hour between the hours of 8 am and 10 am on the 5th and 20th of every month.\nNote that the trigger will NOT fire at 10:00 am, just at 8:00, 8:30, 9:00 and 9:30")])]),e._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",[s("code",[e._v('"0 0/30 8-9 5,20 * ?"\n')])])]),s("p",[e._v('Note that some scheduling requirements are too complicated to express with a single trigger - such as "every 5 minutes between 9:00 am and 10:00 am,\nand every 20 minutes between 1:00 pm and 10:00 pm". The solution in this scenario is to simply create two triggers, and register both of them to run the same job.')]),e._v(" "),s("h3",{attrs:{id:"crontrigger-misfire-instructions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#crontrigger-misfire-instructions"}},[e._v("#")]),e._v(" CronTrigger Misfire Instructions")]),e._v(" "),s("p",[e._v("The following instructions can be used to inform Quartz what it should do when a misfire occurs for CronTrigger.\n(Misfire situations were introduced in the More About Triggers section of this tutorial). These instructions are defined in MisfireInstruction.CronTrigger as\nconstants (and API documentation has description for their behavior). The instructions include:")]),e._v(" "),s("ul",[s("li",[e._v("DoNothing")]),e._v(" "),s("li",[e._v("FireOnceNow")])]),e._v(" "),s("p",[e._v("All triggers have the MisfireInstrution.SmartPolicy instruction available for use, and this instruction is also the default for all trigger types.\nThe 'smart policy' instruction is interpreted by CronTrigger as MisfireInstruction.CronTrigger.FireOnceNow. The API documentation for the\nCronTrigger.UpdateAfterMisfire() method explains the exact details of this behavior.")])])}),[],!1,null,null,null);t.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/73.6f58b4eb.js b/assets/js/73.6f58b4eb.js
new file mode 100644
index 000000000..70b0db511
--- /dev/null
+++ b/assets/js/73.6f58b4eb.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{447:function(e,t,o){"use strict";o.r(t);var a=o(26),r=Object(a.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v("JobStore's are responsible for keeping track of all the \"work data\" that you give to the scheduler:\njobs, triggers, calendars, etc. Selecting the appropriate IJobStore implementation for your Quartz scheduler instance is an important step.\nLuckily, the choice should be a very easy one once you understand the differences between them.\nYou declare which JobStore your scheduler should use (and it's configuration settings) in the properties file (or object) that\nyou provide to the SchedulerFactory that you use to produce your scheduler instance.")]),e._v(" "),o("p",[e._v("Never use a JobStore instance directly in your code. For some reason many people attempt to do this.\nThe JobStore is for behind-the-scenes use of Quartz itself. You have to tell Quartz (through configuration) which JobStore to use, but then you should only work with the Scheduler interface in your code.")]),e._v(" "),o("h2",{attrs:{id:"ramjobstore"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#ramjobstore"}},[e._v("#")]),e._v(" RAMJobStore")]),e._v(" "),o("p",[e._v("RAMJobStore is the simplest JobStore to use, it is also the most performant (in terms of CPU time).\nRAMJobStore gets its name in the obvious way: it keeps all of its data in RAM. This is why it's lightning-fast,\nand also why it's so simple to configure. The drawback is that when your application ends (or crashes) all of\nthe scheduling information is lost - this means RAMJobStore cannot honor the setting of \"non-volatility\" on jobs and triggers.\nFor some applications this is acceptable - or even the desired behavior, but for other applications, this may be disasterous.")]),e._v(" "),o("p",[e._v("To use RAMJobStore (and assuming you're using StdSchedulerFactory) you don't need to do anything special. Default configuration\nof Quartz.NET uses RAMJobStore as job store implementation.")]),e._v(" "),o("h2",{attrs:{id:"ado-net-job-store-adojobstore"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#ado-net-job-store-adojobstore"}},[e._v("#")]),e._v(" ADO.NET Job Store (AdoJobStore)")]),e._v(" "),o("p",[e._v("AdoJobStore is also aptly named - it keeps all of its data in a database via ADO.NET.\nBecause of this it is a bit more complicated to configure than RAMJobStore, and it also is not as fast.\nHowever, the performance draw-back is not terribly bad, especially if you build the database tables with indexes on the primary keys.")]),e._v(" "),o("p",[e._v('To use AdoJobStore, you must first create a set of database tables for Quartz.NET to use.\nYou can find table-creation SQL scripts in the "database/dbtables" directory of the Quartz.NET distribution.\nIf there is not already a script for your database type, just look at one of the existing ones, and modify it in any way necessary for your DB.\nOne thing to note is that in these scripts, all the the tables start with the prefix "QRTZ_"\nsuch as the tables "QRTZ_TRIGGERS", and "QRTZ_JOB_DETAIL"). This prefix can actually be anything you\'d like, as long as you inform AdoJobStore\nwhat the prefix is (in your Quartz.NET properties). Using different prefixes may be useful for creating multiple sets of tables,\nfor multiple scheduler instances, within the same database.')]),e._v(" "),o("p",[e._v("Currently the only option for the internal implementation of job store is JobStoreTX which creates transactions by itself.\nThis is different from Java version of Quartz where there is also option to choose JobStoreCMT which uses J2EE container\nmanaged transactions.")]),e._v(" "),o("p",[e._v("The last piece of the puzzle is setting up a data source from which AdoJobStore can get connections to your database.\nData sources are defined in your Quartz.NET properties. Data source information contains the connection string\nand ADO.NET delegate information.")]),e._v(" "),o("p",[o("strong",[e._v("Configuring Quartz to use JobStoreTx")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz\n")])])]),o("p",[e._v('Next, you need to select a IDriverDelegate implementation for the JobStore to use.\nThe DriverDelegate is responsible for doing any ADO.NET work that may be needed for your specific database.\nStdAdoDelegate is a delegate that uses "vanilla" ADO.NET code (and SQL statements) to do its work.\nIf there isn\'t another delegate made specifically for your database, try using this delegate -\nspecial delegates usually have better performance or workarounds for database specific issues.\nOther delegates can be found in the "Quartz.Impl.AdoJobStore" namespace, or in its sub-namespaces.')]),e._v(" "),o("p",[o("strong",[e._v("NOTE:")]),e._v(" Quartz.NET will issue warning if you are using the default StdAdoDelegate as it has poor performance\nwhen you have a lot of triggers to select from. Specific delegates have special SQL to limit result\nset length (SQLServerDelegate uses TOP n, PostgreSQLDelegate LIMIT n, OracleDelegate ROWCOUNT() <= n etc.).")]),e._v(" "),o("p",[e._v("Once you've selected your delegate, set its class name as the delegate for AdoJobStore to use.")]),e._v(" "),o("p",[o("strong",[e._v("Configuring AdoJobStore to use a DriverDelegate")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz\n")])])]),o("p",[e._v("Next, you need to inform the JobStore what table prefix (discussed above) you are using.")]),e._v(" "),o("p",[o("strong",[e._v("Configuring AdoJobStore with the Table Prefix")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.tablePrefix = QRTZ_\n")])])]),o("p",[e._v('And finally, you need to set which data source should be used by the JobStore. The named data source must also be defined in your Quartz properties.\nIn this case, we\'re specifying that Quartz should use the data source name "myDS" (that is defined elsewhere in the configuration properties).')]),e._v(" "),o("p",[o("strong",[e._v("Configuring AdoJobStore with the name of the data source to use")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.dataSource = myDS\n")])])]),o("p",[e._v("One last thing that is needed for the configuration is to set data source connection string information and database provider. Connection\nstring is the standard ADO.NET connection which is driver specific. Database provider is an abstraction of database drivers to create\nloose coupling betweeb database drivers and Quartz.")]),e._v(" "),o("p",[o("strong",[e._v("Setting Data Source's Connection String And Database Provider")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v(" quartz.dataSource.myDS.connectionString = Server=localhost;Database=quartz;Uid=quartznet;Pwd=quartznet\n quartz.dataSource.myDS.provider = MySql-50\n")])])]),o("p",[e._v("Currently following database providers are supported:")]),e._v(" "),o("ul",[o("li",[e._v("SqlServer-11 - SQL Server driver for .NET Framework 1.1")]),e._v(" "),o("li",[e._v("SqlServer-20 - SQL Server driver for .NET Framework 2.0")]),e._v(" "),o("li",[e._v("OracleClient-20 - Microsoft's Oracle Driver (comes bundled with .NET Framework)")]),e._v(" "),o("li",[e._v("OracleODP-20 - Oracle's Oracle Driver")]),e._v(" "),o("li",[e._v("MySql-10 - MySQL Connector/.NET v. 1.0.7")]),e._v(" "),o("li",[e._v("MySql-109 - MySQL Connector/.NET v. 1.0.9")]),e._v(" "),o("li",[e._v("MySql-50 - MySQL Connector/.NET v. 5.0 (.NET 2.0)")]),e._v(" "),o("li",[e._v("MySql-51 - MySQL Connector/:NET v. 5.1 (.NET 2.0)")]),e._v(" "),o("li",[e._v("SQLite-10 - SQLite ADO.NET 2.0 Provider v. 1.0.56 (.NET 2.0)")]),e._v(" "),o("li",[e._v("Firebird-201 - Firebird ADO.NET 2.0 Provider v. 2.0.1 (.NET 2.0)")]),e._v(" "),o("li",[e._v("Firebird-210 - Firebird ADO.NET 2.0 Provider v. 2.1.0 (.NET 2.0)")])]),e._v(" "),o("p",[e._v("If your Scheduler is very busy (i.e. nearly always executing the same number of jobs as the size of the thread pool, then you should\nprobably set the number of connections in the data source to be the about the size of the thread pool + 1.This is commonly configured\nint the ADO.NET connection string - see your driver implementation for details.")]),e._v(" "),o("p",[e._v('The "quartz.jobStore.useProperties" config parameter can be set to "true" (defaults to false) in order to instruct AdoJobStore that all values in JobDataMaps will be strings,\nand therefore can be stored as name-value pairs, rather than storing more complex objects in their serialized form in the BLOB column. This is much safer in the long term,\nas you avoid the class versioning issues that there are with serializing your non-String classes into a BLOB.')]),e._v(" "),o("p",[o("strong",[e._v("Configuring AdoJobStore to use strings as JobDataMap values (recommended)")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.useProperties = true\n")])])])])}),[],!1,null,null,null);t.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/74.a79659d2.js b/assets/js/74.a79659d2.js
new file mode 100644
index 000000000..8be96352d
--- /dev/null
+++ b/assets/js/74.a79659d2.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[74],{448:function(e,t,a){"use strict";a.r(t);var n=a(26),o=Object(n.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("p",[e._v("As mentioned previously, you can make .NET component executable by the scheduler simply by making it\nimplement the IJob interface. Here is the interface:")]),e._v(" "),a("p",[a("strong",[e._v("IJob Interface")])]),e._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("namespace")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[e._v("Quartz")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("public")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("interface")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("IJob")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("void")])]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("Execute")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("JobExecutionContext")]),e._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),a("p",[e._v("In case you couldn't guess, when the job's trigger fires (more on that in a moment), the Execute(..) method\nis invoked by the scheduler. The JobExecutionContext object that is passed to this method provides\nthe job instance with information about its \"run-time\" environment - a handle to the IScheduler that executed it,\na handle to the Trigger that triggered the execution, the job's JobDetail object, and a few other items.")]),e._v(" "),a("p",[e._v("The JobDetail object is created by the Quartz.NET client (your program) at the time the Job is added\nto the scheduler. It contains various property settings for the Job, as well as a JobDataMap, which can be used\nto store state information for a given instance of your job class.")]),e._v(" "),a("p",[e._v("Trigger objects are used to trigger the execution (or 'firing') of jobs. When you wish to schedule a job,\nyou instantiate a trigger and 'tune' its properties to provide the scheduling you wish to have.\nTriggers may also have a JobDataMap associated with them - this is useful to passing parameters to a Job\nthat are specific to the firings of the trigger. Quartz.NET ships with a handful of different trigger types,\nbut the most commonly used types are SimpleTrigger and CronTrigger.")]),e._v(" "),a("p",[e._v('SimpleTrigger is handy if you need \'one-shot\' execution (just single execution of a job at a given moment in time),\nor if you need to fire a job at a given time, and have it repeat N times, with a delay of T between executions.\nCronTrigger is useful if you wish to have triggering based on calendar-like schedules - such as "every Friday,\nat noon" or "at 10:15 on the 10th day of every month."')]),e._v(" "),a("h2",{attrs:{id:"why-jobs-and-triggers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#why-jobs-and-triggers"}},[e._v("#")]),e._v(" Why Jobs AND Triggers?")]),e._v(" "),a("p",[e._v("Many job schedulers do not have separate notions of jobs and triggers. Some define a 'job' as simply an\nexecution time (or schedule) along with some small job identifier. Others are much like the union\nof Quartz.NET's job and trigger objects. While developing Quartz for Java, Quartz team decided that it made sense to create\na separation between the schedule and the work to be performed on that schedule. This has (in our opinion)\nmany benefits.")]),e._v(" "),a("p",[e._v("For example, jobs can be created and stored in the job scheduler independent of a trigger, and many triggers\ncan be associated with the same job. Another benefit of this loose-coupling is the ability to configure jobs\nthat remain in the scheduler after their associated triggers have expired, so that that it can be rescheduled\nlater, without having to re-define it. It also allows you to modify or replace a trigger without having to\nre-define its associated job.")]),e._v(" "),a("h2",{attrs:{id:"identifiers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#identifiers"}},[e._v("#")]),e._v(" Identifiers")]),e._v(" "),a("p",[e._v("Jobs and Triggers are given identifying names as they are registered with the Quartz.NET scheduler.\nJobs and triggers can also be placed into 'groups' which can be useful for organizing your jobs and triggers\ninto categories for later maintenance. The name of a job or trigger must be unique within its group - or in other\nwords, the true identifier of a job or trigger is its name + group. If you leave the group of the\nJob or Trigger 'null', it is equivalent to having specified SchedulerConstants.DefaultGroup.")]),e._v(" "),a("p",[e._v("You now have a general idea about what Jobs and Triggers are, you can learn more about them in\n"),a("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/more-about-jobs.html"}},[e._v("Lesson 3: More About Jobs & JobDetails")]),e._v(" and "),a("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/more-about-triggers.html"}},[e._v("Lesson 4: More About Triggers")])],1)])}),[],!1,null,null,null);t.default=o.exports}}]);
\ No newline at end of file
diff --git a/assets/js/75.ac772cc7.js b/assets/js/75.ac772cc7.js
new file mode 100644
index 000000000..fb4f1f5fd
--- /dev/null
+++ b/assets/js/75.ac772cc7.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{449:function(t,e,a){"use strict";a.r(e);var o=a(26),n=Object(o.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"plug-ins"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#plug-ins"}},[t._v("#")]),t._v(" Plug-Ins")]),t._v(" "),a("p",[t._v("Quartz provides an interface (ISchedulerPlugin) for plugging-in additional functionality.")]),t._v(" "),a("p",[t._v("Plugins that ship with Quartz to provide various utililty capabilities can be found documented in the Quartz.Plugins namespace.\nThey provide functionality such as auto-scheduling of jobs upon scheduler startup, logging a history of job and trigger events,\nand ensuring that the scheduler shuts down cleanly when the virtual machine exits.")]),t._v(" "),a("h2",{attrs:{id:"jobfactory"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#jobfactory"}},[t._v("#")]),t._v(" JobFactory")]),t._v(" "),a("p",[t._v("When a trigger fires, the Job it is associated to is instantiated via the JobFactory configured on the Scheduler.\nThe default JobFactory simply activates a new instance of the job class. You may want to create your own implementation\nof JobFactory to accomplish things such as having your application's IoC or DI container produce/initialize the job instance.")]),t._v(" "),a("p",[t._v("See the IJobFactory interface, and the associated Scheduler.SetJobFactory(fact) method.")]),t._v(" "),a("h2",{attrs:{id:"factory-shipped-jobs"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#factory-shipped-jobs"}},[t._v("#")]),t._v(" 'Factory-Shipped' Jobs")]),t._v(" "),a("p",[t._v("Quartz also provides a number of utility Jobs that you can use in your application for doing things like sending\ne-mails and invoking remote objects. These out-of-the-box Jobs can be found documented in the Quartz.Jobs namespace.")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/76.ac780687.js b/assets/js/76.ac780687.js
new file mode 100644
index 000000000..225984f63
--- /dev/null
+++ b/assets/js/76.ac780687.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{450:function(t,a,s){"use strict";s.r(a);var e=s(26),n=Object(e.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("As you've seen, jobs are rather easy to implement. There are just a few more things that you need to understand about\nthe nature of jobs, about the Execute(..) method of the IJob interface, and about JobDetails.")]),t._v(" "),s("p",[t._v("While a class that you implement is the actual \"job\", Quartz needs to be informed about various attributes\nthat you may wish the job to have. This is done via the JobDetail class, which was mentioned briefly in the previous section.\nSoftware 'archaeologists' may be interested to know that in an older incarnation of Quartz for Java, the implementation of the\nfunctionality of JobDetail was imposed upon the implementor of each Job class by having all of JobDetail's 'getter' methods on\nthe Job interface itself. This forced a cumbersome job of re-implementing virtually identical code on every Job class -\nwhich was really dumb... thus JobDetail class was created.")]),t._v(" "),s("p",[t._v("Let's take a moment now to discuss a bit about the 'nature' of jobs and the life-cycle of job instances within Quartz.NET.\nFirst lets take a look back at some of that snippet of code we saw in Lesson 1:")]),t._v(" "),s("p",[s("strong",[t._v("Using Quartz.NET")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// construct a scheduler factory")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ISchedulerFactory")]),t._v(" schedFact "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("StdSchedulerFactory")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// get a scheduler")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IScheduler")]),t._v(" sched "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" schedFact"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetScheduler")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n sched"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Start")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// construct job info")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobDetail")]),t._v(" jobDetail "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("JobDetail")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token type-expression class-name"}},[t._v("DumbJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// fire every hour")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Trigger")]),t._v(" trigger "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerUtils"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("MakeHourlyTrigger")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// start on the next even hour")]),t._v("\n trigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("StartTime "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerUtils"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetEvenHourDate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateTime"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n trigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n sched"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" trigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n")])])]),s("p",[t._v("Now consider the job class "),s("em",[t._v("DumbJob")]),t._v(" defined as such:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DumbJob")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("DumbJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLine")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"DumbJob is executing."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Notice that we 'feed' the scheduler a JobDetail instance, and that it refers to the job to be executed by simply\nproviding the job's class. Each (and every) time the scheduler executes the job, it creates a new instance of the\nclass before calling its Execute(..) method. One of the ramifications of this behavior is the fact that jobs must\nhave a no-arguement constructor. Another ramification is that it does not make sense to have data-members defined\non the job class - as their values would be 'cleared' every time the job executes.")]),t._v(" "),s("p",[t._v('You may now be wanting to ask "how can I provide properties/configuration for a Job instance?" and "how can I\nkeep track of a job\'s state between executions?" The answer to these questions are the same: the key is the JobDataMap,\nwhich is part of the JobDetail object.')]),t._v(" "),s("h2",{attrs:{id:"jobdatamap"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#jobdatamap"}},[t._v("#")]),t._v(" JobDataMap")]),t._v(" "),s("p",[t._v("The JobDataMap can be used to hold any number of (serializable) objects which you wish to have made available\nto the job instance when it executes. JobDataMap is an implementation of the IDictionary interface, and has some added convenience methods for storing and retreiving data of primitive types.")]),t._v(" "),s("p",[t._v("Here's some quick snippets of putting data into the JobDataMap prior to adding the job to the scheduler:")]),t._v(" "),s("p",[s("strong",[t._v("Setting Values in a JobDataMap")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v(" jobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jobSays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello World!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n jobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myFloatValue"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.141f")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n jobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myStateData"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("ArrayList")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n")])])]),s("p",[t._v("Here's a quick example of getting data from the JobDataMap during the job's execution:")]),t._v(" "),s("p",[s("strong",[t._v("Getting Values from a JobDataMap")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DumbJob")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" instName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" instGroup "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Group"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobDataMap")]),t._v(" dataMap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" jobSays "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetString")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jobSays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("float")])]),t._v(" myFloatValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFloat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myFloatValue"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ArrayList")]),t._v(" state "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ArrayList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myStateData"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Add")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateTime"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n Console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLine")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Instance {0} of DumbJob says: {1}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" instName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobSays"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])])]),s("p",[t._v("If you use a persistent JobStore (discussed in the JobStore section of this tutorial) you should use some care\nin deciding what you place in the JobDataMap, because the object in it will be serialized, and they therefore\nbecome prone to class-versioning problems. Obviously standard .NET types should be very safe, but beyond that,\nanytime someone changes the definition of a class for which you have serialized instances, care has to be taken\nnot to break compatibility. Optionally, you can put AdoJobStore and JobDataMap into a mode where only primitives\nand strings can be stored in the map, thus eliminating any possibility of later serialization problems.")]),t._v(" "),s("h3",{attrs:{id:"stateful-vs-non-stateful-jobs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#stateful-vs-non-stateful-jobs"}},[t._v("#")]),t._v(" Stateful vs. Non-Stateful Jobs")]),t._v(" "),s("p",[t._v("Triggers can also have JobDataMaps associated with them. This can be useful in the case where you have a Job that\nis stored in the scheduler for regular/repeated use by multiple Triggers, yet with each independent triggering,\nyou want to supply the Job with different data inputs.")]),t._v(" "),s("p",[t._v("The JobDataMap that is found on the JobExecutionContext during Job execution serves as a convenience. It is a merge\nof the JobDataMap found on the JobDetail and the one found on the Trigger, with the value in the latter overriding\nany same-named values in the former.")]),t._v(" "),s("p",[t._v("Here's a quick example of getting data from the JobExecutionContext's merged JobDataMap during the job's execution:")]),t._v(" "),s("p",[s("strong",[t._v("Getting Values from the JobExecutionContext convenience/merged JobDataMap")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DumbJob")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" instName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" instGroup "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Group"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Note the difference from the previous example")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobDataMap")]),t._v(" dataMap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("MergedJobDataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" jobSays "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetString")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jobSays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("float")])]),t._v(" myFloatValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFloat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myFloatValue"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ArrayList")]),t._v(" state "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ArrayList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myStateData"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n state"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Add")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateTime"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n Console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLine")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Instance {0} of DumbJob says: {1}"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" instName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" jobSays"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])])]),s("h2",{attrs:{id:"statefuljob"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#statefuljob"}},[t._v("#")]),t._v(" StatefulJob")]),t._v(" "),s("p",[t._v('Now, some additional notes about a job\'s state data (aka JobDataMap): A Job instance can be defined as "stateful" or "non-stateful".\nNon-stateful jobs only have their JobDataMap stored at the time they are added to the scheduler. This means that any changes made\nto the contents of the job data map during execution of the job will be lost, and will not seen by the job the next time it executes.\nYou have probably guessed, a stateful job is just the opposite - its JobDataMap is re-stored after every execution of the job.\nOne side-effect of making a job stateful is that it cannot be executed concurrently. Or in other words: if a job is stateful, and\na trigger attempts to \'fire\' the job while it is already executing, the trigger will block (wait) until the previous execution completes.')]),t._v(" "),s("p",[t._v("You 'mark' a Job as stateful by having it implement the IStatefulJob interface, rather than the IJob interface.")]),t._v(" "),s("h2",{attrs:{id:"job-instances"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#job-instances"}},[t._v("#")]),t._v(" Job 'Instances'")]),t._v(" "),s("p",[t._v("One final point on this topic that may or may not be obvious by now: You can create a single job class, and store many\n'instance definitions' of it within the scheduler by creating multiple instances of JobDetails - each with its own set of properties\nand JobDataMap - and adding them all to the scheduler.")]),t._v(" "),s("p",[t._v("When a trigger fires, the Job it is associated to is instantiated via the JobFactory configured on the Scheduler. The default\nJobFactory simply calls Activator.CreateInstance behind the scenes on the job class.\nYou may want to create your own implementation of JobFactory to accomplish things such as having your application's IoC or\nDI container produce/initialize the job instance.")]),t._v(" "),s("h2",{attrs:{id:"other-attributes-of-jobs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-attributes-of-jobs"}},[t._v("#")]),t._v(" Other Attributes Of Jobs")]),t._v(" "),s("p",[t._v("Here's a quick summary of the other properties which can be defined for a job instance via the JobDetail object:")]),t._v(" "),s("ul",[s("li",[t._v("Durable - if a job is non-durable, it is automatically deleted from the scheduler once there are no longer any active triggers associated with it.")]),t._v(" "),s("li",[t._v("Volatile - if a job is volatile, it is not persisted between re-starts of the Quartz scheduler.")]),t._v(" "),s("li",[t._v("RequestsRecovery - if a job \"requests recovery\", and it is executing during the time of a 'hard shutdown' of the scheduler (i.e. the process it is running within crashes, or the machine is shut off), then it is re-executed when the scheduler is started again. In this case, the JobExecutionContext.IsRecovering property will return true.")]),t._v(" "),s("li",[t._v("JobListeners - a job can have a set of zero or more JobListeners associated with it. When the job executes, the listeners are notified. More discussion on JobListeners can be found in the section of this document that is dedicated to the topic of TriggerListeners & JobListeners.")])]),t._v(" "),s("h2",{attrs:{id:"the-job-execute-method"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#the-job-execute-method"}},[t._v("#")]),t._v(" The Job.Execute(..) Method")]),t._v(" "),s("p",[t._v("Finally, we need to inform you of a few details of the IJob.Execute(..) method. The only type of exception\nthat you are allowed to throw from the execute method is the JobExecutionException. Because of this, you should generally wrap the entire\ncontents of the execute method with a 'try-catch' block. You should also spend some time looking at the documentation for the\nJobExecutionException, as your job can use it to provide the scheduler various directives as to how you want the exception to be handled.")])])}),[],!1,null,null,null);a.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/77.b087b822.js b/assets/js/77.b087b822.js
new file mode 100644
index 000000000..7ad7076d5
--- /dev/null
+++ b/assets/js/77.b087b822.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[77],{451:function(t,e,s){"use strict";s.r(e);var a=s(26),n=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("Like jobs, triggers are relatively easy to work with, but do contain a variety of customizable options that you need to\nbe aware of and understand before you can make full use of Quartz.NET. Also, as noted earlier, there are different types of triggers,\nthat you can select to meet different scheduling needs.")]),t._v(" "),s("h2",{attrs:{id:"calendars"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#calendars"}},[t._v("#")]),t._v(" Calendars")]),t._v(" "),s("p",[t._v("Quartz Calendar objects can be associated with triggers at the time the trigger is stored in the scheduler.\nCalendars are useful for excluding blocks of time from the the trigger's firing schedule. For instance, you could\ncreate a trigger that fires a job every weekday at 9:30 am, but then add a Calendar that excludes all of the business's holidays.")]),t._v(" "),s("p",[t._v("Calendar's can be any serializable objects that implement the ICalendar interface, which looks like this:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",[s("code",[t._v("namespace Quartz\n{\n public interface ICalendar\n {\n string Description { get; set; }\n\n ICalendar CalendarBase { set; get; }\n\n bool IsTimeIncluded(DateTime timeUtc);\n\n DateTime GetNextIncludedTimeUtc(DateTime timeUtc);\n }\n} \n")])])]),s("p",[t._v("Notice that the parameters to these methods are of the long type. As you may guess, they are timestamps in millisecond format.\nThis means that calendars can 'block out' sections of time as narrow as a millisecond. Most likely, you'll be interested in\n'blocking-out' entire days. As a convenience, Quartz includes the class HolidayCalendar, which does just that.")]),t._v(" "),s("p",[t._v("Calendars must be instantiated and registered with the scheduler via the AddCalendar(..) method. If you use HolidayCalendar,\nafter instantiating it, you should use its AddExcludedDate(DateTime date) method in order to populate it with the days you wish\nto have excluded from scheduling. The same calendar instance can be used with multiple triggers such as this:")]),t._v(" "),s("p",[s("strong",[t._v("Using Calendars")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HolidayCalendar")]),t._v(" cal "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("HolidayCalendar")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n cal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddExcludedDate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("someDate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n sched"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddCalendar")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myHolidays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// fire every one hour interval")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Trigger")]),t._v(" trigger "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerUtils"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("MakeHourlyTrigger")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// start on the next even hour")]),t._v("\n trigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("StartTimeUtc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerUtils"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetEvenHourDate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateTime"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Now"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n trigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n trigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("CalendarName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myHolidays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// .. schedule job with trigger")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// fire every day at 08:00")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Trigger")]),t._v(" trigger2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerUtils"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("MakeDailyTrigger")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// begin immediately")]),t._v("\n trigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("StartTimeUtc "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" DateTime"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" \n trigger2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Name "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n trigger2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("CalendarName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myHolidays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// .. schedule job with trigger2 ")]),t._v("\n")])])]),s("p",[t._v("The details of the values passed in the SimpleTrigger constructors will be explained in the next section.\nFor now, just believe that the code above creates two triggers: one that will repeat every 60 seconds forever, and one that\nwill repeat five times with a five day interval between firings. However, any of the firings that would have\noccurred during the period excluded by the calendar will be skipped.")]),t._v(" "),s("h2",{attrs:{id:"priority"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#priority"}},[t._v("#")]),t._v(" Priority")]),t._v(" "),s("p",[t._v("Sometimes, when you have many Triggers (or few worker threads in your Quartz.NET thread pool), Quartz.NET may not have enough resources to\nimmediately fire all of the Triggers that are scheduled to fire at the same time. In this case, you may want to control\nwhich of your Triggers get first crack at the available Quartz.NET worker threads. For this purpose, you can set the priority property on a Trigger.\nIf N Triggers are to fire at the same time, but there are only Z worker threads currently available, then the first Z Triggers with the highest priority will get first dibs.\nIf you do not set a priority on a Trigger, then it will use the default priority of 5.\nAny integer value is allowed for priority, positive or negative.")]),t._v(" "),s("p",[t._v("Note: When a Trigger is detected to require recovery, its recovery is scheduled with the same priority as the original Trigger.")]),t._v(" "),s("p",[s("strong",[t._v("Priority Example")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// All three Triggers will be scheduled to fire 5 minutes from now.")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DateTime")]),t._v(" d "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" DateTime"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddMinutes")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Trigger")]),t._v(" trig1 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("SimpleTrigger")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"T1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"MyGroup"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" d"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Trigger")]),t._v(" trig2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("SimpleTrigger")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"T2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"MyGroup"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" d"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Trigger")]),t._v(" trig3 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("SimpleTrigger")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"T3"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"MyGroup"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" d"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobDetail")]),t._v(" jobDetail "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("JobDetail")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"MyJob"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"MyGroup"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token type-expression class-name"}},[t._v("NoOpJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Trigger1 does not have its priority set, so it defaults to 5")]),t._v("\n sched"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" trig1"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Trigger2 has its priority set to 10")]),t._v("\n trig2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" jobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n trig2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Priority "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n sched"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("trig2"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Trigger2 has its priority set to 1")]),t._v("\n trig3"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" jobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n trig3"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Priority "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n sched"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("trig3"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Five minutes from now, when the scheduler invokes these three triggers")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// they will be allocated worker threads in decreasing order of their")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// priority: Trigger2(10), Trigger1(5), Trigger3(1) ")]),t._v("\n")])])]),s("h2",{attrs:{id:"misfire-instructions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#misfire-instructions"}},[t._v("#")]),t._v(" Misfire Instructions")]),t._v(" "),s("p",[t._v('Another important property of a Trigger is its "misfire instruction". A misfire occurs if a persistent trigger "misses"\nits firing time because of the scheduler being shutdown, or because there are no available threads in Quartz\'s thread pool for executing the job.\nThe different trigger types have different misfire instructions available to them. By default they use a \'smart policy\' instruction')]),t._v(" "),s("ul",[s("li",[t._v("which has dynamic behavior based on trigger type and configuration. When the scheduler starts, it searches for any persistent triggers that\nhave misfired, and it then updates each of them based on their individually configured misfire instructions.")])]),t._v(" "),s("p",[t._v("When you start using Quartz in your\nown projects, you should make yourself familiar with the misfire instructions that are defined on the given trigger types,\nand explained in their API documentation. More specific information about misfire instructions will be given within\nthe tutorial lessons specific to each trigger type. The misfire instruction for a given trigger instance can be configured\nusing the MisfireInstruction property.")]),t._v(" "),s("h2",{attrs:{id:"triggerutils-triggers-made-easy"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#triggerutils-triggers-made-easy"}},[t._v("#")]),t._v(" TriggerUtils - Triggers Made Easy")]),t._v(" "),s("p",[t._v("The TriggerUtils class contains conveniences to help you create triggers and dates without\nhaving to monkey around with DateTime objects. Use this class to easily make triggers that fire every minute,\nhour, day, week, month, etc. Also use this class to generate dates that are rounded to the nearest second, minute or hour -\nthis can be very useful for setting trigger start-times.")]),t._v(" "),s("h2",{attrs:{id:"trigger-listeners"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#trigger-listeners"}},[t._v("#")]),t._v(" Trigger Listeners")]),t._v(" "),s("p",[t._v("Finally, triggers may have registered listeners, just as jobs may.\nObjects implementing the ITriggerListener interface will receive notifications as a trigger is fired.")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/78.0c35c107.js b/assets/js/78.0c35c107.js
new file mode 100644
index 000000000..78cf4f7e9
--- /dev/null
+++ b/assets/js/78.0c35c107.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{452:function(s,t,a){"use strict";a.r(t);var e=a(26),n=Object(e.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("p",[s._v("SchedulerListeners are much like ITriggerListeners and IJobListeners, except they receive notification of\nevents within the scheduler itself - not necessarily events related to a specific trigger or job.")]),s._v(" "),a("p",[s._v("Scheduler-related events include: the addition of a job/trigger, the removal of a job/trigger, a serious error\nwithin the scheduler, notification of the scheduler being shutdown, and others.")]),s._v(" "),a("p",[a("strong",[s._v("The ISchedulerListener Interface")])]),s._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("interface")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ISchedulerListener")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("JobScheduled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Trigger")]),s._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("JobUnscheduled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerGroup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("TriggerFinalized")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Trigger")]),s._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("TriggersPaused")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerGroup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("TriggersResumed")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerGroup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("JobsPaused")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" jobName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" jobGroup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("JobsResumed")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" jobName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" jobGroup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("SchedulerError")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" msg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SchedulerException")]),s._v(" cause"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n \n "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("SchedulerShutdown")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n")])])]),a("p",[s._v("ISchedulerListener instances are created and registered in much the same way as the other listener types,\nexcept there is no distinction between global and non-global listeners. Scheduler listeners can be\nvirtually any object that implements the ISchedulerListener interface.")])])}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/79.c0acd288.js b/assets/js/79.c0acd288.js
new file mode 100644
index 000000000..63ad1b2e1
--- /dev/null
+++ b/assets/js/79.c0acd288.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{453:function(t,e,s){"use strict";s.r(e);var a=s(26),n=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("SimpleTrigger should meet your scheduling needs if you need to have a job execute exactly once at a specific moment in time,\nor at a specific moment in time followed by repeats at a specific interval. Or plainer english, if you want the trigger to\nfire at exactly 11:23:54 AM on January 13, 2005, and then fire five more times, every ten seconds.")]),t._v(" "),s("p",[t._v("With this description, you may not find it surprising to find that the properties of a SimpleTrigger include: a start-time,\nand end-time, a repeat count, and a repeat interval. All of these properties are exactly what you'd expect them to be, with\nonly a couple special notes related to the end-time property.")]),t._v(" "),s("p",[t._v("The repeat count can be zero, a positive integer, or the constant value SimpleTrigger.RepeatIndefinitely.\nThe repeat interval property must be TimeSpan.Zero, or a positive TimeSpan value.\nNote that a repeat interval of zero will cause 'repeat count' firings of the trigger to happen concurrently\n(or as close to concurrently as the scheduler can manage).")]),t._v(" "),s("p",[t._v("If you're not already familiar with the DateTime class, you may find it helpful for computing your trigger fire-times,\ndepending on the startTimeUtc (or endTimeUtc) that you're trying to create. The TriggerUtils class is also helpful in this respect.")]),t._v(" "),s("p",[t._v("The EndTimeUtc property (if it is specified) over-rides the repeat count property. This can be useful if you wish to create a trigger\nsuch as one that fires every 10 seconds until a given moment in time - rather than having to compute the number of times it would\nrepeat between the start-time and the end-time, you can simply specify the end-time and then use a repeat count of RepeatIndefinitely\n(you could even specify a repeat count of some huge number that is sure to be more than the number of times the trigger will actually\nfire before the end-time arrives).")]),t._v(" "),s("p",[t._v("SimpleTrigger has a few different constructors, but we'll examine this one, and use it in the few examples that follow:")]),t._v(" "),s("p",[s("strong",[t._v("One of SimpleTrigger's Constructors")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("SimpleTrigger")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" name"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("group")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DateTime")]),t._v(" startTimeUtc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n NullableDateTime "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("endTime")]),t._v(" endTimeUtc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")])]),t._v(" repeatCount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("TimeSpan")]),t._v(" repeatInterval"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[s("strong",[t._v("SimpleTrigger Example 1 - Create a trigger that fires exactly once, ten seconds from now")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SimpleTrigger")]),t._v(" trigger "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("SimpleTrigger")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n DateTime"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddSeconds")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n TimeSpan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Zero"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("SimpleTrigger Example 2 - Create a trigger that fires immediately, then repeats every 60 seconds, forever")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SimpleTrigger")]),t._v(" trigger2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("SimpleTrigger")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n DateTime"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n SimpleTrigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("RepeatIndefinitely"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n TimeSpan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("FromSeconds")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("60")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("SimpleTrigger Example 3 - Create a trigger that fires immediately, then repeats every 10 seconds until 40 seconds from now")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v("TimeSpan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("FromSeconds")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("60")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SimpleTrigger")]),t._v(" trigger "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("SimpleTrigger")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myGroup"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n DateTime"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n DateTime"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddSeconds")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n SimpleTrigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("RepeatIndefinitely"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n TimeSpan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("FromSeconds")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[s("strong",[t._v("SimpleTrigger Example 4 - Create a trigger that fires on March 17 of the year 2002 at precisely 10:30 am, and repeats 5 times\n(for a total of 6 firings) - with a 30 second delay between each firing")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DateTime")]),t._v(" startTime "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("DateTime")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2002")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ToUniversalTime")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SimpleTrigger")]),t._v(" trigger "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("SimpleTrigger")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n startTime"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n TimeSpan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("FromSeconds")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Spend some time looking at the other constructors (and property setters) available on SimpleTrigger, so that you can use the\none most convenient to what you want to accomplish.")]),t._v(" "),s("h3",{attrs:{id:"simpletrigger-misfire-instructions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#simpletrigger-misfire-instructions"}},[t._v("#")]),t._v(" SimpleTrigger Misfire Instructions")]),t._v(" "),s("p",[t._v("SimpleTrigger has several instructions that can be used to inform Quartz what it should do when a misfire occurs.\n(Misfire situations were introduced in the More About Triggers section of this tutorial).\nThese instructions are defined as constants on MisfirePolicy.SimpleTrigger (including API documentation describing their behavior).\nThe instructions include:")]),t._v(" "),s("p",[s("strong",[t._v("Misfire Instruction Constants of SimpleTrigger")])]),t._v(" "),s("ul",[s("li",[t._v("MisfirePolicy.SimpleTrigger.FireNow")]),t._v(" "),s("li",[t._v("MisfirePolicy.SimpleTrigger.RescheduleNowWithExistingRepeatCount")]),t._v(" "),s("li",[t._v("MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount")]),t._v(" "),s("li",[t._v("MisfirePolicy.SimpleTrigger.RescheduleNextWithRemainingCount")]),t._v(" "),s("li",[t._v("MisfirePolicy.SimpleTrigger.RescheduleNextWithExistingCount")])]),t._v(" "),s("p",[t._v("You should recall from the earlier lessons that all triggers have the MisfirePolicy.SmartPolicy instruction available for use,\nand this instruction is also the default for all trigger types.")]),t._v(" "),s("p",[t._v("If the 'smart policy' instruction is used, SimpleTrigger dynamically chooses between its various MISFIRE instructions, based on the configuration\nand state of the given SimpleTrigger instance. The documentation for the SimpleTrigger.UpdateAfterMisfire() method explains the exact details of\nthis dynamic behavior.")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/8.d0570d6e.js b/assets/js/8.d0570d6e.js
new file mode 100644
index 000000000..add341311
--- /dev/null
+++ b/assets/js/8.d0570d6e.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{383:function(t,n,r){"use strict";r.r(n);r(49),r(29),r(181),r(27);var e={computed:{posts:function(){return this.$site.pages.filter((function(t){return"post"===t.id&&!0!==t.frontmatter.hidden&&!1!==t.frontmatter.promote})).sort((function(t,n){return n.path.localeCompare(t.path)})).slice(0,5).map((function(t){return t.dateString=t.path.substring(1,11),t}))}}},o=r(26),i=Object(o.a)(e,(function(){var t=this,n=t.$createElement,r=t._self._c||n;return r("div",t._l(t.posts,(function(n){return r("ul",[r("li",[r("router-link",{attrs:{to:n.path}},[t._v(t._s(n.dateString+" "+n.frontmatter.title))])],1)])})),0)}),[],!1,null,null,null);n.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/80.f966b0e7.js b/assets/js/80.f966b0e7.js
new file mode 100644
index 000000000..eee0382bb
--- /dev/null
+++ b/assets/js/80.f966b0e7.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[80],{454:function(t,e,s){"use strict";s.r(e);var n=s(26),a=Object(n.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("Listeners are objects that you create to perform actions based on events occuring within the scheduler.\nAs you can probably guess, TriggerListeners receive events related to triggers, and JobListeners receive events related to jobs.")]),t._v(" "),s("p",[t._v('Trigger-related events include: trigger firings, trigger mis-firings (discussed in the "Triggers" section of this document),\nand trigger completions (the jobs fired off by the trigger is finished).')]),t._v(" "),s("p",[s("strong",[t._v("The ITriggerListener Interface")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITriggerListener")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" Name "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("TriggerFired")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Trigger")]),t._v(" trigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("bool")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("VetoJobExecution")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Trigger")]),t._v(" trigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("TriggerMisfired")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Trigger")]),t._v(" trigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("TriggerComplete")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Trigger")]),t._v(" trigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")])]),t._v(" triggerInstructionCode"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Job-related events include: a notification that the job is about to be executed, and a notification when the job has completed execution.")]),t._v(" "),s("p",[s("strong",[t._v("The IJobListener Interface")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobListener")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" Name "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("JobToBeExecuted")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("JobExecutionVetoed")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("JobWasExecuted")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobExecutionException")]),t._v(" jobException"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])])]),s("h2",{attrs:{id:"using-your-own-listeners"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#using-your-own-listeners"}},[t._v("#")]),t._v(" Using Your Own Listeners")]),t._v(" "),s("p",[t._v('To create a listener, simply create an object the implements either the ITriggerListener and/or IJobListener interface.\nListeners are then registered with the scheduler during run time, and must be given a name (or rather, they must advertise their own\nname via their Name property. Listeners can be registered as either "global" or "non-global".\nGlobal listeners receive events for ALL triggers/jobs, and non-global listeners receive events only for the specific triggers/jobs that\nexplicitely name the listener in their GetTriggerListenerNames() or GetJobListenerNames() properties.')]),t._v(" "),s("p",[t._v("As described above, listeners are registered with the scheduler during run time, and are NOT stored in the JobStore along with the jobs and triggers.\nThe jobs and triggers only have the names of the related listeners stored with them. Hence, each time your application runs, the listeners\nneed to be re-registered with the scheduler.")]),t._v(" "),s("p",[s("strong",[t._v("Adding a JobListener to the Scheduler")])]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",[s("code",[t._v("scheduler.AddGlobalJobListener(myJobListener);\n")])])]),s("p",[t._v("or")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",[s("code",[t._v("scheduler.AddJobListener(myJobListener);\n")])])]),s("p",[t._v("Listeners are not used by most users of Quartz.NET, but are handy when application requirements create the need\nfor the notification of events, without the Job itself explicitly notifying the application.")])])}),[],!1,null,null,null);e.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/81.a91e6c4f.js b/assets/js/81.a91e6c4f.js
new file mode 100644
index 000000000..683937f82
--- /dev/null
+++ b/assets/js/81.a91e6c4f.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[81],{455:function(t,s,a){"use strict";a.r(s);var n=a(26),e=Object(n.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[t._v("Before you can use the scheduler, it needs to be instantiated (who'd have guessed?).\nTo do this, you use an implementor of ISchedulerFactory.")]),t._v(" "),a("p",[t._v("Once a scheduler is instantiated, it can be started, placed in stand-by mode, and shutdown.\nNote that once a scheduler is shutdown, it cannot be restarted without being re-instantiated.\nTriggers do not fire (jobs do not execute) until the scheduler has been started, nor while it is\nin the paused state.")]),t._v(" "),a("p",[t._v("Here's a quick snippet of code, that instantiates and starts a scheduler, and schedules a job for execution:")]),t._v(" "),a("p",[a("strong",[t._v("Using Quartz.NET")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// construct a scheduler factory")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ISchedulerFactory")]),t._v(" schedFact "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("StdSchedulerFactory")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// get a scheduler")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IScheduler")]),t._v(" sched "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" schedFact"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetScheduler")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n sched"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Start")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// construct job info")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobDetail")]),t._v(" jobDetail "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("JobDetail")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("typeof")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token type-expression class-name"}},[t._v("HelloJob")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// fire every hour")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Trigger")]),t._v(" trigger "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerUtils"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("MakeHourlyTrigger")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// start on the next even hour")]),t._v("\n trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("StartTimeUtc "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerUtils"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetEvenHourDate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateTime"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Name "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n sched"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("jobDetail"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("As you can see, working with Quartz.NET is rather simple. In "),a("RouterLink",{attrs:{to:"/documentation/quartz-1.x/tutorial/jobs-and-triggers.html"}},[t._v("Lesson 2")]),t._v(" we'll give a quick overview of Jobs and Triggers, so that you can more fully understand this example.")],1)])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/82.d6972444.js b/assets/js/82.d6972444.js
new file mode 100644
index 000000000..0fd1d574d
--- /dev/null
+++ b/assets/js/82.d6972444.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[82],{456:function(t,e,n){"use strict";n.r(e);var s=n(26),l=Object(s.a)({},(function(){var t=this.$createElement;return(this._self._c||t)("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}})}),[],!1,null,null,null);e.default=l.exports}}]);
\ No newline at end of file
diff --git a/assets/js/83.5fb1964c.js b/assets/js/83.5fb1964c.js
new file mode 100644
index 000000000..8dfec989e
--- /dev/null
+++ b/assets/js/83.5fb1964c.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[83],{457:function(t,e,n){"use strict";n.r(e);var s=n(26),r=Object(s.a)({},(function(){var t=this.$createElement,e=this._self._c||t;return e("ContentSlotsDistributor",{attrs:{"slot-key":this.$parent.slotKey}},[e("p",[e("strong",[this._v("Sorry, not ready yet!")])])])}),[],!1,null,null,null);e.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/84.11a39734.js b/assets/js/84.11a39734.js
new file mode 100644
index 000000000..51cd20eb3
--- /dev/null
+++ b/assets/js/84.11a39734.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[84],{458:function(e,t,a){"use strict";a.r(t);var s=a(26),n=Object(s.a)({},(function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("p",[a("em",[e._v("This document outlines changes needed per version upgrade basis. You need to check the steps for each version you are jumping over. You should also check "),a("a",{attrs:{href:"https://raw.github.com/quartznet/quartznet/master/changelog.txt",target:"_blank",rel:"noopener noreferrer"}},[e._v("the complete change log"),a("OutboundLink")],1),e._v(".")])]),e._v(" "),a("p",[a("strong",[e._v("If you are a new user starting with the latest version, you don't need to follow this guide. Just jump right to "),a("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/index.html"}},[e._v("the tutorial")])],1)]),e._v(" "),a("h2",{attrs:{id:"upgrading-to-2-2-from-2-1"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-to-2-2-from-2-1"}},[e._v("#")]),e._v(" Upgrading to 2.2 from 2.1")]),e._v(" "),a("h3",{attrs:{id:"database-schema-changes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#database-schema-changes"}},[e._v("#")]),e._v(" Database schema changes")]),e._v(" "),a("p",[e._v("Database schema has changed to include the scheduled time for fired triggers table. You need to run the migration script:")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[e._v("database\\schema_20_to_22_upgrade.sql\n")])])]),a("p",[a("strong",[e._v("Make sure you check the scheduler name in the script - the default value of sched_name column is TestScheduler! If you have existing data the scheduler name should correspond to your existing scheduler name in Quartz configuration (quartz.scheduler.instanceName).")])]),e._v(" "),a("h3",{attrs:{id:"other"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#other"}},[e._v("#")]),e._v(" Other")]),e._v(" "),a("ul",[a("li",[e._v("SchedulerStarting() method was added to ISchedulerListener interface")]),e._v(" "),a("li",[e._v("dbFailureRetryInterval parameter was removed from DirectSchedulerFactory API")])]),e._v(" "),a("p",[e._v("There are variations for different database server inside the script. Choose the one suiting you the best.")]),e._v(" "),a("h2",{attrs:{id:"upgrading-to-2-1-from-2-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-to-2-1-from-2-0"}},[e._v("#")]),e._v(" Upgrading to 2.1 from 2.0")]),e._v(" "),a("ul",[a("li",[e._v("NthIncludedDayTrigger was removed that was supposed to be removed in 2.0")]),e._v(" "),a("li",[e._v("There are no Visual Studio 2008 solutions and projects anymore, you need VS2010 or later")])]),e._v(" "),a("h2",{attrs:{id:"upgrading-to-2-0-from-1-0"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrading-to-2-0-from-1-0"}},[e._v("#")]),e._v(" Upgrading to 2.0 from 1.0")]),e._v(" "),a("h3",{attrs:{id:"database-schema-changes-2"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#database-schema-changes-2"}},[e._v("#")]),e._v(" Database schema changes")]),e._v(" "),a("p",[e._v("Database has changed since 1.0 version. You need to run the database migration script:")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[e._v("database\\sqlserver_schema_10_to_20_upgrade.sql\n")])])]),a("p",[e._v("The script is made for SQL Server, but should work for others. You can adapt the script when needed for your specific database. "),a("strong",[e._v("Always test the migration on non-production server before upgrading production")])]),e._v(" "),a("h3",{attrs:{id:"api-changes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#api-changes"}},[e._v("#")]),e._v(" API Changes")]),e._v(" "),a("p",[e._v("The most obvious differences with version 2.0 are the significant changes to the API.\nThese changes have aimed to: modernize the API to use collections and generics, remove ambiguities and redundancies,\nhide/remove methods that should not be public to client code, improve separation of concerns, and introduce\na Domain Specific Language (DSL) for working with the core entities (jobs and triggers).")]),e._v(" "),a("p",[e._v('While the API changes are significant, and the usage of the "new way of doing things" is highly encouraged,\nthere are some formulaic (search-and-replace) techniques that can be used to get 1.x code quickly working with version 2.0.\nSee the migration guide for more information.')]),e._v(" "),a("p",[a("strong",[e._v("Outline of most significant API changes:")])]),e._v(" "),a("p",[e._v("API methods that return (or take as parameters) arrays now return (or take) typed collections.\nFor example, rather than GetJobGroupNames(): string[] we now have GetJobGroupNames(): IList\nJob and Trigger identification is now based on JobKey and TriggerKey. Keys include both a name and group.\nMethods which operate on particular jobs/triggers now take keys as the parameter. For example, GetTrigger(TriggerKey key): ITrigger,\nrather than GetTrigger(string name, string group): Trigger.\nITrigger is now an interface, rather than a class. Likewise for ISimpleTrigger, ICronTrigger, etc.\nNew DSL/builder-based API for construction Jobs and Triggers:")]),e._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("IJobDetail")]),e._v(" job "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" JobBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("Create")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("<")]),e._v("SimpleJob"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("WithIdentity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"job1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"group1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("Build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("ITrigger")]),e._v(" trigger "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" TriggerBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("Create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("WithIdentity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"trigger1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"group1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("StartAt")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("DateBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("FutureDate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" IntervalUnit"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("Hour"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("WithSimpleSchedule")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=>")]),e._v(" x"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("RepeatHourlyForever")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("ModifiedByCalendar")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"holidays"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("Build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n")])])]),a("p",[e._v("Methods from TriggerUtils related to easy construction of Dates have been moved to new DateBuilder class,\nthat can be used with static imports to nicely create Date instances for trigger start and end times, etc.")]),e._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// build a date for 9:00 am on Halloween")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("DateTimeOffset")]),e._v(" runDate "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" DateBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("DateOf")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("9")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("31")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("10")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// build a date 2 hours in the future")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("DateTimeOffset")]),e._v(" myDate "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" DateBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("FutureDate")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" IntervalUnit"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("Hour"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n")])])]),a("p",[e._v("The IStatefulJob interface has been deprecated in favor of new class-level attributes for IJob implementations\n(using both attributes produces equivalent to that of the old IStatefulJob interface):")]),e._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// instructs the scheduler to re-store the Job's JobDataMap contents after execution completes")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v("PersistJobDataAfterExecution"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("public")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("class")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("MyJob")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token type-list"}},[a("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("IJob")])]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// instructs the scheduler to block other instances of the same job (by JobKey) from executing when one already is")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v("DisallowConcurrentExecution"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("public")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("class")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("MyJob")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token type-list"}},[a("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("IJob")])]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),a("p",[a("strong",[e._v("Significant changes to usage of JobListener and TriggerListener")])]),e._v(" "),a("ul",[a("li",[e._v('Removal of distinction between "global" and "non-global" listeners')]),e._v(" "),a("li",[e._v("JobDetails and Triggers are no longer configured with a list of names of listeners to notify, instead listeners identify which jobs/triggers they're interested in.")]),e._v(" "),a("li",[e._v("Listeners are now assigned a set of Matcher instances - which provide matching rules for jobs/triggers they wish to receive events for.")]),e._v(" "),a("li",[e._v("Listeners are now managed through a ListenerManager API, rather than directly with the Scheduler API.")])]),e._v(" "),a("p",[a("strong",[e._v("Other changes")])]),e._v(" "),a("ul",[a("li",[e._v("The SchedulerException class and class hierarchy has been cleaned up.")]),e._v(" "),a("li",[e._v("DateIntervalTrigger was renamed to CalendarIntervalTrigger (or more exactly the concrete class is now CalendarIntervalTriggerImpl).")]),e._v(" "),a("li",[e._v('The notion (property) of "volatility" of jobs and triggers has been eliminated.')]),e._v(" "),a("li",[e._v("New trigger misfire instruction MisfireInstruction.IgnoreMisfirePolicy lets a trigger be configured in such a way\nthat it is selectively ignored from all misfire handling. In other words, it will fire as soon as it can, with no special handling -\na great option for improving performance particularly with setups that have lots of one-shot (non-repeating) triggers.")]),e._v(" "),a("li",[e._v("Trigger's CompareTo() method now correctly relates to its Equals() method, in that it compares the trigger's key, rather than next fire time.\nA new Comparator that sorts triggers according to fire time, priority and key was added as Trigger.TriggerTimeComparator.")])]),e._v(" "),a("h2",{attrs:{id:"new-features"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#new-features"}},[e._v("#")]),e._v(" New Features")]),e._v(" "),a("ul",[a("li",[e._v("Scheduler.Clear() method provides convenient (and dangerous!) way to remove all jobs, triggers and calendars from the scheduler.")]),e._v(" "),a("li",[e._v("Scheduler.ScheduleJobs(IDictionary> triggersAndJobs, boolean replace) method provides convenient bulk addition of jobs and triggers.")]),e._v(" "),a("li",[e._v("Scheduler.UnscheduleJobs(IList triggerKeys) method provides convenient bulk unscheduling of jobs.")]),e._v(" "),a("li",[e._v("Scheduler.DeleteJobs(IList jobKeys) method provides convenient bulk deletion of jobs (and related triggers).")]),e._v(" "),a("li",[e._v("Scheduler.CheckExists(JobKey jobKey) and Scheduler.CheckExists(TriggerKey triggerKey) methods provides convenient way to determine uniqueness of job/trigger keys (as opposed to old have of having to retrieve the job/trigger by name and then check whether the result was null).")]),e._v(" "),a("li",[e._v("AdoJobStore now allows one set of tables to be used by multiple distinct scheduler instances")]),e._v(" "),a("li",[e._v("AdoJobStore is now capable of storing non-core Trigger implementations without using BLOB columns, through the use of the new TriggerPersistenceDelegate interface, which can (optionally) be implemented by implementers of custom Trigger types.")]),e._v(" "),a("li",[e._v('Cron expressions now support the ability to specify an offset for "last day of month" and "last weekday of month" expressions. For examples: "L-3" (three days back from the last of the month) or "L-3W" (nearest weekday to the day three days back from the last day of the month).')]),e._v(" "),a("li",[e._v('XML files containing scheduling data now have a way to specify trigger start times as offsets into the future from the time the file is processed (useful for triggers that need to begin firing some time after the application is launched/deployed).\nFrom schema: ')]),e._v(" "),a("li",[e._v("XML file schema now supports specifying the 'priority' property of triggers.")]),e._v(" "),a("li",[e._v("Added DirectoryScanJob to core jobs that ship with Quartz, also added minimum age parameter to pre-existing FileScanJob.")])]),e._v(" "),a("h2",{attrs:{id:"miscellaneous"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#miscellaneous"}},[e._v("#")]),e._v(" Miscellaneous")]),e._v(" "),a("p",[e._v("Various performance improvements, including (but not limited to):")]),e._v(" "),a("ul",[a("li",[e._v("Ability to batch-acquire triggers that are ready to be fired, which can provide performance improvements for very busy schedulers")]),e._v(" "),a("li",[e._v('Methods for batch addition/removal of jobs and triggers (see "New Features")')]),e._v(" "),a("li",[e._v("Triggers have a new misfire instruction option, MisfireInstruction.IgnoreMisfirePolicy, which may be useful if you do not require misfire handling for your trigger(s), and want to take advantage of a performance gain")])])])}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/85.7a20170c.js b/assets/js/85.7a20170c.js
new file mode 100644
index 000000000..1a09e7656
--- /dev/null
+++ b/assets/js/85.7a20170c.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[85],{459:function(t,a,s){"use strict";s.r(a);var n=s(26),e=Object(n.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("Welcome to the Quick Start Guide for Quartz.NET. As you read this guide, expect to see details of:")]),t._v(" "),s("ul",[s("li",[t._v("Downloading Quartz.NET")]),t._v(" "),s("li",[t._v("Installing Quartz.NET")]),t._v(" "),s("li",[t._v("Configuring Quartz to your own particular needs")]),t._v(" "),s("li",[t._v("Starting a sample application")])]),t._v(" "),s("h2",{attrs:{id:"download-and-install"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#download-and-install"}},[t._v("#")]),t._v(" Download and Install")]),t._v(" "),s("p",[t._v("You can either download the zip file or use the NuGet package. NuGet package contains only the binaries needed to run Quartz.NET, zip file comes with source code, samples and Quartz.NET server sample application.")]),t._v(" "),s("h3",{attrs:{id:"zip-archive"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#zip-archive"}},[t._v("#")]),t._v(" Zip Archive")]),t._v(" "),s("p",[s("strong",[t._v("Short version")]),t._v(": Once you've downloaded Quartz.NET, unzip it somewhere, grab the Quartz.dll and Common.Logging.dll from bin directory and start to use them.")]),t._v(" "),s("p",[t._v("Quartz depends only on single third-party library called Common.Logging (which contains logging abstractions that allow you to use the logging provider that suites you the best).\nYou need to have Quartz.dll and Commong.Logging.dll beside your app binaries to successfully run Quartz.NET. So just add them as references to your Visual Studio project that uses them.\nYou can find these dlls from extracted archive from path "),s("strong",[t._v("bin\\your-target-framework-version\\release\\Quartz")]),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"nuget-package"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nuget-package"}},[t._v("#")]),t._v(" NuGet Package")]),t._v(" "),s("p",[t._v("Couldn't get any simpler than this. Just fire up Visual Studio (with NuGet installed) and add reference to package "),s("strong",[t._v("Quartz")]),t._v(" from package manager extension:")]),t._v(" "),s("ul",[s("li",[t._v("Right-click on your project's References and choose "),s("strong",[t._v("Manage NuGet Packages...")])]),t._v(" "),s("li",[t._v("Choose "),s("strong",[t._v("Online")]),t._v(" category from the left")]),t._v(" "),s("li",[t._v("Enter "),s("strong",[t._v("Quartz")]),t._v(" to the top right search and hit enter")]),t._v(" "),s("li",[t._v("Choose "),s("strong",[t._v("Quartz.NET")]),t._v(" from search results and hit install")]),t._v(" "),s("li",[t._v("Done!")])]),t._v(" "),s("p",[t._v("or from NuGet Command-Line:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",[s("code",[t._v("Install-Package Quartz\n")])])]),s("h2",{attrs:{id:"configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("p",[t._v("This is the big bit! Quartz.NET is a very configurable library. There are three ways (which are not mutually exclusive) to supply Quartz.NET configuration information:")]),t._v(" "),s("ul",[s("li",[t._v("Programmatically via providing NameValueCollection parameter to scheduler factory")]),t._v(" "),s("li",[t._v("Via standard youapp.exe.config configuration file using quartz-element")]),t._v(" "),s("li",[t._v("quartz.config file in your application's root directory")])]),t._v(" "),s("p",[t._v("You can find samples of all these alternatives in the Quartz.NET zip file.")]),t._v(" "),s("p",[t._v("Full documentation of available properties is available in the "),s("RouterLink",{attrs:{to:"/documentation/quartz-2.x/configuration/index.html"}},[t._v("Quartz Configuration Reference")]),t._v(".")],1),t._v(" "),s("p",[t._v("To get up and running quickly, a basic quartz.config looks something like this:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",[s("code",[t._v("quartz.scheduler.instanceName = MyScheduler\nquartz.threadPool.threadCount = 3\nquartz.jobStore.type = Quartz.Simpl.RAMJobStore, Quartz\n")])])]),s("p",[t._v("Remember to set the "),s("strong",[t._v("Copy to Output Directory")]),t._v(" on Visual Studio's file property pages to have value "),s("strong",[t._v("Copy always")]),t._v(". Otherwise the config will not be seen if it's not in build directory.")]),t._v(" "),s("p",[t._v("The scheduler created by this configuration has the following characteristics:")]),t._v(" "),s("ul",[s("li",[t._v('quartz.scheduler.instanceName - This scheduler\'s name will be "MyScheduler".')]),t._v(" "),s("li",[t._v("quartz.threadPool.threadCount - There are 3 threads in the thread pool, which means that a maximum of 3 jobs can be run simultaneously.")]),t._v(" "),s("li",[t._v("quartz.jobStore.type - All of Quartz's data, such as details of jobs and triggers, is held in memory (rather than in a database).\nEven if you have a database and want to use it with Quartz, I suggest you get Quartz working with the RamJobStore before you open up a whole new dimension by working with a database.")])]),t._v(" "),s("p",[s("em",[t._v("Actually you don't need to define these properties if you don't want to, Quartz.NET comes with sane defaults")])]),t._v(" "),s("h2",{attrs:{id:"starting-a-sample-application"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#starting-a-sample-application"}},[t._v("#")]),t._v(" Starting a Sample Application")]),t._v(" "),s("p",[t._v("Now you've downloaded and installed Quartz, it's time to get a sample application up and running. The following code obtains an instance of the scheduler, starts it, then shuts it down:")]),t._v(" "),s("p",[s("strong",[t._v("Program.cs")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("System"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Threading")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("Quartz")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("Quartz"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Impl")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("namespace")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("QuartzSampleApplication")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Program")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Grab the Scheduler instance from the Factory ")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IScheduler")]),t._v(" scheduler "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" StdSchedulerFactory"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetDefaultScheduler")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// and start it off")]),t._v("\n scheduler"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Start")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// some sleep to show what's happening")]),t._v("\n Thread"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Sleep")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("TimeSpan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("FromSeconds")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("60")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// and last shut down the scheduler when you are ready to close your program")]),t._v("\n scheduler"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Shutdown")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SchedulerException")]),t._v(" se"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLine")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("se"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Once you obtain a scheduler using StdSchedulerFactory.GetDefaultScheduler(), your application will not terminate by default until you call scheduler.Shutdown(), because there will be active threads (non-daemon threads).")]),t._v(" "),s("p",[t._v("Now running the program will not show anything. When 10 seconds have passed the program will just terminate. Lets add some logging to console.")]),t._v(" "),s("h2",{attrs:{id:"adding-logging"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#adding-logging"}},[t._v("#")]),t._v(" Adding logging")]),t._v(" "),s("p",[s("a",{attrs:{href:"http://netcommon.sourceforge.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Common.Logging"),s("OutboundLink")],1),t._v(" can be configured to use different logging frameworks under the hood; namely Enterprise Library, Log4Net and NLog.")]),t._v(" "),s("p",[t._v("However, to keep things simple for our example we take the simple route and configure logging using code to just log to the console using Common.Logging basic logging mechanism.")]),t._v(" "),s("p",[t._v("Add the following line to the beginning of your Program.cs")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter { Level = Common.Logging.LogLevel.Info};\n")])])]),s("h2",{attrs:{id:"trying-out-the-application-and-adding-jobs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#trying-out-the-application-and-adding-jobs"}},[t._v("#")]),t._v(" Trying out the application and adding jobs")]),t._v(" "),s("p",[t._v("Now we should get a lot more information when we start the application.")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("11.1.2014 14:52:04 [INFO] Quartz.Impl.StdSchedulerFactory - Quartz.NET properties loaded from configuration file 'c:\\ConsoleApplication1\\bin\\Debug\\quartz.config'\n11.1.2014 14:52:04 [INFO] Quartz.Impl.StdSchedulerFactory - Using default implementation for object serializer\n11.1.2014 14:52:04 [INFO] Quartz.Impl.StdSchedulerFactory - Using default implementation for ThreadExecutor\n11.1.2014 14:52:04 [INFO] Quartz.Core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl\n11.1.2014 14:52:04 [INFO] Quartz.Core.QuartzScheduler - Quartz Scheduler v.2.2.1.400 created.\n11.1.2014 14:52:04 [INFO] Quartz.Simpl.RAMJobStore - RAMJobStore initialized.\n11.1.2014 14:52:04 [INFO] Quartz.Core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.2.1.400) 'MyScheduler' with instanceId 'NON_CLUSTERED'\n Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.\n NOT STARTED.\n Currently in standby mode.\n Number of jobs executed: 0\n Using thread pool 'Quartz.Simpl.SimpleThreadPool' - with 3 threads.\n Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.\n\n11.1.2014 14:52:04 [INFO] Quartz.Impl.StdSchedulerFactory - Quartz scheduler 'MyScheduler' initialized\n11.1.2014 14:52:04 [INFO] Quartz.Impl.StdSchedulerFactory - Quartz scheduler version: 2.2.1.400\n11.1.2014 14:52:04 [INFO] Quartz.Core.QuartzScheduler - Scheduler MyScheduler_$_NON_CLUSTERED started.\n")])])]),s("p",[t._v("We need a simple test job to test the functionality, lets create HelloJob that outputs greetings to console.")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HelloJob")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tConsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLine")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Greetings from HelloJob!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("To do something interesting, you need code just after Start() method, before the Thread.Sleep.")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define the job and tie it to our HelloJob class")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobDetail")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" JobBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("HelloJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"job1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Trigger the job to run now, and then repeat every 10 seconds")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartNow")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInSeconds")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Tell quartz to schedule the job using our trigger")]),t._v("\nscheduler"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" trigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("The complete console application will now look like this")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("System")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("System"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Threading")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("Quartz")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("Quartz"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Impl")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("Quartz"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Job")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("namespace")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("ConsoleApplication1")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Program")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Main")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v(" args"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("try")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Logging"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("LogManager"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Adapter "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("Common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Logging"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Simple"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ConsoleOutLoggerFactoryAdapter")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("Level "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Common"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Logging"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("LogLevel"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Info"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Grab the Scheduler instance from the Factory ")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IScheduler")]),t._v(" scheduler "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" StdSchedulerFactory"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetDefaultScheduler")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// and start it off")]),t._v("\n scheduler"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Start")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define the job and tie it to our HelloJob class")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobDetail")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" JobBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("HelloJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"job1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Trigger the job to run now, and then repeat every 10 seconds")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartNow")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInSeconds")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Tell quartz to schedule the job using our trigger")]),t._v("\n scheduler"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" trigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// some sleep to show what's happening")]),t._v("\n Thread"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Sleep")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("TimeSpan"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("FromSeconds")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("60")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// and last shut down the scheduler when you are ready to close your program")]),t._v("\n scheduler"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Shutdown")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("catch")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("SchedulerException")]),t._v(" se"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLine")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("se"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n Console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLine")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Press any key to close the application"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n Console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReadKey")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HelloJob")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n Console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLine")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Greetings from HelloJob!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Now go have some fun exploring Quartz.NET! You can continue by reading "),s("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/index.html"}},[t._v("the tutorial")]),t._v(".")],1)])}),[],!1,null,null,null);a.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/86.f892a53a.js b/assets/js/86.f892a53a.js
new file mode 100644
index 000000000..0760555e7
--- /dev/null
+++ b/assets/js/86.f892a53a.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[86],{460:function(t,o,e){"use strict";e.r(o);var r=e(26),s=Object(r.a)({},(function(){var t=this,o=t.$createElement,e=t._self._c||o;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h2",{attrs:{id:"choose-a-lesson"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#choose-a-lesson"}},[t._v("#")]),t._v(" Choose a lesson:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/using-quartz.html"}},[t._v("Lesson 1: Using Quartz")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/jobs-and-triggers.html"}},[t._v("Lesson 2: Jobs And Triggers")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/more-about-jobs.html"}},[t._v("Lesson 3: More About Jobs & JobDetails")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/more-about-triggers.html"}},[t._v("Lesson 4: More About Triggers")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/simpletriggers.html"}},[t._v("Lesson 5: SimpleTriggers")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/crontriggers.html"}},[t._v("Lesson 6: CronTriggers")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/trigger-and-job-listeners.html"}},[t._v("Lesson 7: TriggerListeners & JobListeners")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/scheduler-listeners.html"}},[t._v("Lesson 8: SchedulerListeners")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/job-stores.html"}},[t._v("Lesson 9: JobStores")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/configuration-resource-usage-and-scheduler-factory.html"}},[t._v("Lesson 10: Configuration, Resource Usage and SchedulerFactory")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/advanced-enterprise-features.html"}},[t._v("Lesson 11: Advanced (Enterprise) Features")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/miscellaneous-features.html"}},[t._v("Lesson 12: Miscellaneous Features")])],1)])])}),[],!1,null,null,null);o.default=s.exports}}]);
\ No newline at end of file
diff --git a/assets/js/87.0a9e471c.js b/assets/js/87.0a9e471c.js
new file mode 100644
index 000000000..80a882c72
--- /dev/null
+++ b/assets/js/87.0a9e471c.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[87],{461:function(e,t,r){"use strict";r.r(t);var n=r(26),i=Object(n.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h2",{attrs:{id:"clustering"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#clustering"}},[e._v("#")]),e._v(" Clustering")]),e._v(" "),r("p",[e._v('Clustering currently only works with the AdoJobstore (JobStoreTX). Features include load-balancing and job fail-over (if the JobDetail\'s "request recovery" flag is set to true).')]),e._v(" "),r("p",[e._v('Enable clustering by setting the "quartz.jobStore.clustered" property to "true".\nEach instance in the cluster should use the same copy of the quartz properties.\nExceptions of this would be to use properties that are identical, with the following allowable exceptions:\nDifferent thread pool size, and different value for the "quartz.scheduler.instanceId" property.\nEach node in the cluster MUST have a unique instanceId, which is easily done (without needing different properties files) by placing "AUTO" as the value of this property.')]),e._v(" "),r("p",[e._v("Never run clustering on separate machines, unless their clocks are synchronized using some form of time-sync service (daemon) that runs very regularly\n(the clocks must be within a second of each other). See "),r("a",{attrs:{href:"http://www.boulder.nist.gov/timefreq/service/its.htm"}},[e._v("http://www.boulder.nist.gov/timefreq/service/its.htm")]),e._v("\nif you are unfamiliar with how to do this.")]),e._v(" "),r("p",[e._v("Never fire-up a non-clustered instance against the same set of tables that any other instance is running against.\nYou may get serious data corruption, and will definitely experience eratic behavior.")])])}),[],!1,null,null,null);t.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/88.677da331.js b/assets/js/88.677da331.js
new file mode 100644
index 000000000..33b2a593c
--- /dev/null
+++ b/assets/js/88.677da331.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[88],{462:function(e,t,o){"use strict";o.r(t);var r=o(26),n=Object(r.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v('Quartz is architected in modular way, and therefore to get it running, several components need to be "snapped" together.\nFortunately, some helpers exist for making this happen.')]),e._v(" "),o("p",[e._v("The major components that need to be configured before Quartz can do its work are:")]),e._v(" "),o("ul",[o("li",[e._v("ThreadPool")]),e._v(" "),o("li",[e._v("JobStore")]),e._v(" "),o("li",[e._v("DataSources (if necessary)")]),e._v(" "),o("li",[e._v("The Scheduler itself")])]),e._v(" "),o("p",[e._v("The ThreadPool provides a set of Threads for Quartz to use when executing Jobs.\nThe more threads in the pool, the greater number of Jobs that can run concurrently.\nHowever, too many threads may bog-down your system.\nMost Quartz users find that 5 or so threads are plenty- because they have fewer than 100 jobs at any given time,\nthe jobs are not generally scheduled to run at the same time, and the jobs are short-lived (complete quickly).\nOther users find that they need 10, 15, 50 or even 100 threads - because they have tens-of-thousands\nof triggers with various schedules - which end up having an average of between 10 and 100 jobs trying to\nexecute at any given moment. Finding the right size for your scheduler's pool is completely dependent on\nwhat you're using the scheduler for. There are no real rules, other than to keep the number of threads as\nsmall as possible (for the sake of your machine's resources) - but make sure you have enough for your Jobs to fire on time.\nNote that if a trigger's time to fire arrives, and there isn't an available thread,\nQuartz will block (pause) until a thread comes available, then the Job will execute -\nsome number of milliseconds later than it should have. This may even cause the tread to misfire - if\nthere is no available thread for the duration of the scheduler's configured \"misfire threshold\".")]),e._v(" "),o("p",[e._v("A IThreadPool interface is defined in the Quartz.Spi namespace, and you can create a IThreadPool implementation in any way you like.\nQuartz ships with a simple (but very satisfactory) thread pool named Quartz.Simpl.SimpleThreadPool.\nThis IThreadPool implementation simply maintains a fixed set of threads in its pool - never grows, never shrinks.\nBut it is otherwise quite robust and is very well tested - as nearly everyone using Quartz uses this pool.")]),e._v(" "),o("p",[e._v("JobStores and DataSrouces were discussed in Lesson 9 of this tutorial. Worth noting here, is the fact that all JobStores\nimplement the IJobStore interface - and that if one of the bundled JobStores does not fit your needs, then you can make your own.")]),e._v(" "),o("p",[e._v("Finally, you need to create your Scheduler instance. The Scheduler itself needs to be given a name and handed\ninstances of a JobStore and ThreadPool.")]),e._v(" "),o("h2",{attrs:{id:"stdschedulerfactory"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#stdschedulerfactory"}},[e._v("#")]),e._v(" StdSchedulerFactory")]),e._v(" "),o("p",[e._v("StdSchedulerFactory is an implementation of the ISchedulerFactory interface.\nIt uses a set of properties (NameValueCollection) to create and initialize a Quartz Scheduler.\nThe properties are generally stored in and loaded from a file, but can also be created by your program and handed directly to the factory.\nSimply calling getScheduler() on the factory will produce the scheduler, initialize it (and its ThreadPool, JobStore and DataSources),\nand return a handle to its public interface.")]),e._v(" "),o("p",[e._v('There are some sample configurations (including descriptions of the properties) in the "docs/config" directory of the Quartz distribution.\nYou can find complete documentation in the "Configuration" manual under the "Reference" section of the Quartz documentation.')]),e._v(" "),o("h2",{attrs:{id:"directschedulerfactory"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#directschedulerfactory"}},[e._v("#")]),e._v(" DirectSchedulerFactory")]),e._v(" "),o("p",[e._v("DirectSchedulerFactory is another SchedulerFactory implementation. It is useful to those wishing to create their Scheduler\ninstance in a more programatic way. Its use is generally discouraged for the following reasons: (1) it\nrequires the user to have a greater understanding of what they're doing, and (2) it does not allow for declaritive\nconfiguration - or in other words, you end up hard-coding all of the scheduler's settings.")]),e._v(" "),o("h2",{attrs:{id:"logging"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#logging"}},[e._v("#")]),e._v(" Logging")]),e._v(" "),o("p",[e._v("Quartz.NET uses the "),o("a",{attrs:{href:"http://netcommon.sourceforge.net/"}},[e._v("Common.Logging framework")]),e._v(' for all of its logging needs.\nQuartz does not produce much logging information - generally just some information during initialization, and\nthen only messages about serious problems while Jobs are executing. In order to "tune" the logging settings\n(such as the amount of output, and where the output goes), you need to understand the Commmon.Logging framework,\nwhich is beyond the scope of this document, please refer to '),o("a",{attrs:{href:"http://netcommon.sourceforge.net/documentation.html"}},[e._v("Common.Logging Documentation")]),e._v(".")])])}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/89.52251cd3.js b/assets/js/89.52251cd3.js
new file mode 100644
index 000000000..676fd0a9c
--- /dev/null
+++ b/assets/js/89.52251cd3.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[89],{463:function(t,e,a){"use strict";a.r(e);var i=a(26),n=Object(i.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[t._v("#")]),t._v(" Introduction")]),t._v(" "),a("p",[t._v("cron is a UNIX tool that has been around for a long time, so its scheduling capabilities are powerful and proven. The CronTrigger class is based on the scheduling capabilities of cron.")]),t._v(" "),a("p",[t._v('CronTrigger uses "cron expressions", which are able to create firing schedules such as: "At 8:00am every Monday through Friday" or "At 1:30am every last Friday of the month".')]),t._v(" "),a("p",[t._v("Cron expressions are powerful, but can be pretty confusing. This tutorial aims to take some of the mystery out of creating a cron expression, giving users a resource which they can visit before having to ask in a forum or mailing list.")]),t._v(" "),a("h2",{attrs:{id:"format"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#format"}},[t._v("#")]),t._v(" Format")]),t._v(" "),a("p",[t._v("A cron expression is a string comprised of 6 or 7 fields separated by white space.\nFields can contain any of the allowed values, along with various combinations of the allowed special characters for that field. The fields are as follows:")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",[a("strong",[t._v("Field Name")])]),t._v(" "),a("th",[a("strong",[t._v("Mandatory")])]),t._v(" "),a("th",[a("strong",[t._v("Allowed Values")])]),t._v(" "),a("th",[a("strong",[t._v("Allowed Special Characters")])])])]),t._v(" "),a("tbody",[a("tr",[a("td",[t._v("Seconds")]),t._v(" "),a("td",[t._v("YES")]),t._v(" "),a("td",[t._v("0-59")]),t._v(" "),a("td",[t._v(", - * /")])]),t._v(" "),a("tr",[a("td",[t._v("Minutes")]),t._v(" "),a("td",[t._v("YES")]),t._v(" "),a("td",[t._v("0-59")]),t._v(" "),a("td",[t._v(", - * /")])]),t._v(" "),a("tr",[a("td",[t._v("Hours")]),t._v(" "),a("td",[t._v("YES")]),t._v(" "),a("td",[t._v("0-23")]),t._v(" "),a("td",[t._v(", - * /")])]),t._v(" "),a("tr",[a("td",[t._v("Day of month")]),t._v(" "),a("td",[t._v("YES")]),t._v(" "),a("td",[t._v("1-31")]),t._v(" "),a("td",[t._v(", - * ? / L W")])]),t._v(" "),a("tr",[a("td",[t._v("Month")]),t._v(" "),a("td",[t._v("YES")]),t._v(" "),a("td",[t._v("1-12 or JAN-DEC")]),t._v(" "),a("td",[t._v(", - * /")])]),t._v(" "),a("tr",[a("td",[t._v("Day of week")]),t._v(" "),a("td",[t._v("YES")]),t._v(" "),a("td",[t._v("1-7 or SUN-SAT")]),t._v(" "),a("td",[t._v(", - * ? / L #")])]),t._v(" "),a("tr",[a("td",[t._v("Year")]),t._v(" "),a("td",[t._v("NO")]),t._v(" "),a("td",[t._v("empty, 1970-2099")]),t._v(" "),a("td",[t._v(", - * /")])])])]),t._v(" "),a("p",[t._v("So cron expressions can be as simple as this: * * * * ? *")]),t._v(" "),a("p",[t._v("or more complex, like this: 0/5 14,18,3-39,52 * ? JAN,MAR,SEP MON-FRI 2002-2010")]),t._v(" "),a("h2",{attrs:{id:"special-characters"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#special-characters"}},[t._v("#")]),t._v(" Special characters")]),t._v(" "),a("ul",[a("li",[a("ul",[a("li",[t._v('("all values") - used to select all values within a field. For example, "" in the minute field means *"every minute".')])])]),t._v(" "),a("li",[a("strong",[t._v("?")]),t._v(' ("no specific value") - useful when you need to specify something in one of the two fields in which the character is allowed, but not the other. For example, if I want my trigger to fire on a particular day of the month (say, the 10th), but don\'t care what day of the week that happens to be, I would put "10" in the day-of-month field, and "?" in the day-of-week field. See the examples below for clarification.')]),t._v(" "),a("li",[a("strong",[t._v("-")]),t._v(' - used to specify ranges. For example, "10-12" in the hour field means "the hours 10, 11 and 12".')]),t._v(" "),a("li",[a("strong",[t._v(",")]),t._v(' - used to specify additional values. For example, "MON,WED,FRI" in the day-of-week field means "the days Monday, Wednesday, and Friday".')]),t._v(" "),a("li",[a("strong",[t._v("/")]),t._v(" - used to specify increments. For example, \"0/15\" in the seconds field means \"the seconds 0, 15, 30, and 45\". And \"5/15\" in the seconds field means \"the seconds 5, 20, 35, and 50\". You can also specify '/' after the '' character - in this case '' is equivalent to having '0' before the '/'. '1/3' in the day-of-month field means \"fire every 3 days starting on the first day of the month\".")]),t._v(" "),a("li",[a("strong",[t._v("L")]),t._v(' ("last") - has different meaning in each of the two fields in which it is allowed. For example, the value "L" in the day-of-month field means "the last day of the month" - day 31 for January, day 28 for February on non-leap years. If used in the day-of-week field by itself, it simply means "7" or "SAT". But if used in the day-of-week field after another value, it means "the last xxx day of the month" - for example "6L" means "the last friday of the month". You can also specify an offset from the last day of the month, such as "L-3" which would mean the third-to-last day of the calendar month. When using the \'L\' option, it is important not to specify lists, or ranges of values, as you\'ll get confusing/unexpected results.')]),t._v(" "),a("li",[a("strong",[t._v("W")]),t._v(" (\"weekday\") - used to specify the weekday (Monday-Friday) nearest the given day. As an example, if you were to specify \"15W\" as the value for the day-of-month field, the meaning is: \"the nearest weekday to the 15th of the month\". So if the 15th is a Saturday, the trigger will fire on Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. However if you specify \"1W\" as the value for day-of-month, and the 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not 'jump' over the boundary of a month's days. The 'W' character can only be specified when the day-of-month is a single day, not a range or list of days.\n** The 'L' and 'W' characters can also be combined in the day-of-month field to yield 'LW', which translates to "),a("em",[t._v('"last weekday of the month"')]),t._v(".")]),t._v(" "),a("li",[a("strong",[t._v("#")]),t._v(' - used to specify "the nth" XXX day of the month. For example, the value of "6#3" in the day-of-week field means "the third Friday of the month" (day 6 = Friday and "#3" = the 3rd one in the month). Other examples: "2#1" = the first Monday of the month and "4#5" = the fifth Wednesday of the month. Note that if you specify "#5" and there is not 5 of the given day-of-week in the month, then no firing will occur that month.\n** The legal characters and the names of months and days of the week are not case sensitive. MON is the same as mon.')])]),t._v(" "),a("h2",{attrs:{id:"examples"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),a("p",[t._v("Here are some full examples:")]),t._v(" "),a("table",[a("thead",[a("tr",[a("th",{staticStyle:{"text-align":"left"}},[a("strong",[t._v("Expression")])]),t._v(" "),a("th",{staticStyle:{"text-align":"left"}},[a("strong",[t._v("Meaning")])])])]),t._v(" "),a("tbody",[a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 0 12 * * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 12pm (noon) every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 ? * *")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 * * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 * * ? *")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 * * ? 2005")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am every day during the year 2005")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 * 14 * * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire every minute starting at 2pm and ending at 2:59pm, every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 0/5 14 * * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire every 5 minutes starting at 2pm and ending at 2:55pm, every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 0/5 14,18 * * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire every 5 minutes starting at 2pm and ending at 2:55pm, AND fire every 5 minutes starting at 6pm and ending at 6:55pm, every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 0-5 14 * * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire every minute starting at 2pm and ending at 2:05pm, every day")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 10,44 14 ? 3 WED")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 2:10pm and at 2:44pm every Wednesday in the month of March.")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 ? * MON-FRI")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 15 * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am on the 15th day of every month")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 L * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am on the last day of every month")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 L-2 * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am on the 2nd-to-last last day of every month")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 ? * 6L")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am on the last Friday of every month")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 ? * 6L")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am on the last Friday of every month")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 ? * 6L 2002-2005")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 15 10 ? * 6#3")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 10:15am on the third Friday of every month")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 0 12 1/5 * ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire at 12pm (noon) every 5 days every month, starting on the first day of the month.")])]),t._v(" "),a("tr",[a("td",{staticStyle:{"text-align":"left"}},[t._v("0 11 11 11 11 ?")]),t._v(" "),a("td",{staticStyle:{"text-align":"left"}},[t._v("Fire every November 11th at 11:11am.")])])])]),t._v(" "),a("ul",[a("li",[t._v("Pay attention to the effects of '?' and '*' in the day-of-week and day-of-month fields!")])]),t._v(" "),a("h2",{attrs:{id:"notes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#notes"}},[t._v("#")]),t._v(" Notes")]),t._v(" "),a("ul",[a("li",[t._v("Support for specifying both a day-of-week and a day-of-month value is not complete (you must currently use the '?' character in one of these fields).")]),t._v(" "),a("li",[t._v('Be careful when setting fire times between the hours of the morning when "daylight savings" changes occur in your locale (for US locales, this would typically be the hour before and after 2:00 AM - because the time shift can cause a skip or a repeat depending on whether the time moves back or jumps forward. You may find this wikipedia entry helpful in determining the specifics to your locale:\nhttps://secure.wikimedia.org/wikipedia/en/wiki/Daylight_saving_time_around_the_world')])])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/9.f3852c3d.js b/assets/js/9.f3852c3d.js
new file mode 100644
index 000000000..d03e681f4
--- /dev/null
+++ b/assets/js/9.f3852c3d.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{384:function(t,n,r){"use strict";r.r(n);r(49),r(181),r(27);var e={computed:{posts:function(){return this.$site.pages.filter((function(t){return"post"===t.id&&!0!==t.frontmatter.hidden})).sort((function(t,n){return n.path.localeCompare(t.path)})).map((function(t){return t.dateString=t.path.substring(1,11),t}))}}},o=r(26),i=Object(o.a)(e,(function(){var t=this,n=t.$createElement,r=t._self._c||n;return r("div",t._l(t.posts,(function(n){return r("div",[r("h2",[r("router-link",{attrs:{to:n.path}},[t._v(t._s(n.dateString+" "+n.frontmatter.title))])],1),t._v(" "),r("p",[t._v(t._s(n.frontmatter.description))]),t._v(" "),r("p",[r("router-link",{attrs:{to:n.path}},[t._v("Read more")])],1)])})),0)}),[],!1,null,null,null);n.default=i.exports}}]);
\ No newline at end of file
diff --git a/assets/js/90.88b29d89.js b/assets/js/90.88b29d89.js
new file mode 100644
index 000000000..5a66b5303
--- /dev/null
+++ b/assets/js/90.88b29d89.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[90],{464:function(t,s,n){"use strict";n.r(s);var e=n(26),a=Object(e.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[t._v("CronTriggers are often more useful than SimpleTrigger, if you need a job-firing schedule that recurs based on calendar-like notions,\nrather than on the exactly specified intervals of SimpleTrigger.")]),t._v(" "),n("p",[t._v('With CronTrigger, you can specify firing-schedules such as "every Friday at noon", or "every weekday and 9:30 am",\nor even "every 5 minutes between 9:00 am and 10:00 am on every Monday, Wednesday and Friday".')]),t._v(" "),n("p",[t._v("Even so, like SimpleTrigger, CronTrigger has a startTime which specifies when the schedule is in force, and an (optional)\nendTime that specifies when the schedule should be discontinued.")]),t._v(" "),n("h3",{attrs:{id:"cron-expressions"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#cron-expressions"}},[t._v("#")]),t._v(" Cron Expressions")]),t._v(" "),n("p",[n("em",[t._v("Cron-Expressions")]),t._v(" are used to configure instances of CronTrigger. Cron-Expressions are strings that are actually made up\nof seven sub-expressions, that describe individual details of the schedule. These sub-expression are separated with white-space, and represent:")]),t._v(" "),n("ul",[n("li",[n("ol",[n("li",[t._v("Seconds")])])]),t._v(" "),n("li",[n("ol",{attrs:{start:"2"}},[n("li",[t._v("Minutes")])])]),t._v(" "),n("li",[n("ol",{attrs:{start:"3"}},[n("li",[t._v("Hours")])])]),t._v(" "),n("li",[n("ol",{attrs:{start:"4"}},[n("li",[t._v("Day-of-Month")])])]),t._v(" "),n("li",[n("ol",{attrs:{start:"5"}},[n("li",[t._v("Month")])])]),t._v(" "),n("li",[n("ol",{attrs:{start:"6"}},[n("li",[t._v("Day-of-Week")])])]),t._v(" "),n("li",[n("ol",{attrs:{start:"7"}},[n("li",[t._v("Year (optional field)")])])])]),t._v(" "),n("p",[t._v('An example of a complete cron-expression is the string "0 0 12 ? * WED" - which means "every Wednesday at 12:00 pm".')]),t._v(" "),n("p",[t._v('Individual sub-expressions can contain ranges and/or lists. For example, the day of week field in the previous (which reads "WED")\nexample could be replaces with "MON-FRI", "MON, WED, FRI", or even "MON-WED,SAT".')]),t._v(" "),n("p",[t._v("Wild-cards (the '"),n("em",[t._v("' character) can be used to say \"every\" possible value of this field. Therefore the '")]),t._v('\' character in the\n"Month" field of the previous example simply means "every month". A \'*\' in the Day-Of-Week field would obviously mean "every day of the week".')]),t._v(" "),n("p",[t._v("All of the fields have a set of valid values that can be specified. These values should be fairly obvious - such as the numbers\n0 to 59 for seconds and minutes, and the values 0 to 23 for hours. Day-of-Month can be any value 0-31, but you need to be careful\nabout how many days are in a given month! Months can be specified as values between 0 and 11, or by using the strings\nJAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC. Days-of-Week can be specified as vaules between 1 and 7 (1 = Sunday)\nor by using the strings SUN, MON, TUE, WED, THU, FRI and SAT.")]),t._v(" "),n("p",[t._v("The '/' character can be used to specify increments to values. For example, if you put '0/15' in the Minutes field, it means 'every 15 minutes,\nstarting at minute zero'. If you used '3/20' in the Minutes field, it would mean 'every 20 minutes during the hour,\nstarting at minute three' - or in other words it is the same as specifying '3,23,43' in the Minutes field.")]),t._v(" "),n("p",[t._v("The '?' character is allowed for the day-of-month and day-of-week fields. It is used to specify \"no specific value\".\nThis is useful when you need to specify something in one of the two fields, but not the other.\nSee the examples below (and CronTrigger API documentation) for clarification.")]),t._v(" "),n("p",[t._v('The \'L\' character is allowed for the day-of-month and day-of-week fields. This character is short-hand for "last",\nbut it has different meaning in each of the two fields. For example, the value "L" in the day-of-month field means\n"the last day of the month" - day 31 for January, day 28 for February on non-leap years. If used in the day-of-week field by itself,\nit simply means "7" or "SAT". But if used in the day-of-week field after another value, it means "the last xxx day of the month" -\nfor example "6L" or "FRIL" both mean "the last friday of the month". When using the \'L\' option, it is important not to specify lists,\nor ranges of values, as you\'ll get confusing results.')]),t._v(" "),n("p",[t._v('The \'W\' is used to specify the weekday (Monday-Friday) nearest the given day. As an example, if you were to specify "15W" as the value for the day-of-month field, the meaning is: "the nearest weekday to the 15th of the month".')]),t._v(" "),n("p",[t._v('The \'#\' is used to specify "the nth" XXX weekday of the month. For example, the value of "6#3" or "FRI#3" in the day-of-week field means "the third Friday of the month".')]),t._v(" "),n("h2",{attrs:{id:"example-cron-expressions"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#example-cron-expressions"}},[t._v("#")]),t._v(" Example Cron Expressions")]),t._v(" "),n("p",[t._v("Here are a few more examples of expressions and their meanings - you can find even more in the API documentation for CronTrigger")]),t._v(" "),n("p",[n("strong",[t._v("CronTrigger Example 1 - an expression to create a trigger that simply fires every 5 minutes")])]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",[n("code",[t._v('"0 0/5 * * * ?"\n')])])]),n("p",[n("strong",[t._v("CronTrigger Example 2 - an expression to create a trigger that fires every 5 minutes, at 10 seconds after the minute (i.e. 10:00:10 am, 10:05:10 am, etc.).")])]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",[n("code",[t._v('"10 0/5 * * * ?"\n')])])]),n("p",[n("strong",[t._v("CronTrigger Example 3 - an expression to create a trigger that fires at 10:30, 11:30, 12:30, and 13:30, on every Wednesday and Friday.")])]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",[n("code",[t._v('"0 30 10-13 ? * WED,FRI"\n')])])]),n("p",[n("strong",[t._v("CronTrigger Example 4 - an expression to create a trigger that fires every half hour between the hours of 8 am and 10 am on the 5th and 20th of every month.\nNote that the trigger will NOT fire at 10:00 am, just at 8:00, 8:30, 9:00 and 9:30")])]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",[n("code",[t._v('"0 0/30 8-9 5,20 * ?"\n')])])]),n("p",[t._v('Note that some scheduling requirements are too complicated to express with a single trigger - such as "every 5 minutes between 9:00 am and 10:00 am,\nand every 20 minutes between 1:00 pm and 10:00 pm". The solution in this scenario is to simply create two triggers, and register both of them to run the same job.')]),t._v(" "),n("h2",{attrs:{id:"building-crontriggers"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#building-crontriggers"}},[t._v("#")]),t._v(" Building CronTriggers")]),t._v(" "),n("p",[t._v("CronTrigger instances are built using "),n("strong",[t._v("TriggerBuilder")]),t._v(" (for the trigger's main properties) and "),n("strong",[t._v("WithCronSchedule")]),t._v(" extension method (for the CronTrigger-specific properties).")]),t._v(" "),n("p",[t._v("You can also use CronScheduleBuilder's static methods to create schedules.")]),t._v(" "),n("p",[n("strong",[t._v("Build a trigger that will fire every other minute, between 8am and 5pm, every day:")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[t._v("trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger3"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithCronSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0 0/2 8-17 * * ?"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),n("p",[n("strong",[t._v("Build a trigger that will fire daily at 10:42 am:")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// we use CronScheduleBuilder's static helper methods here")]),t._v("\ntrigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger3"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("CronScheduleBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("DailyAtHourAndMinute")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("42")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobKey"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),n("p",[t._v("or -")]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[t._v("trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger3"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithCronSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0 42 10 * * ?"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),n("p",[n("strong",[t._v("Build a trigger that will fire on Wednesdays at 10:42 am, in a TimeZone other than the system's default:")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[t._v("trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger3"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("CronScheduleBuilder\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WeeklyOnDayAndHourAndMinute")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DayOfWeek"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Wednesday"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("42")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("InTimeZone")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("TimeZoneInfo"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("FindSystemTimeZoneById")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Central America Standard Time"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobKey"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),n("p",[t._v("or -")]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[t._v("trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger3"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithCronSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0 42 10 ? * WED"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("InTimeZone")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("TimeZoneInfo"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("FindSystemTimeZoneById")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Central America Standard Time"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobKey"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),n("h2",{attrs:{id:"crontrigger-misfire-instructions"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#crontrigger-misfire-instructions"}},[t._v("#")]),t._v(" CronTrigger Misfire Instructions")]),t._v(" "),n("p",[t._v("The following instructions can be used to inform Quartz what it should do when a misfire occurs for CronTrigger.\n(Misfire situations were introduced in the More About Triggers section of this tutorial). These instructions are defined in as\nconstants (and API documentation has description for their behavior). The instructions include:")]),t._v(" "),n("ul",[n("li",[t._v("MisfireInstruction.IgnoreMisfirePolicy")]),t._v(" "),n("li",[t._v("MisfireInstruction.CronTrigger.DoNothing")]),t._v(" "),n("li",[t._v("MisfireInstruction.CronTrigger.FireOnceNow")])]),t._v(" "),n("p",[t._v("All triggers have the MisfireInstrution.SmartPolicy instruction available for use, and this instruction is also the default for all trigger types.\nThe 'smart policy' instruction is interpreted by CronTrigger as MisfireInstruction.CronTrigger.FireOnceNow. The API documentation for the\nCronTrigger.UpdateAfterMisfire() method explains the exact details of this behavior.")]),t._v(" "),n("p",[t._v("When building CronTriggers, you specify the misfire instruction as part of the cron schedule (via WithCronSchedule extension method):")]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[t._v("trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger3"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithCronSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0 0/2 8-17 * * ?"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithMisfireHandlingInstructionFireAndProceed")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=a.exports}}]);
\ No newline at end of file
diff --git a/assets/js/91.4a66f8db.js b/assets/js/91.4a66f8db.js
new file mode 100644
index 000000000..5b4ff598b
--- /dev/null
+++ b/assets/js/91.4a66f8db.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[91],{465:function(e,t,o){"use strict";o.r(t);var a=o(26),r=Object(a.a)({},(function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[o("p",[e._v("JobStore's are responsible for keeping track of all the \"work data\" that you give to the scheduler:\njobs, triggers, calendars, etc. Selecting the appropriate IJobStore implementation for your Quartz scheduler instance is an important step.\nLuckily, the choice should be a very easy one once you understand the differences between them.\nYou declare which JobStore your scheduler should use (and it's configuration settings) in the properties file (or object) that\nyou provide to the SchedulerFactory that you use to produce your scheduler instance.")]),e._v(" "),o("p",[o("em",[e._v("Never use a JobStore instance directly in your code. For some reason many people attempt to do this.\nThe JobStore is for behind-the-scenes use of Quartz itself. You have to tell Quartz (through configuration) which JobStore to use,\nbut then you should only work with the Scheduler interface in your code.")])]),e._v(" "),o("h2",{attrs:{id:"ramjobstore"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#ramjobstore"}},[e._v("#")]),e._v(" RAMJobStore")]),e._v(" "),o("p",[e._v("RAMJobStore is the simplest JobStore to use, it is also the most performant (in terms of CPU time).\nRAMJobStore gets its name in the obvious way: it keeps all of its data in RAM. This is why it's lightning-fast,\nand also why it's so simple to configure. The drawback is that when your application ends (or crashes) all of\nthe scheduling information is lost - this means RAMJobStore cannot honor the setting of \"non-volatility\" on jobs and triggers.\nFor some applications this is acceptable - or even the desired behavior, but for other applications, this may be disasterous.")]),e._v(" "),o("p",[o("strong",[e._v("Configuring Quartz to use RAMJobStore")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.type = Quartz.Simpl.RAMJobStore, Quartz\n")])])]),o("p",[e._v("To use RAMJobStore (and assuming you're using StdSchedulerFactory) you don't need to do anything special. Default configuration\nof Quartz.NET uses RAMJobStore as job store implementation.")]),e._v(" "),o("h2",{attrs:{id:"ado-net-job-store-adojobstore"}},[o("a",{staticClass:"header-anchor",attrs:{href:"#ado-net-job-store-adojobstore"}},[e._v("#")]),e._v(" ADO.NET Job Store (AdoJobStore)")]),e._v(" "),o("p",[e._v("AdoJobStore is also aptly named - it keeps all of its data in a database via ADO.NET.\nBecause of this it is a bit more complicated to configure than RAMJobStore, and it also is not as fast.\nHowever, the performance draw-back is not terribly bad, especially if you build the database tables with indexes on the primary keys.")]),e._v(" "),o("p",[e._v('To use AdoJobStore, you must first create a set of database tables for Quartz.NET to use.\nYou can find table-creation SQL scripts in the "database/dbtables" directory of the Quartz.NET distribution.\nIf there is not already a script for your database type, just look at one of the existing ones, and modify it in any way necessary for your DB.\nOne thing to note is that in these scripts, all the the tables start with the prefix "QRTZ_"\nsuch as the tables "QRTZ_TRIGGERS", and "QRTZ_JOB_DETAIL"). This prefix can actually be anything you\'d like, as long as you inform AdoJobStore\nwhat the prefix is (in your Quartz.NET properties). Using different prefixes may be useful for creating multiple sets of tables,\nfor multiple scheduler instances, within the same database.')]),e._v(" "),o("p",[e._v("Currently the only option for the internal implementation of job store is JobStoreTX which creates transactions by itself.\nThis is different from Java version of Quartz where there is also option to choose JobStoreCMT which uses J2EE container\nmanaged transactions.")]),e._v(" "),o("p",[e._v("The last piece of the puzzle is setting up a data source from which AdoJobStore can get connections to your database.\nData sources are defined in your Quartz.NET properties. Data source information contains the connection string\nand ADO.NET delegate information.")]),e._v(" "),o("p",[o("strong",[e._v("Configuring Quartz to use JobStoreTx")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz\n")])])]),o("p",[e._v('Next, you need to select a IDriverDelegate implementation for the JobStore to use.\nThe DriverDelegate is responsible for doing any ADO.NET work that may be needed for your specific database.\nStdAdoDelegate is a delegate that uses "vanilla" ADO.NET code (and SQL statements) to do its work.\nIf there isn\'t another delegate made specifically for your database, try using this delegate -\nspecial delegates usually have better performance or workarounds for database specific issues.\nOther delegates can be found in the "Quartz.Impl.AdoJobStore" namespace, or in its sub-namespaces.')]),e._v(" "),o("p",[o("strong",[e._v("NOTE:")]),e._v(" Quartz.NET will issue warning if you are using the default StdAdoDelegate as it has poor performance\nwhen you have a lot of triggers to select from. Specific delegates have special SQL to limit result\nset length (SQLServerDelegate uses TOP n, PostgreSQLDelegate LIMIT n, OracleDelegate ROWCOUNT() <= n etc.).")]),e._v(" "),o("p",[e._v("Once you've selected your delegate, set its class name as the delegate for AdoJobStore to use.")]),e._v(" "),o("p",[o("strong",[e._v("Configuring AdoJobStore to use a DriverDelegate")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz\n")])])]),o("p",[e._v("Next, you need to inform the JobStore what table prefix (discussed above) you are using.")]),e._v(" "),o("p",[o("strong",[e._v("Configuring AdoJobStore with the Table Prefix")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.tablePrefix = QRTZ_\n")])])]),o("p",[e._v('And finally, you need to set which data source should be used by the JobStore. The named data source must also be defined in your Quartz properties.\nIn this case, we\'re specifying that Quartz should use the data source name "myDS" (that is defined elsewhere in the configuration properties).')]),e._v(" "),o("p",[o("strong",[e._v("Configuring AdoJobStore with the name of the data source to use")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.dataSource = myDS\n")])])]),o("p",[e._v("One last thing that is needed for the configuration is to set data source connection string information and database provider. Connection\nstring is the standard ADO.NET connection which is driver specific. Database provider is an abstraction of database drivers to create\nloose coupling between database drivers and Quartz.")]),e._v(" "),o("p",[o("strong",[e._v("Setting Data Source's Connection String And Database Provider")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v(" quartz.dataSource.myDS.connectionString = Server=localhost;Database=quartz;Uid=quartznet;Pwd=quartznet\n quartz.dataSource.myDS.provider = MySql-50\n")])])]),o("p",[e._v("Currently following database providers are supported:")]),e._v(" "),o("ul",[o("li",[e._v("SqlServer-20 - SQL Server driver for .NET Framework 2.0")]),e._v(" "),o("li",[e._v("OracleODP-20 - Oracle's Oracle Driver")]),e._v(" "),o("li",[e._v("OracleODPManaged-1123-40 Oracle's managed driver for Oracle 11")]),e._v(" "),o("li",[e._v("OracleODPManaged-1211-40 Oracle's managed driver for Oracle 12")]),e._v(" "),o("li",[e._v("MySql-50 - MySQL Connector/.NET v. 5.0 (.NET 2.0)")]),e._v(" "),o("li",[e._v("MySql-51 - MySQL Connector/:NET v. 5.1 (.NET 2.0)")]),e._v(" "),o("li",[e._v("MySql-65 - MySQL Connector/:NET v. 6.5 (.NET 2.0)")]),e._v(" "),o("li",[e._v("SQLite-10 - SQLite ADO.NET 2.0 Provider v. 1.0.56 (.NET 2.0)")]),e._v(" "),o("li",[e._v("Firebird-201 - Firebird ADO.NET 2.0 Provider v. 2.0.1 (.NET 2.0)")]),e._v(" "),o("li",[e._v("Firebird-210 - Firebird ADO.NET 2.0 Provider v. 2.1.0 (.NET 2.0)")]),e._v(" "),o("li",[e._v("Npgsql-20 - PostgreSQL Npgsql")])]),e._v(" "),o("p",[o("strong",[e._v("You can and should use latest version of driver if newer is available, just create an assembly binding redirect")])]),e._v(" "),o("p",[e._v("If your Scheduler is very busy (i.e. nearly always executing the same number of jobs as the size of the thread pool, then you should\nprobably set the number of connections in the data source to be the about the size of the thread pool + 1.This is commonly configured\nint the ADO.NET connection string - see your driver implementation for details.")]),e._v(" "),o("p",[e._v('The "quartz.jobStore.useProperties" config parameter can be set to "true" (defaults to false) in order to instruct AdoJobStore that all values in JobDataMaps will be strings,\nand therefore can be stored as name-value pairs, rather than storing more complex objects in their serialized form in the BLOB column. This is much safer in the long term,\nas you avoid the class versioning issues that there are with serializing your non-String classes into a BLOB.')]),e._v(" "),o("p",[o("strong",[e._v("Configuring AdoJobStore to use strings as JobDataMap values (recommended)")])]),e._v(" "),o("div",{staticClass:"language- extra-class"},[o("pre",[o("code",[e._v("quartz.jobStore.useProperties = true\n")])])])])}),[],!1,null,null,null);t.default=r.exports}}]);
\ No newline at end of file
diff --git a/assets/js/92.46584aef.js b/assets/js/92.46584aef.js
new file mode 100644
index 000000000..b8e751f2e
--- /dev/null
+++ b/assets/js/92.46584aef.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[92],{466:function(t,e,a){"use strict";a.r(e);var s=a(26),n=Object(s.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"the-quartz-api"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#the-quartz-api"}},[t._v("#")]),t._v(" The Quartz API")]),t._v(" "),a("p",[t._v("The key interfaces and classes of the Quartz API are:")]),t._v(" "),a("ul",[a("li",[t._v("IScheduler - the main API for interacting with the scheduler.")]),t._v(" "),a("li",[t._v("IJob - an interface to be implemented by components that you wish to have executed by the scheduler.")]),t._v(" "),a("li",[t._v("IJobDetail - used to define instances of Jobs.")]),t._v(" "),a("li",[t._v("ITrigger - a component that defines the schedule upon which a given Job will be executed.")]),t._v(" "),a("li",[t._v("JobBuilder - used to define/build JobDetail instances, which define instances of Jobs.")]),t._v(" "),a("li",[t._v("TriggerBuilder - used to define/build Trigger instances.")])]),t._v(" "),a("p",[t._v("In this tutorial for readability's sake following terms are used interchangeably: IScheduler and Scheduler, IJob and Job, IJobDetail and JobDetail, ITrigger and Trigger.")]),t._v(" "),a("p",[t._v("A "),a("strong",[t._v("Scheduler")]),t._v("'s life-cycle is bounded by it's creation, via a "),a("strong",[t._v("SchedulerFactory")]),t._v(" and a call to its Shutdown() method.\nOnce created the IScheduler interface can be used to add, remove, and list Jobs and Triggers, and perform other scheduling-related operations (such as pausing a trigger).\nHowever, the Scheduler will not actually act on any triggers (execute jobs) until it has been started with the Start() method, as shown in "),a("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/using-quartz.html"}},[t._v("Lesson 1")]),t._v(".")],1),t._v(" "),a("p",[t._v('Quartz provides "builder" classes that define a Domain Specific Language (or DSL, also sometimes referred to as a "fluent interface"). In the previous lesson you saw an example of it, which we present a portion of here again:')]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[t._v("\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define the job and tie it to our HelloJob class")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobDetail")]),t._v(" job "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" JobBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token generic-method"}},[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token generic class-name"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("HelloJob"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// name "myJob", group "group1"')]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Trigger the job to run now, and then every 40 seconds")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartNow")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInSeconds")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" \n\t\t"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t\n\t"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Tell quartz to schedule the job using our trigger")]),t._v("\n\tsched"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("scheduleJob")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("The block of code that builds the job definition is using JobBuilder using fluent interface to create the product, IJobDetail.\nLikewise, the block of code that builds the trigger is using TriggerBuilder's fluent interface and extension methods that are specific to given trigger type.\nPossible schedule extension methods are:")]),t._v(" "),a("ul",[a("li",[t._v("WithCalendarIntervalSchedule")]),t._v(" "),a("li",[t._v("WithCronSchedule")]),t._v(" "),a("li",[t._v("WithDailyTimeIntervalSchedule")]),t._v(" "),a("li",[t._v("WithSimpleSchedule")])]),t._v(" "),a("p",[t._v("The DateBuilder class contains various methods for easily constructing DateTimeOffset instances for particular points in time (such as a date that represents the next even hour - or in other words 10:00:00 if it is currently 9:43:27).")]),t._v(" "),a("h2",{attrs:{id:"jobs-and-triggers"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#jobs-and-triggers"}},[t._v("#")]),t._v(" Jobs and Triggers")]),t._v(" "),a("p",[t._v("A Job is a class that implements the IJob interface, which has only one simple method:")]),t._v(" "),a("p",[a("strong",[t._v("IJob Interface")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("namespace")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("Quartz")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobExecutionContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("When the Job's trigger fires (more on that in a moment), the Execute(..) method is invoked by one of the scheduler's worker threads.\nThe JobExecutionContext object that is passed to this method provides the job instance with information about its \"run-time\" environment -\na handle to the Scheduler that executed it, a handle to the Trigger that triggered the execution, the job's JobDetail object, and a few other items.")]),t._v(" "),a("p",[t._v("The JobDetail object is created by the Quartz.NET client (your program) at the time the Job is added to the scheduler.\nIt contains various property settings for the Job, as well as a JobDataMap, which can be used to store state information for a given instance of your job class.\nIt is essentially the definition of the job instance, and is discussed in further detail in the next lesson.")]),t._v(" "),a("p",[t._v("Trigger objects are used to trigger the execution (or 'firing') of jobs. When you wish to schedule a job, you instantiate a trigger and 'tune' its properties\nto provide the scheduling you wish to have. Triggers may also have a JobDataMap associated with them - this is useful to passing parameters to a\nJob that are specific to the firings of the trigger. Quartz ships with a handful of different trigger types, but the most commonly used types\nare SimpleTrigger (interface ISimpleTrigger) and CronTrigger (interface ICronTrigger).")]),t._v(" "),a("p",[t._v('SimpleTrigger is handy if you need \'one-shot\' execution (just single execution of a job at a given moment in time), or if you need to fire a job at a given time,\nand have it repeat N times, with a delay of T between executions. CronTrigger is useful if you wish to have triggering based on calendar-like schedules -\nsuch as "every Friday, at noon" or "at 10:15 on the 10th day of every month."')]),t._v(" "),a("p",[t._v("Why Jobs AND Triggers? Many job schedulers do not have separate notions of jobs and triggers. Some define a 'job' as simply an execution time (or schedule)\nalong with some small job identifier. Others are much like the union of Quartz's job and trigger objects. While developing Quartz, we decided that it made sense\nto create a separation between the schedule and the work to be performed on that schedule. This has (in our opinion) many benefits.")]),t._v(" "),a("p",[t._v("For example, Jobs can be created and stored in the job scheduler independent of a trigger, and many triggers can be associated with the same job.\nAnother benefit of this loose-coupling is the ability to configure jobs that remain in the scheduler after their associated triggers have expired,\nso that that it can be rescheduled later, without having to re-define it. It also allows you to modify or replace a trigger without having to re-define\nits associated job.")]),t._v(" "),a("h2",{attrs:{id:"identities"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#identities"}},[t._v("#")]),t._v(" Identities")]),t._v(" "),a("p",[t._v('Jobs and Triggers are given identifying keys as they are registered with the Quartz scheduler.\nThe keys of Jobs and Triggers (JobKey and TriggerKey) allow them to be placed into \'groups\' which can be useful for organizing your jobs and\ntriggers into categories such as "reporting jobs" and "maintenance jobs". The name portion of the key of a job or trigger must be unique within the group')]),t._v(" "),a("ul",[a("li",[t._v("or in other words, the complete key (or identifier) of a job or trigger is the compound of the name and group.")])]),t._v(" "),a("p",[t._v("You now have a general idea about what Jobs and Triggers are, you can learn more about them in\n"),a("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/more-about-jobs.html"}},[t._v("Lesson 3: More About Jobs & JobDetails")]),t._v(" and "),a("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/more-about-triggers.html"}},[t._v("Lesson 4: More About Triggers")])],1)])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/93.e616473a.js b/assets/js/93.e616473a.js
new file mode 100644
index 000000000..9a5bb7ada
--- /dev/null
+++ b/assets/js/93.e616473a.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[93],{467:function(t,e,a){"use strict";a.r(e);var o=a(26),n=Object(o.a)({},(function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h2",{attrs:{id:"plug-ins"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#plug-ins"}},[t._v("#")]),t._v(" Plug-Ins")]),t._v(" "),a("p",[t._v("Quartz provides an interface (ISchedulerPlugin) for plugging-in additional functionality.")]),t._v(" "),a("p",[t._v("Plugins that ship with Quartz to provide various utililty capabilities can be found documented in the Quartz.Plugins namespace.\nThey provide functionality such as auto-scheduling of jobs upon scheduler startup, logging a history of job and trigger events,\nand ensuring that the scheduler shuts down cleanly when the virtual machine exits.")]),t._v(" "),a("h2",{attrs:{id:"jobfactory"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#jobfactory"}},[t._v("#")]),t._v(" JobFactory")]),t._v(" "),a("p",[t._v("When a trigger fires, the Job it is associated to is instantiated via the JobFactory configured on the Scheduler.\nThe default JobFactory simply activates a new instance of the job class. You may want to create your own implementation\nof JobFactory to accomplish things such as having your application's IoC or DI container produce/initialize the job instance.")]),t._v(" "),a("p",[t._v("See the IJobFactory interface, and the associated Scheduler.SetJobFactory(fact) method.")]),t._v(" "),a("h2",{attrs:{id:"factory-shipped-jobs"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#factory-shipped-jobs"}},[t._v("#")]),t._v(" 'Factory-Shipped' Jobs")]),t._v(" "),a("p",[t._v("Quartz also provides a number of utility Jobs that you can use in your application for doing things like sending\ne-mails and invoking remote objects. These out-of-the-box Jobs can be found documented in the Quartz.Jobs namespace.")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/94.8b47a217.js b/assets/js/94.8b47a217.js
new file mode 100644
index 000000000..1f5b48b7f
--- /dev/null
+++ b/assets/js/94.8b47a217.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[94],{468:function(t,a,s){"use strict";s.r(a);var e=s(26),n=Object(e.a)({},(function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("As you saw in Lesson 2, jobs are rather easy to implement. There are just a few more things that you need to understand about\nthe nature of jobs, about the Execute(..) method of the IJob interface, and about JobDetails.")]),t._v(" "),s("p",[t._v("While a job class that you implement has the code that knows how to do the actual work\nof the particular type of job, Quartz.NET needs to be informed about various attributes\nthat you may wish an instance of that job to have. This is done via the JobDetail class,\nwhich was mentioned briefly in the previous section.")]),t._v(" "),s("p",[t._v("JobDetail instances are built using the JobBuilder class. JobBuilder allows you to describe\nyour job's details using a fluent interface.")]),t._v(" "),s("p",[t._v("Let's take a moment now to discuss a bit about the 'nature' of jobs and the life-cycle of job instances within Quartz.NET.\nFirst lets take a look back at some of that snippet of code we saw in Lesson 1:")]),t._v(" "),s("p",[s("strong",[t._v("Using Quartz.NET")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define the job and tie it to our HelloJob class")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobDetail")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" JobBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("HelloJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Trigger the job to run now, and then every 40 seconds")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartNow")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n\t "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInSeconds")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \nsched"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" trigger"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Now consider the job class "),s("strong",[t._v("HelloJob")]),t._v(" defined as such:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HelloJob")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\tConsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLine")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"HelloJob is executing."')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Notice that we give the scheduler a IJobDetail instance, and that it refers to the job to be executed by simply\nproviding the job's class. Each (and every) time the scheduler executes the job, it creates a new instance of the\nclass before calling its Execute(..) method. One of the ramifications of this behavior is the fact that jobs must\nhave a no-arguement constructor. Another ramification is that it does not make sense to have data-fields defined\non the job class - as their values would not be preserved between job executions.")]),t._v(" "),s("p",[t._v('You may now be wanting to ask "how can I provide properties/configuration for a Job instance?" and "how can I\nkeep track of a job\'s state between executions?" The answer to these questions are the same: the key is the JobDataMap,\nwhich is part of the JobDetail object.')]),t._v(" "),s("h2",{attrs:{id:"jobdatamap"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#jobdatamap"}},[t._v("#")]),t._v(" JobDataMap")]),t._v(" "),s("p",[t._v("The JobDataMap can be used to hold any number of (serializable) objects which you wish to have made available\nto the job instance when it executes. JobDataMap is an implementation of the IDictionary interface, and has\nsome added convenience methods for storing and retrieving data of primitive types.")]),t._v(" "),s("p",[t._v("Here's some quick snippets of putting data into the JobDataMap prior to adding the job to the scheduler:")]),t._v(" "),s("p",[s("strong",[t._v("Setting Values in a JobDataMap")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define the job and tie it to our DumbJob class")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobDetail")]),t._v(" job "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" JobBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("DumbJob"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// name "myJob", group "group1"')]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("UsingJobData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jobSays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Hello World!"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("UsingJobData")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myFloatValue"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.141f")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Here's a quick example of getting data from the JobDataMap during the job's execution:")]),t._v(" "),s("p",[s("strong",[t._v("Getting Values from a JobDataMap")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DumbJob")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobKey")]),t._v(" key "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobDataMap")]),t._v(" dataMap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" jobSays "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetString")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jobSays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("float")])]),t._v(" myFloatValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFloat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myFloatValue"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t Console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLine")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Instance "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" key "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('" of DumbJob says: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" jobSays "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('", and val is: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myFloatValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])])]),s("p",[t._v("If you use a persistent JobStore (discussed in the JobStore section of this tutorial) you should use some care\nin deciding what you place in the JobDataMap, because the object in it will be serialized, and they therefore\nbecome prone to class-versioning problems. Obviously standard .NET types should be very safe, but beyond that,\nany time someone changes the definition of a class for which you have serialized instances,\ncare has to be taken not to break compatibility.")]),t._v(" "),s("p",[t._v("Optionally, you can put AdoJobStore and JobDataMap into a mode where only primitives\nand strings can be stored in the map, thus eliminating any possibility of later serialization problems.")]),t._v(" "),s("p",[t._v("If you add properties with set accessor to your job class that correspond to the names of keys in the JobDataMap,\nthen Quartz's default JobFactory implementation will automatically call those setters when the job is instantiated,\nthus preventing the need to explicitly get the values out of the map within your execute method. Note this\nfunctionality is not maintained by default when using a custom JobFactory.")]),t._v(" "),s("p",[t._v("Triggers can also have JobDataMaps associated with them. This can be useful in the case where you have a Job that is stored in the scheduler\nfor regular/repeated use by multiple Triggers, yet with each independent triggering, you want to supply the Job with different data inputs.")]),t._v(" "),s("p",[t._v("The JobDataMap that is found on the JobExecutionContext during Job execution serves as a convenience. It is a merge of the JobDataMap\nfound on the JobDetail and the one found on the Trigger, with the values in the latter overriding any same-named values in the former.")]),t._v(" "),s("p",[t._v("Here's a quick example of getting data from the JobExecutionContext's merged JobDataMap during the job's execution:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DumbJob")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobKey")]),t._v(" key "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobDataMap")]),t._v(" dataMap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("MergedJobDataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Note the difference from the previous example")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" jobSays "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetString")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"jobSays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("float")])]),t._v(" myFloatValue "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFloat")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myFloatValue"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("DateTimeOffset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" state "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("IList"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("DateTimeOffset"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myStateData"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\tstate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Add")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateTimeOffset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\tConsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLine")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Instance "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" key "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('" of DumbJob says: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" jobSays "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('", and val is: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" myFloatValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v('Or if you wish to rely on the JobFactory "injecting" the data map values onto your class, it might look like this instead:')]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DumbJob")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJob")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" JobSays "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("float")])]),t._v(" FloatValue "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n \n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobKey")]),t._v(" key "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("JobDetail"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Key"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobDataMap")]),t._v(" dataMap "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" context"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("MergedJobDataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Note the difference from the previous example")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IList"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("DateTimeOffset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" state "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("IList"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("DateTimeOffset"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" dataMap"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myStateData"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\tstate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Add")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateTimeOffset"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("UtcNow"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\tConsole"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Error"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WriteLine")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Instance "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" key "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('" of DumbJob says: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" JobSays "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('", and val is: "')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" FloatValue"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("You'll notice that the overall code of the class is longer, but the code in the Execute() method is cleaner.\nOne could also argue that although the code is longer, that it actually took less coding, if the programmer's IDE was used to auto-generate the properties,\nrather than having to hand-code the individual calls to retrieve the values from the JobDataMap. The choice is yours.")]),t._v(" "),s("h2",{attrs:{id:"job-instances"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#job-instances"}},[t._v("#")]),t._v(' Job "Instances"')]),t._v(" "),s("p",[t._v('Many users spend time being confused about what exactly constitutes a "job instance".\nWe\'ll try to clear that up here and in the section below about job state and concurrency.')]),t._v(" "),s("p",[t._v("You can create a single job class, and store many 'instance definitions' of it within the scheduler by creating multiple instances of JobDetails")]),t._v(" "),s("ul",[s("li",[t._v("each with its own set of properties and JobDataMap - and adding them all to the scheduler.")])]),t._v(" "),s("p",[t._v('For example, you can create a class that implements the IJob interface called "SalesReportJob".\nThe job might be coded to expect parameters sent to it (via the JobDataMap) to specify the name of the sales person that the sales\nreport should be based on. They may then create multiple definitions (JobDetails) of the job, such as "SalesReportForJoe"\nand "SalesReportForMike" which have "joe" and "mike" specified in the corresponding JobDataMaps as input to the respective jobs.')]),t._v(" "),s("p",[t._v("When a trigger fires, the JobDetail (instance definition) it is associated to is loaded,\nand the job class it refers to is instantiated via the JobFactory configured on the Scheduler.\nThe default JobFactory simply calls the default constructor of the job class using Activator.CreateInstance,\nthen attempts to call setter properties on the class that match the names of keys within the JobDataMap.\nYou may want to create your own implementation of JobFactory to accomplish things such as having your application's IoC or DI container produce/initialize the job instance.")]),t._v(" "),s("p",[t._v('In "Quartz speak", we refer to each stored JobDetail as a "job definition" or "JobDetail instance",\nand we refer to a each executing job as a "job instance" or "instance of a job definition".\nUsually if we just use the word "job" we are referring to a named definition, or JobDetail.\nWhen we are referring to the class implementing the job interface, we usually use the term "job type".')]),t._v(" "),s("h2",{attrs:{id:"job-state-and-concurrency"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#job-state-and-concurrency"}},[t._v("#")]),t._v(" Job State and Concurrency")]),t._v(" "),s("p",[t._v("Now, some additional notes about a job's state data (aka JobDataMap) and concurrency.\nThere are a couple attributes that can be added to your Job class that affect Quartz's behaviour with respect to these aspects.")]),t._v(" "),s("p",[s("strong",[t._v("DisallowConcurrentExecution")]),t._v(' is an attribute that can be added to the Job class that tells Quartz not to execute multiple instances\nof a given job definition (that refers to the given job class) concurrently.\nNotice the wording there, as it was chosen very carefully. In the example from the previous section, if "SalesReportJob" has this attribute,\nthan only one instance of "SalesReportForJoe" can execute at a given time, but it can execute concurrently with an instance of "SalesReportForMike".\nThe constraint is based upon an instance definition (JobDetail), not on instances of the job class.\nHowever, it was decided (during the design of Quartz) to have the attribute carried on the class itself, because it does often make a difference to how the class is coded.')]),t._v(" "),s("p",[s("strong",[t._v("PersistJobDataAfterExecution")]),t._v(" is an attribute that can be added to the Job class that tells Quartz to update the stored copy of\nthe JobDetail's JobDataMap after the Execute() method completes successfully (without throwing an exception), such that the next\nexecution of the same job (JobDetail) receives the updated values rather than the originally stored values.\nLike the "),s("strong",[t._v("DisallowConcurrentExecution")]),t._v(" attribute, this applies to a job definition instance, not a job class instance,\nthough it was decided to have the job class carry the attribute because it does often make a difference to how the class is coded\n(e.g. the 'statefulness' will need to be explicitly 'understood' by the code within the execute method).")]),t._v(" "),s("p",[t._v("If you use the "),s("strong",[t._v("PersistJobDataAfterExecution")]),t._v(" attribute, you should strongly consider also using the "),s("strong",[t._v("DisallowConcurrentExecution")]),t._v(" attribute,\nin order to avoid possible confusion (race conditions) of what data was left stored when two instances of the same job (JobDetail) executed concurrently.")]),t._v(" "),s("h2",{attrs:{id:"other-attributes-of-jobs"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#other-attributes-of-jobs"}},[t._v("#")]),t._v(" Other Attributes Of Jobs")]),t._v(" "),s("p",[t._v("Here's a quick summary of the other properties which can be defined for a job instance via the JobDetail object:")]),t._v(" "),s("ul",[s("li",[s("strong",[t._v("Durability")]),t._v(" - if a job is non-durable, it is automatically deleted from the scheduler once there are no longer any active triggers associated with it.\nIn other words, non-durable jobs have a life span bounded by the existence of its triggers.")]),t._v(" "),s("li",[s("strong",[t._v("RequestsRecovery")]),t._v(" - if a job \"requests recovery\", and it is executing during the time of a 'hard shutdown' of the scheduler\n(i.e. the process it is running within crashes, or the machine is shut off), then it is re-executed when the scheduler is started again.\nIn this case, the JobExecutionContext.Recovering property will return true.")])]),t._v(" "),s("h2",{attrs:{id:"jobexecutionexception"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#jobexecutionexception"}},[t._v("#")]),t._v(" JobExecutionException")]),t._v(" "),s("p",[t._v("Finally, we need to inform you of a few details of the IJob.Execute(..) method. The only type of exception\nthat you should throw from the execute method is the JobExecutionException. Because of this, you should generally wrap the entire contents of the\nexecute method with a 'try-catch' block. You should also spend some time looking at the documentation for the JobExecutionException,\nas your job can use it to provide the scheduler various directives as to how you want the exception to be handled.")])])}),[],!1,null,null,null);a.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/95.487cae6e.js b/assets/js/95.487cae6e.js
new file mode 100644
index 000000000..097a5ac42
--- /dev/null
+++ b/assets/js/95.487cae6e.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[95],{469:function(t,e,s){"use strict";s.r(e);var a=s(26),n=Object(a.a)({},(function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("p",[t._v("Like jobs, triggers are relatively easy to work with, but do contain a variety of customizable options that you need to\nbe aware of and understand before you can make full use of Quartz.NET. Also, as noted earlier, there are different types of triggers,\nthat you can select to meet different scheduling needs.")]),t._v(" "),s("h2",{attrs:{id:"common-trigger-attributes"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#common-trigger-attributes"}},[t._v("#")]),t._v(" Common Trigger Attributes")]),t._v(" "),s("p",[t._v("Aside from the fact that all trigger types have TriggerKey properties for tracking their identities,\nthere are a number of other properties that are common to all trigger types. These common properties are set using the TriggerBuilder\nwhen you are building the trigger definition (examples of that will follow).")]),t._v(" "),s("p",[t._v("Here is a listing of properties common to all trigger types:")]),t._v(" "),s("ul",[s("li",[t._v("The "),s("strong",[t._v("JobKey")]),t._v(" property indicates the identity of the job that should be executed when the trigger fires.")]),t._v(" "),s("li",[t._v("The "),s("strong",[t._v("StartTimeUtc")]),t._v(' property indicates when the trigger\'s schedule first comes into affect.\nThe value is a DateTimeOffset object that defines a moment in time on a given calendar date.\nFor some trigger types, the trigger will actually fire at the start time, for others it simply marks the time that the schedule should start being followed.\nThis means you can store a trigger with a schedule such as "every 5th day of the month" during January, and if the StartTimeUtc property is set to April 1st,\nit will be a few months before the first firing.')]),t._v(" "),s("li",[t._v("The "),s("strong",[t._v("EndTimeUtc")]),t._v(" property indicates when the trigger's schedule should no longer be in effect.\nIn other words, a trigger with a schedule of \"every 5th day of the month\" and with an end time of July 1st will fire for it's last time on June 5th.")])]),t._v(" "),s("p",[t._v("Other properties, which take a bit more explanation are discussed in the following sub-sections.")]),t._v(" "),s("h2",{attrs:{id:"priority"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#priority"}},[t._v("#")]),t._v(" Priority")]),t._v(" "),s("p",[t._v("Sometimes, when you have many Triggers (or few worker threads in your Quartz.NET thread pool), Quartz.NET may not have enough resources to immediately fire all\nof the Triggers that are scheduled to fire at the same time. In this case, you may want to control which of your Triggers get first crack at the available Quartz.NET worker threads.\nFor this purpose, you can set the priority property on a Trigger. If N Triggers are to fire at the same time, but there are only Z worker threads currently available,\nthen the first Z Triggers with the highest priority will be executed first. If you do not set a priority on a Trigger, then it will use the default priority of 5.\nAny integer value is allowed for priority, positive or negative.")]),t._v(" "),s("p",[s("strong",[t._v("Note:")]),t._v(" Priorities are only compared when triggers have the same fire time. A trigger scheduled to fire at 10:59 will always fire before one scheduled to fire at 11:00.")]),t._v(" "),s("p",[s("strong",[t._v("Note:")]),t._v(" When a trigger's job is detected to require recovery, its recovery is scheduled with the same priority as the original trigger.")]),t._v(" "),s("h2",{attrs:{id:"misfire-instructions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#misfire-instructions"}},[t._v("#")]),t._v(" Misfire Instructions")]),t._v(" "),s("p",[t._v('Another important property of a Trigger is its "misfire instruction". A misfire occurs if a persistent trigger "misses" its firing time because of the scheduler being shutdown,\nor because there are no available threads in Quartz.NET\'s thread pool for executing the job.\nThe different trigger types have different misfire instructions available to them.\nBy default they use a \'smart policy\' instruction - which has dynamic behavior based on trigger type and configuration.\nWhen the scheduler starts, it searches for any persistent triggers that have misfired, and it then updates each of them based on their individually\nconfigured misfire instructions. When you start using Quartz.NET in your own projects, you should make yourself familiar with the misfire instructions\nthat are defined on the given trigger types, and explained in their API documentation. More specific information about misfire instructions will be given within\nthe tutorial lessons specific to each trigger type.')]),t._v(" "),s("h2",{attrs:{id:"calendars"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#calendars"}},[t._v("#")]),t._v(" Calendars")]),t._v(" "),s("p",[t._v("Quartz.NET Calendar objects implementing ICalendar interface can be associated with triggers at the time the trigger is stored in the scheduler.\nCalendars are useful for excluding blocks of time from the the trigger's firing schedule. For instance, you could\ncreate a trigger that fires a job every weekday at 9:30 am, but then add a Calendar that excludes all of the business's holidays.")]),t._v(" "),s("p",[t._v("Calendar's can be any serializable objects that implement the ICalendar interface, which looks like this:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("namespace")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token namespace"}},[t._v("Quartz")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ICalendar")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" Description "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("ICalendar")]),t._v(" CalendarBase "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("set")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("bool")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("IsTimeIncluded")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DateTimeOffset")]),t._v(" timeUtc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("DateTime")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetNextIncludedTimeUtc")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("DateTimeOffset")]),t._v(" timeUtc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])])]),s("p",[t._v("Even though calendars can 'block out' sections of time as narrow as a millisecond, most likely, you'll be interested in\n'blocking-out' entire days. As a convenience, Quartz.NET includes the class HolidayCalendar, which does just that.")]),t._v(" "),s("p",[t._v("Calendars must be instantiated and registered with the scheduler via the AddCalendar(..) method. If you use HolidayCalendar,\nafter instantiating it, you should use its AddExcludedDate(DateTime date) method in order to populate it with the days you wish\nto have excluded from scheduling. The same calendar instance can be used with multiple triggers such as this:")]),t._v(" "),s("p",[s("strong",[t._v("Calendar Example")])]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("HolidayCalendar")]),t._v(" cal "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("HolidayCalendar")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n cal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddExcludedDate")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("someDate"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n sched"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddCalendar")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myHolidays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" cal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" t "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSchedule")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("CronScheduleBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("DailyAtHourAndMinute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// execute job daily at 9:30")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ModifiedByCalendar")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myHolidays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// but not on holidays")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// .. schedule job with trigger")]),t._v("\n\n\t"),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" t2 "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSchedule")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("CronScheduleBuilder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("DailyAtHourAndMinute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("30")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// execute job daily at 11:30")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ModifiedByCalendar")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myHolidays"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// but not on holidays")]),t._v("\n\t\t"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// .. schedule job with trigger2 ")]),t._v("\n")])])]),s("p",[t._v("The details of the construction/building of triggers will be given in the next couple lessons.\nFor now, just believe that the code above creates two triggers, each scheduled to fire daily.\nHowever, any of the firings that would have occurred during the period excluded by the calendar will be skipped.")]),t._v(" "),s("p",[t._v("See the Quartz.Impl.Calendar namespace for a number of ICalendar implementations that may suit your needs.")])])}),[],!1,null,null,null);e.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/96.848a034e.js b/assets/js/96.848a034e.js
new file mode 100644
index 000000000..7ca37a4c7
--- /dev/null
+++ b/assets/js/96.848a034e.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[96],{470:function(s,t,a){"use strict";a.r(t);var e=a(26),n=Object(e.a)({},(function(){var s=this,t=s.$createElement,a=s._self._c||t;return a("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[a("p",[s._v("SchedulerListeners are much like ITriggerListeners and IJobListeners, except they receive notification of\nevents within the scheduler itself - not necessarily events related to a specific trigger or job.")]),s._v(" "),a("p",[s._v("Scheduler-related events include: the addition of a job/trigger, the removal of a job/trigger, a serious error\nwithin the scheduler, notification of the scheduler being shutdown, and others.")]),s._v(" "),a("p",[a("strong",[s._v("The ISchedulerListener Interface")])]),s._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("public")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("interface")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("ISchedulerListener")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("{")]),s._v("\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("JobScheduled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Trigger")]),s._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("JobUnscheduled")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerGroup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("TriggerFinalized")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("Trigger")]),s._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("TriggersPaused")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerGroup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("TriggersResumed")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" triggerGroup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("JobsPaused")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" jobName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" jobGroup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("JobsResumed")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" jobName"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" jobGroup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("SchedulerError")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("string")])]),s._v(" msg"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(",")]),s._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[s._v("SchedulerException")]),s._v(" cause"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[s._v("void")])]),s._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("SchedulerShutdown")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("}")]),s._v(" \n")])])]),a("p",[s._v("SchedulerListeners are registered with the scheduler's ListenerManager.\nSchedulerListeners can be virtually any object that implements the ISchedulerListener interface.")]),s._v(" "),a("p",[a("strong",[s._v("Adding a SchedulerListener:")])]),s._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[s._v("scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("ListenerManager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("AddSchedulerListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("mySchedListener"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])])]),a("p",[a("strong",[s._v("Removing a SchedulerListener:")])]),s._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[s._v("scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),s._v("ListenerManager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[s._v("RemoveSchedulerListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v("(")]),s._v("mySchedListener"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[s._v(";")]),s._v("\n")])])])])}),[],!1,null,null,null);t.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/97.d11e3968.js b/assets/js/97.d11e3968.js
new file mode 100644
index 000000000..952ef5092
--- /dev/null
+++ b/assets/js/97.d11e3968.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[97],{471:function(t,s,n){"use strict";n.r(s);var a=n(26),e=Object(a.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[t._v("SimpleTrigger should meet your scheduling needs if you need to have a job execute exactly once at a specific moment in time,\nor at a specific moment in time followed by repeats at a specific interval. Or plainer english, if you want the trigger to\nfire at exactly 11:23:54 AM on January 13, 2005, and then fire five more times, every ten seconds.")]),t._v(" "),n("p",[t._v("With this description, you may not find it surprising to find that the properties of a SimpleTrigger include: a start-time,\nand end-time, a repeat count, and a repeat interval. All of these properties are exactly what you'd expect them to be, with\nonly a couple special notes related to the end-time property.")]),t._v(" "),n("p",[t._v("The repeat count can be zero, a positive integer, or the constant value SimpleTrigger.RepeatIndefinitely.\nThe repeat interval property must be TimeSpan.Zero, or a positive TimeSpan value.\nNote that a repeat interval of zero will cause 'repeat count' firings of the trigger to happen concurrently\n(or as close to concurrently as the scheduler can manage).")]),t._v(" "),n("p",[t._v("If you're not already familiar with the DateTime class, you may find it helpful for computing your trigger fire-times,\ndepending on the startTimeUtc (or endTimeUtc) that you're trying to create.")]),t._v(" "),n("p",[t._v("The EndTimeUtc property (if it is specified) over-rides the repeat count property. This can be useful if you wish to create a trigger\nsuch as one that fires every 10 seconds until a given moment in time - rather than having to compute the number of times it would\nrepeat between the start-time and the end-time, you can simply specify the end-time and then use a repeat count of RepeatIndefinitely\n(you could even specify a repeat count of some huge number that is sure to be more than the number of times the trigger will actually\nfire before the end-time arrives).")]),t._v(" "),n("p",[t._v("SimpleTrigger instances are built using "),n("strong",[t._v("TriggerBuilder")]),t._v(" (for the trigger's main properties) and "),n("strong",[t._v("WithSimpleSchedule")]),t._v(" extension method (for the SimpleTrigger-specific properties).")]),t._v(" "),n("p",[n("strong",[t._v("Build a trigger for a specific moment in time, with no repeats:")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// trigger builder creates simple trigger by default, actually an ITrigger is returned")]),t._v("\n"),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ISimpleTrigger")]),t._v(" trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ISimpleTrigger"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myStartTime"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// some Date ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"job1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// identify job with name, group strings")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),n("p",[n("strong",[t._v("Build a trigger for a specific moment in time, then repeating every ten seconds ten times:")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[t._v("trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger3"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myTimeToStartFiring"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// if a start time is not given (if this line were omitted), "now" is implied')]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInSeconds")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithRepeatCount")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// note that 10 repeats will give a total of 11 firings")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJob"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// identify job with handle to its JobDetail itself ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n")])])]),n("p",[n("strong",[t._v("Build a trigger that will fire once, five minutes in the future:")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[t._v("trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("ISimpleTrigger"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger5"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("FutureDate")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" IntervalUnit"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Minute"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// use DateBuilder to create a date in the future")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ForJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobKey"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// identify job with its JobKey")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),n("p",[n("strong",[t._v("Build a trigger that will fire now, then repeat every five minutes, until the hour 22:00:")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[t._v("trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger7"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInMinutes")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("EndAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("DateOf")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),n("p",[n("strong",[t._v("Build a trigger that will fire at the top of the next hour, then repeat every 2 hours, forever:")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[t._v("trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger8"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// because group is not specified, "trigger8" will be in the default group')]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartAt")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("DateBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("EvenHourDate")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("null")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v('// get the next even-hour (minutes and seconds zero ("00:00"))')]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInHours")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// note that in this example, 'forJob(..)' is not called ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// - which is valid if the trigger is passed to the scheduler along with the job ")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\nscheduler"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("scheduleJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("trigger"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" job"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),n("p",[t._v("Spend some time looking at all of the available methods in the language defined by "),n("strong",[t._v("TriggerBuilder")]),t._v(" and its extension method "),n("strong",[t._v("WithSimpleSchedule")]),t._v(" so that you can be familiar with options available to you that may not have been demonstrated in the examples above.")]),t._v(" "),n("h2",{attrs:{id:"simpletrigger-misfire-instructions"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#simpletrigger-misfire-instructions"}},[t._v("#")]),t._v(" SimpleTrigger Misfire Instructions")]),t._v(" "),n("p",[t._v("SimpleTrigger has several instructions that can be used to inform Quartz.NET what it should do when a misfire occurs.\n(Misfire situations were introduced in the More About Triggers section of this tutorial).\nThese instructions are defined as constants on MisfirePolicy.SimpleTrigger (including API documentation describing their behavior).\nThe instructions include:")]),t._v(" "),n("p",[n("strong",[t._v("Misfire Instruction Constants for SimpleTrigger")])]),t._v(" "),n("ul",[n("li",[t._v("MisfireInstruction.IgnoreMisfirePolicy")]),t._v(" "),n("li",[t._v("MisfirePolicy.SimpleTrigger.FireNow")]),t._v(" "),n("li",[t._v("MisfirePolicy.SimpleTrigger.RescheduleNowWithExistingRepeatCount")]),t._v(" "),n("li",[t._v("MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount")]),t._v(" "),n("li",[t._v("MisfirePolicy.SimpleTrigger.RescheduleNextWithRemainingCount")]),t._v(" "),n("li",[t._v("MisfirePolicy.SimpleTrigger.RescheduleNextWithExistingCount")])]),t._v(" "),n("p",[t._v("You should recall from the earlier lessons that all triggers have the MisfirePolicy.SmartPolicy instruction available for use,\nand this instruction is also the default for all trigger types.")]),t._v(" "),n("p",[t._v("If the 'smart policy' instruction is used, SimpleTrigger dynamically chooses between its various MISFIRE instructions, based on the configuration\nand state of the given SimpleTrigger instance. The documentation for the SimpleTrigger.UpdateAfterMisfire() method explains the exact details of\nthis dynamic behavior.")]),t._v(" "),n("p",[t._v("When building SimpleTriggers, you specify the misfire instruction as part of the simple schedule (via SimpleSchedulerBuilder):")]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[t._v("trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"trigger7"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInMinutes")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithMisfireHandlingInstructionNextWithExistingCount")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/98.1252ce69.js b/assets/js/98.1252ce69.js
new file mode 100644
index 000000000..9feead0aa
--- /dev/null
+++ b/assets/js/98.1252ce69.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[98],{472:function(t,s,a){"use strict";a.r(s);var e=a(26),n=Object(e.a)({},(function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("p",[t._v("Listeners are objects that you create to perform actions based on events occuring within the scheduler.\nAs you can probably guess, TriggerListeners receive events related to triggers, and JobListeners receive events related to jobs.")]),t._v(" "),a("p",[t._v('Trigger-related events include: trigger firings, trigger mis-firings (discussed in the "Triggers" section of this document),\nand trigger completions (the jobs fired off by the trigger is finished).')]),t._v(" "),a("p",[a("strong",[t._v("The ITriggerListener Interface")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITriggerListener")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" Name "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\t \n\t "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("TriggerFired")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t \n\t "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("bool")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("VetoJobExecution")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t \n\t "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("TriggerMisfired")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t \n\t "),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("TriggerComplete")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("int")])]),t._v(" triggerInstructionCode"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),a("p",[t._v("Job-related events include: a notification that the job is about to be executed, and a notification when the job has completed execution.")]),t._v(" "),a("p",[a("strong",[t._v("The IJobListener Interface")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interface")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobListener")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" Name "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("JobToBeExecuted")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("JobExecutionVetoed")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),a("span",{pre:!0,attrs:{class:"token return-type class-name"}},[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("JobWasExecuted")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobExecutionContext")]),t._v(" context"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JobExecutionException")]),t._v(" jobException"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" \n")])])]),a("h2",{attrs:{id:"using-your-own-listeners"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#using-your-own-listeners"}},[t._v("#")]),t._v(" Using Your Own Listeners")]),t._v(" "),a("p",[t._v("To create a listener, simply create an object the implements either the ITriggerListener and/or IJobListener interface.\nListeners are then registered with the scheduler during run time, and must be given a name (or rather, they must advertise their own\nname via their Name property.")]),t._v(" "),a("p",[t._v("For your convenience, rather than implementing those interfaces, your class could also extend the class JobListenerSupport or TriggerListenerSupport\nand simply override the events you're interested in.")]),t._v(" "),a("p",[t._v("Listeners are registered with the scheduler's ListenerManager along with a Matcher that describes which Jobs/Triggers the listener wants to receive events for.")]),t._v(" "),a("p",[a("em",[t._v("Listeners are registered with the scheduler during run time, and are NOT stored in the JobStore along with the jobs and triggers.\nThis is because listeners are typically an integration point with your application.\nHence, each time your application runs, the listeners need to be re-registered with the scheduler.")])]),t._v(" "),a("p",[a("strong",[t._v("Adding a JobListener that is interested in a particular job:")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[t._v("scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ListenerManager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddJobListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobListener"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" KeyMatcher"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("JobKey"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("KeyEquals")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("JobKey")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJobName"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJobGroup"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Adding a JobListener that is interested in all jobs of a particular group:")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[t._v("scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ListenerManager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddJobListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobListener"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" GroupMatcher"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("JobKey"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GroupEquals")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJobGroup"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Adding a JobListener that is interested in all jobs of two particular groups:")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[t._v("scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ListenerManager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddJobListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobListener"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n\tOrMatcher"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("JobKey"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("Or")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("GroupMatcher"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("JobKey"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GroupEquals")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJobGroup"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" GroupMatcher"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("JobKey"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("GroupEquals")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"yourGroup"')]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[a("strong",[t._v("Adding a JobListener that is interested in all jobs:")])]),t._v(" "),a("div",{staticClass:"language-csharp extra-class"},[a("pre",{pre:!0,attrs:{class:"language-csharp"}},[a("code",[t._v("scheduler"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ListenerManager"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddJobListener")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("myJobListener"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" GroupMatcher"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("JobKey"),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("AnyGroup")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),a("p",[t._v("Listeners are not used by most users of Quartz.NET, but are handy when application requirements create the need\nfor the notification of events, without the Job itself explicitly notifying the application.")])])}),[],!1,null,null,null);s.default=n.exports}}]);
\ No newline at end of file
diff --git a/assets/js/99.f28f8a22.js b/assets/js/99.f28f8a22.js
new file mode 100644
index 000000000..9d668ccc8
--- /dev/null
+++ b/assets/js/99.f28f8a22.js
@@ -0,0 +1 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[99],{473:function(t,s,n){"use strict";n.r(s);var a=n(26),e=Object(a.a)({},(function(){var t=this,s=t.$createElement,n=t._self._c||s;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("p",[t._v("Before you can use the scheduler, it needs to be instantiated (who'd have guessed?).\nTo do this, you use an implementor of ISchedulerFactory.")]),t._v(" "),n("p",[t._v("Once a scheduler is instantiated, it can be started, placed in stand-by mode, and shutdown.\nNote that once a scheduler is shutdown, it cannot be restarted without being re-instantiated.\nTriggers do not fire (jobs do not execute) until the scheduler has been started, nor while it is\nin the paused state.")]),t._v(" "),n("p",[t._v("Here's a quick snippet of code, that instantiates and starts a scheduler, and schedules a job for execution:")]),t._v(" "),n("p",[n("strong",[t._v("Using Quartz.NET")])]),t._v(" "),n("div",{staticClass:"language-csharp extra-class"},[n("pre",{pre:!0,attrs:{class:"language-csharp"}},[n("code",[t._v(" "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// construct a scheduler factory")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ISchedulerFactory")]),t._v(" schedFact "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("StdSchedulerFactory")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n "),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// get a scheduler")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IScheduler")]),t._v(" sched "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" schedFact"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetScheduler")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n sched"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Start")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \n\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// define the job and tie it to our HelloJob class")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IJobDetail")]),t._v(" job "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" JobBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token generic-method"}},[n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token generic class-name"}},[n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("HelloJob"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myJob"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\t\t"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),n("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Trigger the job to run now, and then every 40 seconds")]),t._v("\n\t"),n("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ITrigger")]),t._v(" trigger "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" TriggerBuilder"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Create")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIdentity")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"myTrigger"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),n("span",{pre:!0,attrs:{class:"token string"}},[t._v('"group1"')]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("StartNow")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithSimpleSchedule")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("x "),n("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" x\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("WithIntervalInSeconds")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token number"}},[t._v("40")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("RepeatForever")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("Build")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t \n sched"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),n("span",{pre:!0,attrs:{class:"token function"}},[t._v("ScheduleJob")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("job"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" trigger"),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),n("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),n("p",[t._v("As you can see, working with Quartz.NET is rather simple. In "),n("RouterLink",{attrs:{to:"/documentation/quartz-2.x/tutorial/jobs-and-triggers.html"}},[t._v("Lesson 2")]),t._v(" we'll give a quick overview of Jobs and Triggers, so that you can more fully understand this example.")],1)])}),[],!1,null,null,null);s.default=e.exports}}]);
\ No newline at end of file
diff --git a/assets/js/app.78225083.js b/assets/js/app.78225083.js
new file mode 100644
index 000000000..e28294908
--- /dev/null
+++ b/assets/js/app.78225083.js
@@ -0,0 +1,8 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(t){function e(e){for(var r,i,u=e[0],s=e[1],l=e[2],f=0,d=[];f=n.length?{value:void 0,done:!0}:(t=r(n,a),e.index+=t.length,{value:t,done:!1})}))},function(t,e,n){var r=n(6),a=n(8),o=n(33);t.exports=r?function(t,e,n){return a.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(57),a=Math.min;t.exports=function(t){return t>0?a(r(t),9007199254740991):0}},function(t,e,n){var r=n(37),a=n(21);t.exports=function(t){return r(a(t))}},function(t,e,n){var r=n(3),a=n(131),o=n(102),i=n(13),u=n(2),s=u("iterator"),l=u("toStringTag"),c=o.values;for(var f in a){var d=r[f],p=d&&d.prototype;if(p){if(p[s]!==c)try{i(p,s,c)}catch(t){p[s]=c}if(p[l]||i(p,l,f),a[f])for(var h in o)if(p[h]!==o[h])try{i(p,h,o[h])}catch(t){p[h]=o[h]}}}},function(t,e){var n=Array.isArray;t.exports=n},function(t,e,n){var r=n(142),a="object"==typeof self&&self&&self.Object===Object&&self,o=r||a||Function("return this")();t.exports=o},function(t,e,n){var r=n(112),a=n(3),o=function(t){return"function"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?o(r[t])||o(a[t]):r[t]&&r[t][e]||a[t]&&a[t][e]}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t}},function(t,e){t.exports=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t}},function(t,e){t.exports=!1},function(t,e,n){var r=n(6),a=n(83),o=n(33),i=n(15),u=n(38),s=n(7),l=n(111),c=Object.getOwnPropertyDescriptor;e.f=r?c:function(t,e){if(t=i(t),e=u(e,!0),l)try{return c(t,e)}catch(t){}if(s(t,e))return o(!a.f.call(t,e),t[e])}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(232),a=n(235);t.exports=function(t,e){var n=a(t,e);return r(n)?n:void 0}},function(t,e,n){"use strict";function r(t,e,n,r,a,o,i,u){var s,l="function"==typeof t?t.options:t;if(e&&(l.render=e,l.staticRenderFns=n,l._compiled=!0),r&&(l.functional=!0),o&&(l._scopeId="data-v-"+o),i?(s=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),a&&a.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(i)},l._ssrRegister=s):a&&(s=u?function(){a.call(this,(l.functional?this.parent:this).$root.$options.shadowRoot)}:a),s)if(l.functional){l._injectStyles=s;var c=l.render;l.render=function(t,e){return s.call(e),c(t,e)}}else{var f=l.beforeCreate;l.beforeCreate=f?[].concat(f,s):[s]}return{exports:t,options:l}}n.d(e,"a",(function(){return r}))},function(t,e,n){"use strict";var r=n(0),a=n(34).filter;r({target:"Array",proto:!0,forced:!n(60)("filter")},{filter:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0)}})},function(t,e,n){var r,a=n(5),o=n(171),i=n(81),u=n(41),s=n(116),l=n(77),c=n(58),f=c("IE_PROTO"),d=function(){},p=function(t){return"
+
+
+
+
+
+
+
+
+
+
+
+
+