繁体   English   中英

ASP.NET MVC作业计划程序

[英]ASP.NET MVC Job scheduler

我在我的项目中使用QUARTZ.Net作为我的工作计划程序,我的目标是我希望用户被安排电子邮件并触发它们(每月/每周/每天)。 可以说我的主机是蔚蓝的..,我想创建一个应用程序并进行部署。 我应该在哪里安排我的计划,如果我将其放在下面

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
      //here
    }
}

我希望它始终运行,无论是否有请求。

您可以每天,每周和每月定义三个不同的作业(或者可以多次触发同一作业),并将适当的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.");
        }
    }

石英服务器类

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类

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

我们使用的是Quartz.NET,但不发送电子邮件,我们使用的是获取数据其他服务。此Quartz Service和Quartz Client有2个应用程序。

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

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

这是官方教程Quartz Tutorial

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM