使用Quartz.Net和Asp.Net应用程序执行JobSchedule的好方法是什么?

时间:2015-03-25 10:40:53

标签: asp.net quartz-scheduler quartz.net

我的ASp.net应用程序出了问题,我已经测试了几个解决方案,但我没有看到任何问题。感谢您提前获取建议。

我已经安装并运行Quartz.Net作为Windows服务。 Quartz.Net与我的API在同一个文件夹中,以便在其中执行作业。

在我的global.asax Application_Start下面

public static ISchedulerFactory schedFact;
public static IScheduler scheduler;

protected void Application_Start()
{
    NameValueCollection properties = new NameValueCollection();
    properties["quartz.scheduler.instanceName"] = "ServerScheduler";
    properties["quartz.scheduler.proxy"] = "true";
    properties["quartz.threadPool.threadCount"] = "10";
    properties["quartz.scheduler.proxy.address"] = "tcp://localhost:555/QuartzScheduler";


    schedFact = new StdSchedulerFactory(properties);
    scheduler = schedFact.GetScheduler();
    scheduler.Start();

    MyAPI.Services.ScheduleTasks.JobScheduler.StartGenerateContract();
}

这里是我的工作所在的课程:

public class ScheduleTasks
{
    public static Dictionary<string, string> report;

    public class JobScheduler
    {
        public static void StartGenerateContract()
        {
            try
            {
                MailService.SendMail("StartGenerateContract", "Scheduletask",
                    new Exception(DateTime.Now.ToString()));


                IJobDetail job_generate = JobBuilder.Create<GenerateAndSendContract>()
                    .WithIdentity("generateContractJob", "group1")
                    .Build();

                ITrigger trigger = TriggerBuilder.Create()
                    .WithIdentity("trigger_contracts", "group1")
                    .ForJob("generateContractJob", "group1")
                    .StartNow()
                    .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(01, 00))
                    .Build();

                MyAPI.MvcApplication.scheduler.ScheduleJob(job_generate, trigger);
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
    }
}

然后我的工作在同一个文件和类ScheduleTasks

public class GenerateAndSendContract : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        try
        {
            MailService.SendMail("GenerateAndSendContract", "Scheduletask");
                //my working code...
        }
        catch (Exception e)
        {
            MailService.SendErrorMail("GenerateAndSendContract", "ScheduleTasks", e);
        }
    }
}

我的scheduleTask完美执行,因为我收到第一封电子邮件(StartGenerateContract),间隔很好。但是这个作业没有被执行,因为没有触发类generateandsendcontract中的代码(没有断点,没有邮件发送GenerateAndSendContract)。

我的代码有什么问题吗?谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

在MVC应用程序端创建调度程序时,您只需要以下属性:

properties["quartz.scheduler.instanceName"] = "RemoteClient"; 
properties["quartz.scheduler.proxy"] = "true"; 
properties["quartz.threadPool.threadCount"] = "0"; 
properties["quartz.scheduler.proxy.address"] = address;

您也不需要在充当客户端的调度程序上调用Start方法。