c# - Quartz.net 3 触发器触发另一个工作
问题描述
我正在将quartz.net 3.0.7 设置到我的.net core 2.2 应用程序中。如果我在“服务”中添加了一个工作,那么一切都会完美无缺。但是,当我添加第二份工作时。第一份工作的触发以某种方式触发了第二份工作。
我的石英扩展方法:
public static void AddQuartz(this IServiceCollection services, string configuration)
{
services.AddSingleton<IJobFactory, ScheduledJobFactory>();
var properties = new NameValueCollection
{
["quartz.serializer.type"] = "json",
["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",
["quartz.jobStore.useProperties"] = "false",
["quartz.jobStore.dataSource"] = "sqlserver",
["quartz.jobStore.tablePrefix"] = "QRTZ_",
["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz",
//["quartz.dataSource.sqlserver.provider"] = "SqlServer-41", // SqlServer-41 is the new provider for .NET Core
["quartz.dataSource.sqlserver.provider"] = "SqlServer",
["quartz.dataSource.sqlserver.connectionString"] = configuration
};
services.AddSingleton<IScheduler>(provider =>
{
var schedulerFactory = new StdSchedulerFactory(properties);
var scheduler = schedulerFactory.GetScheduler().Result;
scheduler.JobFactory = provider.GetService<IJobFactory>();
//scheduler.ScheduleJob(JobTrigger);
return scheduler;
});
}
public static void AddJob(this IServiceCollection services, Type job)
{
services.Add(new ServiceDescriptor(typeof(IJob), job, ServiceLifetime.Singleton));
}
public static void StartRepetitiveJob<TJob>(this IScheduler scheduler, TimeSpan runInterval, DateTimeOffset startWhen) where TJob : IJob
{
var jobName = typeof(TJob).FullName;
var job = JobBuilder.Create<TJob>()
.WithIdentity(jobName,jobName)
.StoreDurably()
.Build();
var trigger = TriggerBuilder.Create()
.WithIdentity($"{jobName}.trigger", $"{jobName}.trigger")
.StartAt(startWhen)
.WithSimpleSchedule(scheduleBuilder =>
scheduleBuilder
.WithInterval(runInterval)
.RepeatForever())
.ForJob(job)
.Build();
scheduler.ScheduleJob(job, trigger);
}
public static void FireJobOnlyOnce<TJob>(this IScheduler scheduler, DateTime fireat, IDictionary<string, object> dictionary) where TJob : IJob
{
var jobName = typeof(TJob).FullName;
var jobDataMap = new JobDataMap(dictionary);
var job = JobBuilder.Create<TJob>()
.WithIdentity(jobName,jobName)
//.WithIdentity(jobName, Guid.NewGuid().ToString())
.SetJobData(jobDataMap)
.StoreDurably()
.Build();
var trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity($"{jobName}.trigger", $"{jobName}.trigger")
.StartAt(fireat.ToUniversalTime())
.UsingJobData(jobDataMap)
.ForJob(job)
.Build();
scheduler.ScheduleJob(job, trigger);
}
在startup.cs中:
services.AddQuartz(Configuration.GetConnectionString("DefaultConnection"));
services.AddJob(typeof(CheckPropertyListingJob));
services.AddJob(typeof(ScheduledGetPropertyDataJob));
在program.cs中:
DateTime dt = DateTime.UtcNow;
TimeSpan interval = TimeSpan.FromHours(6);
scheduler.StartRepetitiveJob<CheckPropertyListingJob>(interval, new DateTimeOffset(dt.Add(TimeSpan.FromMinutes(2)), TimeSpan.Zero));
所以,当我只添加 时CheckPropertyListingJob
,一切都很好。但是,当我以ScheduledGetPropertyDataJob
某种方式添加创建的触发器时,CheckPropertyListingJob
会触发其他工作。
解决方案
好吧,我终于解决了这个问题。我在一个只有一份工作的教程之后开始实施石英。所以我的 ScheduledJobFactory 看起来像这样:
public class ScheduledJobFactory: IJobFactory
{
private readonly IServiceProvider serviceProvider;
public ScheduledJobFactory(IServiceProvider serviceProvider)
{
this.serviceProvider = serviceProvider;
}
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return serviceProvider.GetService(typeof(IJob)) as IJob;
}
public void ReturnJob(IJob job)
{
var disposable = job as IDisposable;
disposable?.Dispose();
}
}
我根据这个答案编辑了 NewJob 方法,一切都很好。我不敢相信我会如此不注意。
return (IJob)serviceProvider.GetService(bundle.JobDetail.JobType);
推荐阅读
- asp.net-mvc - 使用页面处理程序部分页面 .net 核心发布表单
- sql - SQL Aggregation with rolling window
- sql - Are there ways to do something like "case when value in table" in AS400 DB2 SQL?
- python - R-Shiny 调试模式
- python - Aggregate dataframe across multiple columns
- javascript - 在 TypeScript 和 MongoDB 中仅获取没有时间的日期
- python - 使用 groupby 和 mean 后绘图需要时间
- flutter - 如何让 SliverPersistentHeader 长满?
- winforms - 如何更改 devexpress gridview 上显示的行数?
- java - 嵌入式 JavaFX、注入视图和 Dagger 2