JobStore implementation for Quartz.NET scheduler using RavenDB.
Quartz.NET is a full-featured, open source job scheduling system that can be used from smallest apps to large scale enterprise systems.
Quartz.NET on RavenDB is a new provider written for Quartz.NET which lets us use the RavenDB NoSQL database as the persistent Job Store for scheduling data (instead of the SQL solutions that are built-in Quartz.NET).
First add scheduling to your app using Quartz.NET (example). Then install the NuGet package.
In your code, where you would have normally configured Quartz to use a persistent job store, you must add the following configuration properties:
// In your application where you want to setup the scheduler:
NameValueCollection properties = new NameValueCollection
{
// Normal scheduler properties
["quartz.scheduler.instanceName"] = "TestScheduler",
["quartz.scheduler.instanceId"] = "instance_one",
["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz",
["quartz.threadPool.threadCount"] = "1",
["quartz.threadPool.threadPriority"] = "Normal",
// RavenDB JobStore property
["quartz.jobStore.type"] = "Quartz.Impl.RavenDB.RavenJobStore, Quartz.Impl.RavenDB"
// RavenDB Default Database name
["quartz.jobStore.database"] = "QuartzDemo",
// One or more URLs to database server
["quartz.jobStore.urls"] = "[\"http://live-test.ravendb.net\"]",
// If you use authentication, specify certificate and password
//["quartz.jobStore.certPath"] = "My/Cert/path.pfx",
//["quartz.jobStore.certPass"] = "SuperSecret",
};
// Init scheduler with the desired configuration properties
ISchedulerFactory sf = new StdSchedulerFactory(properties);
IScheduler scheduler = sf.GetScheduler();
For use in .NET Core Workers or ASP.NET Core use the recommended Fluent API when setting up a Quartz in ConfigureServices
like:
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.Build();
var section = configuration.GetSection("MyService");
var config = section.Get<MyServiceConfig>();
services.AddQuartz(q =>
{
q.UseMicrosoftDependencyInjectionJobFactory();
q.UseDefaultThreadPool(tp =>
{
tp.MaxConcurrency = 10;
});
q.UsePersistentStore(s =>
{
s.UseRavenDb(options =>
{
options.Urls = config.QuartzRavenStore.Urls;
options.Database = config.QuartzRavenStore.DatabaseName;
// specify certificate, if necessary
});
s.UseJsonSerializer();
});
// Add jobs and triggers as you wish
}
);
services.AddQuartzHostedService(
q => q.WaitForJobsToComplete = true);