Quartz.net多线程和线程安全

我最近开始使用quartz.net,但对线程安全性有疑问。

public class QuartzService
    {
        public async Task Start()
        {
            // construct a scheduler factory
            NameValueCollection props = new NameValueCollection
            {
                { "quartz.serializer.type","binary" }
            };
            StdSchedulerFactory factory = new StdSchedulerFactory(props);

            // get a scheduler
            IScheduler sched = await factory.GetScheduler();

            // define the job and tie it to our HelloJob class
            IJobDetail job = JobBuilder.Create<TestJob>().StoreDurably()
                .WithIdentity("myJob","jobGroup1")
                .Build();

            await sched.AddJob(job,true);

            // Trigger the job to run now,and then every 40 seconds
            ITrigger trigger1 = TriggerBuilder.Create()
                .WithIdentity("myTrigger1","group1")
                .StartNow()
                .WithSimpleSchedule(x => x
                    .WithIntervalInSeconds(5)
                    .RepeatForever())
                .ForJob(job)
                .Build();

            // Trigger the job to run now,and then every 40 seconds
            ITrigger trigger2 = TriggerBuilder.Create()
                .WithIdentity("myTrigger2","group1")
                .StartNow()
                .WithSimpleSchedule(x => x
                    .WithIntervalInSeconds(5)
                    .RepeatForever())
                .ForJob(job)
                .Build();

            await sched.ScheduleJob(trigger1);
            await sched.ScheduleJob(trigger2);

            await sched.Start();
        }
    }



 public class TestJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            await Console.Out.WriteLineAsync($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
        }
    }

在上面的示例中,我有一个包含两个触发器的作业。我的问题是两个触发器在运行时是否共享相同的作业实例?或每次触发器运行时,都会创建一个新的IJobDetail实例。我已经尝试阅读了quartz.net的文档,但由于将JobDetail实例与作业实例混合在一起,这非常令人困惑,我对这里的情况还不太清楚。

cooperboss 回答:Quartz.net多线程和线程安全

使用默认作业工厂SimpleJobFactory,将为每个作业调用创建具有给定作业类型(CLR类型)的新对象实例。默认情况下,触发器永远不会共享CLR意义上的作业对象实例。

但是,可以创建一个自定义的作业工厂,该工厂可以从控制容器的反转中返回单例。

关于工作类型也有区别。 JobDetails描述了一种作业类型,多个触发器可以指向相同的详细信息(并因此指向相同的Type)。这导致以下事实:如果未应用PreventConcurrentExecutionAttribute的作业可以同时运行多个 CLR类型相同的作业。为了使事情有趣,PreventConcurrentExecutionAttribute适用于作业详细信息,因此可以再次运行两个不同的作业详细信息(不同的作业密钥),但相同的类型。

本文链接:https://www.f2er.com/3161486.html

大家都在问