web-dev-qa-db-fra.com

Comment utiliser Quartz.net avec ASP.NET

Je ne sais pas comment utiliser Quartz.dll dans ASP.NET. Où écrire le code de planification des travaux pour déclencher le courrier chaque matin? S'il vous plaît, si un organisme le sait, aidez-moi ...

Edit: J'ai trouvé COMMENT UTILISER Quartz.NET de manière PRO? pour être vraiment utile.

72
ACP

Vous avez deux options, selon ce que vous voulez faire et comment vous voulez le configurer. Par exemple, vous pouvez installer un serveur Quartz.Net en tant que service Windows autonome ou vous pouvez également l'intégrer dans votre application asp.net.

Si vous souhaitez l'exécuter de manière intégrée, vous pouvez démarrer le serveur à partir de, par exemple, votre global.asax, comme ceci (à partir des exemples de code source, exemple # 12):

NameValueCollection properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "RemoteServer";

// set thread pool info
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.threadPool.threadCount"] = "5";
properties["quartz.threadPool.threadPriority"] = "Normal";

ISchedulerFactory sf = new StdSchedulerFactory(properties);
IScheduler sched = sf.GetScheduler();
sched.Start();

Si vous l'exécutez en tant que service, vous vous connecteriez à distance comme ceci (à partir de l'exemple # 12):

NameValueCollection properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "RemoteClient";

// set thread pool info
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.threadPool.threadCount"] = "5";
properties["quartz.threadPool.threadPriority"] = "Normal";

// set remoting expoter
properties["quartz.scheduler.proxy"] = "true";
properties["quartz.scheduler.proxy.address"] = "tcp://localhost:555/QuartzScheduler";
// First we must get a reference to a scheduler
ISchedulerFactory sf = new StdSchedulerFactory(properties);
IScheduler sched = sf.GetScheduler();

Une fois que vous avez une référence au planificateur (que ce soit via l'accès à distance ou parce que vous avez une instance intégrée), vous pouvez planifier des travaux comme celui-ci:

// define the job and ask it to run
JobDetail job = new JobDetail("remotelyAddedJob", "default", typeof(SimpleJob));
JobDataMap map = new JobDataMap();
map.Put("msg", "Your remotely added job has executed!");
job.JobDataMap = map;
CronTrigger trigger = new CronTrigger("remotelyAddedTrigger", "default", "remotelyAddedJob", "default", DateTime.UtcNow, null, "/5 * * ? * *");
// schedule the job
sched.ScheduleJob(job, trigger);

Voici un lien vers certains articles que j'ai écrits pour les personnes qui commencent à utiliser Quartz.Net: http://jvilalta.blogspot.com/2009/03/getting-started-with-quartznet-part-1.html =

77
jvilalta

Il y a quelques semaines, j'ai écrit sur l'utilisation de Quartz.Net pour planifier des travaux dans les rôles de travail Windows Azure. Depuis lors, j'ai rencontré une exigence qui m'a poussé à créer un wrapper autour du Quartz.Net IScheduler. Le JobSchedule a la responsabilité de lire une chaîne de planification à partir de CloudConfigurationManager et de planifier un travail.

CloudConfigurationManager lit les paramètres du fichier de configuration du rôle, qui peut être modifié via le portail de gestion Windows Azure dans la section de configuration de vos services cloud.

L'exemple suivant planifie un travail qui doit être exécuté tous les jours à 6 h, 8 h, 10 h, 12 h 30 PM et à 16 h 30. La planification est définie dans le rôle paramètres pouvant être modifiés via Visual Studio. Pour accéder aux paramètres de rôle, accédez à votre projet Windows Azure Cloud Service et recherchez les configurations de rôle souhaitées dans le dossier Role. Ouvrez l'éditeur de configuration en double-cliquant sur le fichier de configuration, puis accédez à la Onglet "Paramètres" Cliquez sur "Ajouter un paramètre" et nommez le nouveau paramètre "JobDailySchedule" et définissez sa valeur sur 6: 0; 8: 0; 10: 0; 12: 30; 16: 30;

The code from this Post is part of the Brisebois.WindowsAzure NuGet Package

To install Brisebois.WindowsAzure, run the following command in the Package Manager Console

PM> Install-Package Brisebois.WindowsAzure

Get more details about the Nuget Package.

Ensuite, en utilisant la planification JobSchedule, une tâche quotidienne utilise la planification définie dans le fichier de configuration du rôle.

var schedule = new JobSchedule();

schedule.ScheduleDailyJob("JobDailySchedule",
                            typeof(DailyJob));

L'implémentation de DailyJob se déroule comme suit. Puisqu'il s'agit d'une démo, je n'ajouterai aucune logique spécifique au travail.

public class DailyJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        //Do your daily work here
    }
}

