C#Quartz.net调度程序作为Windows服务没有执行,虽然窗口服务正在运行

时间:2016-07-07 15:25:55

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

我是Topshelf和Quartz.net的新手。

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

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

任何人都可以帮助我,我在这里做错了吗?

由于

2 个答案:

答案 0 :(得分:0)

我遇到了类似的问题。我有一个有效的测试项目和我的实际项目无效。

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

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

答案 1 :(得分:0)

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

所以,像这样:

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