使用Topshelf执行多个Quartz.NET作业

Cit*_*rus 6 c# quartz-scheduler quartz.net topshelf

我试图使用C#在Quartz.NET和Topshelf上运行多个作业.

HostFactory.Run(c =>
{
    c.ScheduleQuartzJobAsService(q =>
        q.WithJob(() => JobBuilder.Create<TypeA>().Build())
        .AddTrigger(() => TriggerBuilder.Create().WithSimpleSchedule(builder => builder.WithIntervalInSeconds(ConfigurationSettings.AppFrequencyInSeconds).RepeatForever()).Build())
        ).StartAutomatically().
        ScheduleQuartzJobAsService(r => 
        r.WithJob(() => JobBuilder.Create<TypeB>().Build())
        .AddTrigger(() => TriggerBuilder.Create().WithSimpleSchedule(builder => builder.
            WithIntervalInSeconds(ConfigurationSettings.AppFrequencyInSeconds).RepeatForever()).Build())
            ).StartAutomatically();
    c.StartAutomatically();
    c.SetServiceName("ServiceName");
});
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,只执行TypeB中的execute方法.我也尝试过:

HostFactory.Run(c =>
{
    c.ScheduleQuartzJobAsService(q =>
        q.WithJob(() => JobBuilder.Create<TypeA>().Build())
        .AddTrigger(() => TriggerBuilder.Create().WithSimpleSchedule(builder => builder.
            WithIntervalInSeconds(ConfigurationSettings.AppFrequencyInSeconds).RepeatForever()).Build())
        ).StartAutomatically();
    c.StartAutomatically();
    c.SetServiceName("Service1");

    c.ScheduleQuartzJobAsService(r =>
        r.WithJob(() => JobBuilder.Create<TypeB>().Build())
        .AddTrigger(() => TriggerBuilder.Create().WithSimpleSchedule(builder => builder.
            WithIntervalInSeconds(ConfigurationSettings.AppFrequencyInSeconds).RepeatForever()).Build())
        ).StartAutomatically();
    c.StartAutomatically();
    c.SetServiceName("Service2");
});
Run Code Online (Sandbox Code Playgroud)

使用此代码,仅调用TypeB中的execute方法.我的类TypeA和TypeB都有'Execute'方法,这些方法是每个类的入口点(如果它们是作业的一部分,它们会被调用).似乎第二个服务代码是总是被调用的服务代码 - 如果我交换这两个ScheduleQuartzJobAsService调用的顺序,它总是在第二个调用中执行的类.

如何编写HostFactory.Run方法,以便同时执行两个作业?

Cit*_*rus 13

HostFactory.Run(c =>
                {
                    c.Service<ContainerService>(s =>
                    {
                        s.ConstructUsing(name => new ContainerService());
                        s.WhenStarted((service, control) => service.Start());
                        s.WhenStopped((service, control) => service.Stop());

                        s.ScheduleQuartzJob<ContainerService>(q =>
                            q.WithJob(() =>
                                JobBuilder.Create<TypeA>().Build())
                            .AddTrigger(() =>
                                TriggerBuilder.Create()
                                    .WithSimpleSchedule(builder => builder
                                        .WithIntervalInSeconds(20)
                                        .RepeatForever())
                                    .Build())
                            );

                        s.ScheduleQuartzJob<ContainerService>(q =>
                            q.WithJob(() =>
                                JobBuilder.Create<TypeB>().Build())
                            .AddTrigger(() =>
                                TriggerBuilder.Create()
                                    .WithSimpleSchedule(builder => builder
                                        .WithIntervalInSeconds(60)
                                        .RepeatForever())
                                    .Build())
                            );
                    });

                });
Run Code Online (Sandbox Code Playgroud)

...

public class ContainerService
{
    public bool Start()
    {
        return true;
    }

    public bool Stop()
    {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我混淆了服务和工作类的概念.一旦我介绍了返回true的ContainerServicewith Start()Stop()bool方法,我就打电话ScheduleQuartzJob而不是ScheduleQuartzJobAsService上面的代码为我工作,TypeA并且TypeB已经实现了IJob.