【问题标题】:C# Quartz.net scheduler job as windows service not executing though window service is running尽管窗口服务正在运行,但 C# Quartz.net 调度程序作业作为 Windows 服务未执行
【发布时间】:2016-07-07 15:25:55
【问题描述】:

我是 Topshelf 和 Quartz.net 的新手。

我想使用 c#quartz.net 并作为 Windows 服务运行调度程序作业。我创建了一个 Windows 服务并完成了所有必要的设置来调用调度程序作业。我没有收到任何错误,并且窗口服务已成功启动。但是当我在调度程序作业中放置调试点时,即使我设置的时间已经到了,它也没有被执行。

程序.cs

internal class Program
{
    private static readonly IUnityContainer Container = UnityConfig.GetConfiguredContainer();
    static void Main(string[] args)
    {
        HostFactory.Run(serviceConfig =>
        {
            serviceConfig.Service<ISchedulerService>(serviceInstance =>
            {
                serviceInstance.ConstructUsing(name => Container.Resolve<ISchedulerService>());
                serviceInstance.WhenStarted(execute => execute.Start());
                serviceInstance.WhenStopped(execute => execute.Stop());
            });
            serviceConfig.RunAsLocalSystem();
            serviceConfig.SetDescription("Scheduler");
            serviceConfig.SetDisplayName("Scheduler");
            serviceConfig.SetServiceName("Scheduler");

            serviceConfig.StartAutomatically();
        });
    }
} 

ScheduleService.cs

public class SchedulerService : ISchedulerService
{
    private readonly IScheduler _scheduler;
    private readonly DateTimeOffset _startTime = new DateTimeOffset(new DateTime(2016, 05, 01, 08, 30, 00, DateTimeKind.Utc).ToLocalTime());
    public SchedulerService(IScheduler scheduler)
    {
        _scheduler = scheduler;
    }
    public void Start()
    {
        StartScheduledJobs();
    }

    public void Stop()
    {
        _scheduler.Shutdown(true);
    }

    private void StartScheduledJobs()
    {
        try
        {
            SchedulePrsReportExportJob();
            _scheduler.Start();
        }
        catch (Exception ex)
        {

        }
    }

    private void SchedulePrsReportExportJob()
    {
        var jobDetail = JobBuilder.Create<MyJob>()
            .WithIdentity("job1", "group1")
            .Build();

        var trigger = TriggerBuilder.Create()
            .WithIdentity("trigger1", "group1")
            //.WithSchedule(CronScheduleBuilder.CronSchedule("0 1 0 ? * *"))  //minute past midnight everyday
            //.StartAt(_startTime)
            //.WithSchedule(CronScheduleBuilder.CronSchedule("0 0/5 * ? * *"))  //minute past midnight everyday
            .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(16, 18))
            .StartNow()
            .Build();

        _scheduler.ScheduleJob(jobDetail, trigger);
    }
}

工作

public class MyJob : IJob
{
    private readonly ISomeService _service;

    public ExportPrsLiveReportJob(ILogProvider logProvider, ISomeService service)
    {
        _service = service;
    }

    public async void Execute(IJobExecutionContext context)
    {
        var data = await _service.Get();
    }
}

谁能帮我在这里做错了什么?

谢谢

【问题讨论】:

  • 你有没有解决这个问题?我也有同样的问题。
  • @RemotecUk ,不,我没有得到任何解决方案。

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


【解决方案1】:

我遇到了类似的问题,发现没有默认构造函数是问题所在。

所以,是这样的:

public class ExportPrsLiveReportJob : IJob
{
    private readonly ISomeService _service;

    public ExportPrsLiveReportJob(ILogProvider logProvider, ISomeService service)
    {
        _service = service;
    }

    public ExportPrsLiveReportJob() : this(<however your system does dependency resolution for ILogProvider and ISomeService>){

    }

    public async void Execute(IJobExecutionContext context)
    {
        var data = await _service.Get();
    }
}

【讨论】:

    【解决方案2】:

    我遇到了类似的问题。我有一个可以运行的测试项目,而我的实际项目却无法运行。

    问题似乎与服务名称的长度和/或名称中使用的点有关。

    我没有在 Quatrz 源代码中找到任何可以证实这一点的东西。根据我的本地测试,工作服务和非工作服务之间的唯一区别是服务名称。

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多