1
0
mirror of https://github.com/bitwarden/server.git synced 2025-02-02 23:41:21 +01: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
{
private readonly GlobalSettings _globalSettings;
public JobsHostedService(
GlobalSettings globalSettings,
IServiceProvider serviceProvider,
ILogger<JobsHostedService> logger,
ILogger<JobListener> listenerLogger)
: base(serviceProvider, logger, listenerLogger)
{
_globalSettings = globalSettings;
}
: base(globalSettings, serviceProvider, logger, listenerLogger) { }
public override async Task StartAsync(CancellationToken cancellationToken)
{

View File

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

View File

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

View File

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

View File

@ -18,8 +18,10 @@ namespace Bit.Core.Jobs
protected readonly ILogger _logger;
private IScheduler _scheduler;
protected GlobalSettings _globalSettings;
public BaseJobsHostedService(
GlobalSettings globalSettings,
IServiceProvider serviceProvider,
ILogger logger,
ILogger<JobListener> listenerLogger)
@ -27,16 +29,34 @@ namespace Bit.Core.Jobs
_serviceProvider = serviceProvider;
_logger = logger;
_listenerLogger = listenerLogger;
_globalSettings = globalSettings;
}
public IEnumerable<Tuple<Type, ITrigger>> Jobs { get; protected set; }
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.JobFactory = new JobFactory(_serviceProvider);
_scheduler.ListenerManager.AddJobListener(new JobListener(_listenerLogger),

View File

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