1
0
mirror of https://github.com/bitwarden/server.git synced 2025-04-07 05:58:13 -05:00

Run Quartz in clustered mode (#1123)

This commit is contained in:
Oscar Hinton 2021-02-12 13:49:11 +01:00 committed by GitHub
parent 61ee3f1e45
commit 979eb4a842
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 41 additions and 16 deletions

View File

@ -13,17 +13,12 @@ namespace Bit.Admin.Jobs
{ {
public class JobsHostedService : BaseJobsHostedService public class JobsHostedService : BaseJobsHostedService
{ {
private readonly GlobalSettings _globalSettings;
public JobsHostedService( public JobsHostedService(
GlobalSettings globalSettings, GlobalSettings globalSettings,
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
ILogger<JobsHostedService> logger, ILogger<JobsHostedService> logger,
ILogger<JobListener> listenerLogger) ILogger<JobListener> listenerLogger)
: base(serviceProvider, logger, listenerLogger) : base(globalSettings, serviceProvider, logger, listenerLogger) { }
{
_globalSettings = globalSettings;
}
public override async Task StartAsync(CancellationToken cancellationToken) public override async Task StartAsync(CancellationToken cancellationToken)
{ {

View File

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Bit.Core;
using Bit.Core.Jobs; using Bit.Core.Jobs;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -12,10 +13,11 @@ namespace Bit.Api.Jobs
public class JobsHostedService : BaseJobsHostedService public class JobsHostedService : BaseJobsHostedService
{ {
public JobsHostedService( public JobsHostedService(
GlobalSettings globalSettings,
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
ILogger<JobsHostedService> logger, ILogger<JobsHostedService> logger,
ILogger<JobListener> listenerLogger) ILogger<JobListener> listenerLogger)
: base(serviceProvider, logger, listenerLogger) { } : base(globalSettings, serviceProvider, logger, listenerLogger) { }
public override async Task StartAsync(CancellationToken cancellationToken) public override async Task StartAsync(CancellationToken cancellationToken)
{ {

View File

@ -13,16 +13,12 @@ namespace Bit.Billing.Jobs
{ {
public class JobsHostedService : BaseJobsHostedService public class JobsHostedService : BaseJobsHostedService
{ {
private readonly GlobalSettings _globalSettings;
public JobsHostedService( public JobsHostedService(
GlobalSettings globalSettings, GlobalSettings globalSettings,
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
ILogger<JobsHostedService> logger, ILogger<JobsHostedService> logger,
ILogger<JobListener> listenerLogger) ILogger<JobListener> listenerLogger)
: base(serviceProvider, logger, listenerLogger) { : base(globalSettings, serviceProvider, logger, listenerLogger) {}
_globalSettings = globalSettings;
}
public override async Task StartAsync(CancellationToken cancellationToken) public override async Task StartAsync(CancellationToken cancellationToken)
{ {

View File

@ -67,6 +67,7 @@ namespace Bit.Core
{ {
private string _connectionString; private string _connectionString;
private string _readOnlyConnectionString; private string _readOnlyConnectionString;
private string _jobSchedulerConnectionString;
public string ConnectionString public string ConnectionString
{ {
@ -86,6 +87,15 @@ namespace Bit.Core
_readOnlyConnectionString = value.Trim('"'); _readOnlyConnectionString = value.Trim('"');
} }
} }
public string JobSchedulerConnectionString
{
get => _jobSchedulerConnectionString;
set
{
_jobSchedulerConnectionString = value.Trim('"');
}
}
} }
public class ConnectionStringSettings public class ConnectionStringSettings

View File

@ -18,8 +18,10 @@ namespace Bit.Core.Jobs
protected readonly ILogger _logger; protected readonly ILogger _logger;
private IScheduler _scheduler; private IScheduler _scheduler;
protected GlobalSettings _globalSettings;
public BaseJobsHostedService( public BaseJobsHostedService(
GlobalSettings globalSettings,
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
ILogger logger, ILogger logger,
ILogger<JobListener> listenerLogger) ILogger<JobListener> listenerLogger)
@ -27,16 +29,34 @@ namespace Bit.Core.Jobs
_serviceProvider = serviceProvider; _serviceProvider = serviceProvider;
_logger = logger; _logger = logger;
_listenerLogger = listenerLogger; _listenerLogger = listenerLogger;
_globalSettings = globalSettings;
} }
public IEnumerable<Tuple<Type, ITrigger>> Jobs { get; protected set; } public IEnumerable<Tuple<Type, ITrigger>> Jobs { get; protected set; }
public virtual async Task StartAsync(CancellationToken cancellationToken) public virtual async Task StartAsync(CancellationToken cancellationToken)
{ {
var factory = new StdSchedulerFactory(new NameValueCollection var props = new NameValueCollection
{ {
{ "quartz.serializer.type", "binary" } {"quartz.serializer.type", "binary"},
}); };
if (!string.IsNullOrEmpty(_globalSettings.SqlServer.JobSchedulerConnectionString))
{
// Ensure each project has a unique instanceName
props.Add("quartz.scheduler.instanceName", GetType().FullName);
props.Add("quartz.scheduler.instanceId", "AUTO");
props.Add("quartz.jobStore.type", "Quartz.Impl.AdoJobStore.JobStoreTX");
props.Add("quartz.jobStore.driverDelegateType", "Quartz.Impl.AdoJobStore.SqlServerDelegate");
props.Add("quartz.jobStore.useProperties", "true");
props.Add("quartz.jobStore.dataSource", "default");
props.Add("quartz.jobStore.tablePrefix", "QRTZ_");
props.Add("quartz.jobStore.clustered", "true");
props.Add("quartz.dataSource.default.provider", "SqlServer");
props.Add("quartz.dataSource.default.connectionString", _globalSettings.SqlServer.JobSchedulerConnectionString);
}
var factory = new StdSchedulerFactory(props);
_scheduler = await factory.GetScheduler(cancellationToken); _scheduler = await factory.GetScheduler(cancellationToken);
_scheduler.JobFactory = new JobFactory(_serviceProvider); _scheduler.JobFactory = new JobFactory(_serviceProvider);
_scheduler.ListenerManager.AddJobListener(new JobListener(_listenerLogger), _scheduler.ListenerManager.AddJobListener(new JobListener(_listenerLogger),

View File

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Bit.Core;
using Bit.Core.Jobs; using Bit.Core.Jobs;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@ -12,10 +13,11 @@ namespace Bit.Notifications.Jobs
public class JobsHostedService : BaseJobsHostedService public class JobsHostedService : BaseJobsHostedService
{ {
public JobsHostedService( public JobsHostedService(
GlobalSettings globalSettings,
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
ILogger<JobsHostedService> logger, ILogger<JobsHostedService> logger,
ILogger<JobListener> listenerLogger) ILogger<JobListener> listenerLogger)
: base(serviceProvider, logger, listenerLogger) { } : base(globalSettings, serviceProvider, logger, listenerLogger) { }
public override async Task StartAsync(CancellationToken cancellationToken) public override async Task StartAsync(CancellationToken cancellationToken)
{ {