【问题标题】:Quartz IJob is fired despite an active one is workingQuartz IJob 被解雇,尽管一个活跃的工作正在工作
【发布时间】:2021-05-20 13:44:49
【问题描述】:

在我的情况下,我正在使用Run() 方法将消息排入队列。在第一次触发作业后,每个时间间隔都会启动另一个实例,并且它们继续一起工作。如果有活动实例,如何防止新实例启动?这是一个 .netcore 3.1 项目。我尝试使用 Quartz 3.2.03.2.4。这是作业调度JobFactoryJob,依次排列。

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();
        }
    }
}

【问题讨论】:

标签: c# .net-core quartz.net .net-core-3.1


【解决方案1】:

换行

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")
        .Build(),
    TriggerBuilder
        .Create()
        .WithIdentity("SenderJob", "SenderGroup")
        .StartNow()
        .WithCronSchedule("0 */10 * ? * *")
        .Build());

解决了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-26
    • 2019-01-14
    • 2021-08-15
    • 2021-01-09
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多