【问题标题】:Executing multiple Quartz.NET jobs with Topshelf使用 Topshelf 执行多个 Quartz.NET 作业
【发布时间】:2014-08-14 03:38:46
【问题描述】:

我正在尝试使用 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");
});

使用上面的代码,只有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");
});

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

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

【问题讨论】:

标签: c# quartz-scheduler quartz.net topshelf


【解决方案1】:
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())
                            );
                    });

                });

...

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

    public bool Stop()
    {
        return true;
    }
}

我的问题是我混淆了服务和工作类的概念。一旦我介绍了我的ContainerServiceStart()Stop() 返回true 的布尔方法,并且我调用ScheduleQuartzJob 而不是ScheduleQuartzJobAsService,上面的代码已经为我工作了我的TypeATypeB实现IJob

【讨论】:

  • 你能更新这个以显示你的ContainerService吗?
  • 谢谢。我现在明白了。
  • 如果您随后将应用程序安装为 Windows 中的服务,这是否意味着停止服务的调用实际上并没有停止它?
  • 其实我有几个问题。如果有人可以回答这些,非常感谢! 1.如果服务关闭或崩溃,作业是否会取消? 2. 我打算在一个服务中实现很多作业,重新设计任何东西是个好主意,还是可以将所有使用ScheduleQuartzJob 的作业定义放在一起?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多