问题描述
在我的例子中,我使用 Run()
方法将消息排入队列。第一次触发作业后,每隔一段时间就会启动另一个实例,并且它们会继续协同工作。如果有活动实例,如何防止新实例启动?这是一个 .netcore 3.1 项目。我尝试了 Quartz 3.2.0 和 3.2.4。这是作业调度、JobFactory 和作业,按顺序排列。
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Quartz;
using Quartz.Impl;
using Quartz.Spi;
using System.Collections.Specialized;
using System.Threading;
using System.Threading.Tasks;
using WinSchedulerLib;
namespace MessageSender.WinService
{
public class MessageSenderService : IHostedService
{
public static IScheduler scheduler;
public static IJobFactory jobFactory;
public async Task StartAsync(CancellationToken cancellationToken)
{
var props = new NameValueCollection { { "quartz.serializer.type","binary" } };
var factory = new StdSchedulerFactory(props);
var scheduler = await factory.GetScheduler();
var services = new ServiceCollection().AddScoped<IJob,MessageSenderJob>();
var serviceProvider = services.BuildServiceProvider();
jobFactory = new JobFactory(serviceProvider);
scheduler.JobFactory = jobFactory;
await scheduler.Start();
await scheduler.ScheduleJob(
JobBuilder
.Create<IJob>()
.WithIdentity("SenderJob","SenderGroup")
.Build(),TriggerBuilder
.Create()
.WithIdentity("SenderJob","SenderGroup")
.StartNow()
.WithCronSchedule("0 */10 * ? * *")
.Build());
await Task.Delay(1000);
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
}
using Quartz;
using Quartz.Spi;
using System;
namespace WinSchedulerLib
{
public class JobFactory : IJobFactory
{
protected readonly IServiceProvider _serviceProvider;
public JobFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public IJob NewJob(TriggerFiredBundle bundle,IScheduler scheduler)
{
return _serviceProvider.GetService(bundle.JobDetail.JobType) as IJob;
}
public void ReturnJob(IJob job)
{
var obj = job as Idisposable;
obj?.dispose();
}
}
}
using Quartz;
using System.Threading.Tasks;
namespace MessageSender.WinService
{
[disallowConcurrentExecution]
public class MessageSenderJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
var sender = new DefaultServiceBusSender();
await sender.Run();
}
}
}
解决方法
换行
var services = new ServiceCollection().AddScoped<IJob,MessageSenderJob>();
await scheduler.ScheduleJob(
JobBuilder
.Create<IJob>()
.WithIdentity("SenderJob","SenderGroup")
.Build(),TriggerBuilder
.Create()
.WithIdentity("SenderJob","SenderGroup")
.StartNow()
.WithCronSchedule("0 */10 * ? * *")
.Build());
到
var services = new ServiceCollection().AddScoped<MessageSenderJob>();
await scheduler.ScheduleJob(
JobBuilder
.Create<MessageSenderJob>()
.WithIdentity("SenderJob","SenderGroup")
.StartNow()
.WithCronSchedule("0 */10 * ? * *")
.Build());
解决了。