ASP.NET MVC Планировщик заданий - PullRequest
0 голосов
/ 19 мая 2018

Я использую QUARTZ.Net в качестве своего планировщика заданий в своем проекте, моя цель состоит в том, чтобы я хотел, чтобы пользователь получал запланированные электронные письма и запускал их (ежемесячно / еженедельно / ежедневно).Допустим, мой хост находится на Azure ... и я хочу создать приложение и развернуть его.где я должен разместить свой график, что произойдет, если я поместу его в

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

Я хочу, чтобы он всегда работал независимо от того, есть запрос или нет.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Вы можете определить три разных задания (или вы можете запускать одно и то же задание более одного раза) в день, еженедельно и ежемесячно и назначить триггерам соответствующие значения 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 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;
        }
    }
0 голосов
/ 20 мая 2018

мы используем Quartz.NET, но не отправляем электронную почту, мы используем другие службы получения данных. У нас есть 2 приложения для этого Quartz Service и Quartz Client.

Служба Quartz консольное приложение и его задание на создание.

Кварцевый клиент - это приложение MVC, которое мы отслеживаем, задания запускаются вручную.

Это официальное руководство Кварцевый учебник

...