Quartz IJob 被解雇,尽管一个活跃的人正在工作

问题描述

在我的例子中,我使用 Run() 方法将消息排入队列。第一次触发作业后,每隔一段时间就会启动另一个实例,并且它们会继续协同工作。如果有活动实例,如何防止新实例启动?这是一个 .netcore 3.1 项目。我尝试了 Quartz 3.2.03.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());

解决了。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...