ASP.NET MVC作业调度程序

时间:2018-05-19 15:49:18

标签: c# model-view-controller scheduled-tasks quartz

我在我的项目中使用QUARTZ.Net作为我的作业调度程序,我的目标是希望用户安排电子邮件并触发它们(每月/每周/每天)。 让我说我的主机是天蓝色的......我想创建一个应用程序并进行部署。 我应该在哪里安排我的预定,如果我把它放在

下会发生什么
public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
      //here
    }
}

我希望无论是否有请求,它都会一直运行。

2 个答案:

答案 0 :(得分:1)

您可以每天,每周和每月定义三个不同的作业(或者您可以多次触发相同的作业),并为触发器分配适当的cron值。

使用http://www.cronmaker.com/进行规划。

您可以使用以下结构。

在Global asax Application_Start方法中,调用QuartzServer.Start()方法就足够了。

  

此代码是根据最新版本的quatz编写的。这很重要,因为在以前版本的 3.0 中没有异步支持。

电子邮件:

  

使用[DisallowConcurrentExecution]属性,如果在作业运行时再次触发,则应该完成当前作业

   [DisallowConcurrentExecution]
    public class MailJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        { 
            // Do Work
            await Console.Out.WriteLineAsync("Mail Job is executing.");
        }
    }

Quartz Server Class

public class QuartzServer
    {

        private static IScheduler _scheduler;


        [MethodImpl(MethodImplOptions.Synchronized)]
        public static void Start()
        {
            _scheduler = StdSchedulerFactory.GetDefaultScheduler().GetAwaiter().GetResult();
            Load();
            _scheduler.Start();
        }

        [MethodImpl(MethodImplOptions.Synchronized)]
        public static void Stop()
        {
            _scheduler.Shutdown(true);
        }

        [MethodImpl(MethodImplOptions.Synchronized)]
        private static void Load()
        {
            JobCreator.CreateJob<MailJob>(new JobInfo
            {
                JobName = "MailJob",
                TriggerName = "MainJobTrg",
                GroupName = "MainJobGroup",
                DataParamters = null,
                CronExpression = "paste here cronmaker time planning string" 
            }, ref _scheduler);   

           // Define job Daily , weekly and mounthly     
        }
}

JobCreator Class

 public sealed class JobCreator
    {        

        public static void CreateJob<T>(JobInfo jInfo, ref IScheduler scheduler) where T : IJob
        {
            JobBuilder jbuilder = JobBuilder.Create<T>();
            jbuilder.WithIdentity(jInfo.JobName, jInfo.GroupName);

            if (jInfo.DataParamters != null && jInfo.DataParamters.Any())
            {
                foreach (var item in jInfo.DataParamters)
                {
                    jbuilder.UsingJobData(GetDataMap(item));
                }
            }

            IJobDetail jobDetail = jbuilder.Build();

            TriggerBuilder tBuilder = TriggerBuilder.Create();
            tBuilder.WithIdentity(jInfo.TriggerName, jInfo.GroupName)
                    .StartNow()
                    .WithCronSchedule(jInfo.CronExpression);
                    //.WithSimpleSchedule(x => x
                    //    .WithIntervalInSeconds(10)
                    //    .RepeatForever());

            ITrigger trigger = tBuilder.Build();

            scheduler.ScheduleJob(jobDetail, trigger);
        }

        private static JobDataMap GetDataMap(DataParameter dataParameter)
        {
            JobDataMap jDataMap = new JobDataMap();

            switch (dataParameter.Value.GetType().Name)
            {
                case "Int32":
                    jDataMap.Add(dataParameter.Key, (int)dataParameter.Value);
                    break;
                case "String":
                    jDataMap.Add(dataParameter.Key, dataParameter.Value);
                    break;
            }
            return jDataMap;
        }
    }

答案 1 :(得分:0)

我们正在使用Quartz.NET但不发送电子邮件,我们正在使用get data其他服务。我们有2个Quartz Service和Quartz Client的应用程序。

Quartz服务是一个控制台应用程序及其创建作业。

Quartz Client 是一个MVC应用程序,我们手动监视作业  触发它们。

这是官方教程Quartz Tutorial

相关问题