Le JobSchedule encapsule le Quartz.Net IScheduler. Dans un article précédent, j'ai parlé de l'importance d'encapsuler vos outils tiers, c'est un excellent exemple car je contient la logique de planification des travaux et je pourrais potentiellement changer cette logique sans affecter le code qui utilise JobSchedule.

Le JobSchedule doit être configuré au démarrage du rôle et l'instance JobSchedule doit être maintenue pendant toute la durée de vie du rôle. La modification de la planification peut être réalisée en modifiant le paramètre "JobDailySchedule" via le portail de gestion Windows Azure dans la section de configuration de vos services cloud. Ensuite, pour appliquer la nouvelle planification, redémarrez l'instance de rôle via le portail de gestion Windows Azure dans la section instances de vos services cloud.

public class JobSchedule
{
    private readonly IScheduler sched;

    public JobSchedule()
    {
        var schedFact = new StdSchedulerFactory();

        sched = schedFact.GetScheduler();
        sched.Start();
    }

    /// <summary>
    /// Will schedule jobs in Eastern Standard Time
    /// </summary>
    /// <param name="scheduleConfig">Setting Key from your CloudConfigurations, 
    ///                              value format "hh:mm;hh:mm;"</param>
    /// <param name="jobType">must inherit from IJob</param>
    public void ScheduleDailyJob(string scheduleConfig, 
                                 Type jobType)
    {
        ScheduleDailyJob(scheduleConfig, 
                         jobType, 
                         "Eastern Standard Time");
    }

    /// <param name="scheduleConfig">Setting Key from your CloudConfigurations, 
    ///                              value format "hh:mm;hh:mm;"</param>
    /// <param name="jobType">must inherit from IJob</param>
    public void ScheduleDailyJob(string scheduleConfig, 
                                 Type jobType, 
                                 string timeZoneId)
    {
        var schedule = CloudConfigurationManager.GetSetting(scheduleConfig);
        if (schedule == "-")
            return;

        schedule.Split(';')
                .Where(s => !string.IsNullOrWhiteSpace(s))
                .ToList()
                .ForEach(h =>
        {
            var index = h.IndexOf(':');
            var hour = h.Substring(0, index);
            var minutes = h.Substring(index + 1, h.Length - (index + 1));

            var job = new JobDetailImpl(jobType.Name + hour + minutes, null,
                                        jobType);

            var dh = Convert.ToInt32(hour, CultureInfo.InvariantCulture);
            var dhm = Convert.ToInt32(minutes, CultureInfo.InvariantCulture);
            var tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);

            var cronScheduleBuilder = CronScheduleBuilder
                                            .DailyAtHourAndMinute(dh, dhm)
                                            .InTimeZone(tz);
            var trigger = TriggerBuilder.Create()
                                        .StartNow()
                                        .WithSchedule(cronScheduleBuilder)
                                        .Build();

            sched.ScheduleJob(job, trigger);
        });
    }

    /// <summary>
    /// Will schedule jobs in Eastern Standard Time
    /// </summary>
    /// <param name="scheduleConfig">Setting Key from your CloudConfigurations, 
    ///                              value format "hh:mm;hh:mm;"</param>
    /// <param name="jobType">must inherit from IJob</param>
    public void ScheduleWeeklyJob(string scheduleConfig, 
                                  Type jobType)
    {
        ScheduleWeeklyJob(scheduleConfig, 
                          jobType, 
                          "Eastern Standard Time");
    }


    /// <param name="scheduleConfig">Setting Key from your CloudConfigurations,
    ///                              value format "hh:mm;hh:mm;"</param>
    /// <param name="jobType">must inherit from IJob</param>
    public void ScheduleWeeklyJob(string scheduleConfig, 
                                  Type jobType, 
                                  string timeZoneId)
    {
        var schedule = CloudConfigurationManager.GetSetting(scheduleConfig);

        schedule.Split(';')
                .Where(s => !string.IsNullOrWhiteSpace(s))
                .ToList()
                .ForEach(h =>
        {
            var index = h.IndexOf(':');
            var hour = h.Substring(0, index);
            var minutes = h.Substring(index + 1, h.Length - (index + 1));

            var job = new JobDetailImpl(jobType.Name + hour + minutes, null,
                                        jobType);

            var dh = Convert.ToInt32(hour, CultureInfo.InvariantCulture);
            var dhm = Convert.ToInt32(minutes, CultureInfo.InvariantCulture);
            var tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
            var builder = CronScheduleBuilder
                            .WeeklyOnDayAndHourAndMinute(DayOfWeek.Monday, 
                                                         dh, 
                                                         dhm)
                            .InTimeZone(tz);

            var trigger = TriggerBuilder.Create()
                                        .StartNow()
                                        .WithSchedule(builder)
                                        .Build();

            sched.ScheduleJob(job, trigger);
        });
    }
}
2
Sagar Kute