【问题标题】:ASP.NET MVC Job schedulerASP.NET MVC 作业调度程序
【发布时间】:2018-05-19 15:49:18
【问题描述】:

我在我的项目中使用 QUARTZ.Net 作为我的工作调度程序,我的目标是我希望用户被安排电子邮件并触发它们(每月/每周/每天)。 假设我的主机在天蓝色.. 我想创建一个应用程序并部署它。 我应该把我的计划放在哪里,如果我把它放在下面会发生什么

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    您可以使用如下结构。

    在全局 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 服务器类

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

    【讨论】:

      【解决方案2】:

      我们正在使用 Quartz.NET 但不发送电子邮件,我们正在使用其他服务获取数据。我们有 2 个用于此 Quartz 服务和 Quartz 客户端的应用程序。

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

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

      这是官方教程Quartz Tutorial

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-21
        • 2018-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-26
        • 1970-01-01
        相关资源
        最近更新 更多