72 votes

Comment utiliser Quartz.net avec ASP.NET

Je ne sais pas comment utiliser Quartz.dll dans ASP.NET. Où écrire le code pour la planification des emplois pour déclencher le courrier chaque matin ? Si certains corps sait à ce sujet Veuillez m’aider s’il vous plaît...

Edit : J’ai trouvé Comment faire pour utiliser Quartz.NET de manière PRO ? pour être vraiment utile.

77voto

jvilalta Points 4862

Vous avez deux options, selon ce que vous voulez faire et comment vous voulez le configurer. Par exemple, vous pouvez installer un Quartz.Net serveur autonome windows serviceor vous pouvez aussi l'intégrer à l'intérieur de votre asp.net application.

Si vous souhaitez exécuter incorporée, vous pouvez démarrer le serveur de dire votre global.asax, comme ceci (à partir du code source des exemples, exemple n ° 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 exécuter en tant que service, vous souhaitez vous connecter à distance comme cela (à partir de l'exemple n ° 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 à l'ordonnanceur (que ce soit via l'accès distant ou parce que vous avez un intégré à l'instance de), vous pouvez planifier des tâches comme ceci:

// 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 quelques posts que j'ai écrit pour les gens de commencer avec Quartz.Net: http://jvilalta.blogspot.com/2009/03/getting-started-with-quartznet-part-1.html

2voto

Sagar Kute Points 68

Il y A quelques semaines, j'ai écrit à propos de l'utilisation Quartz.Net planifier des tâches dans Windows Azure Rôles de travail. Depuis lors, j'ai couru dans une exigence qui m'a poussé à créer un wrapper autour de la Quartz.Net IScheduler. Le JobSchedule a la responsabilité de la lecture d'une planification de la chaîne à partir de la CloudConfigurationManager et le calendrier de travail.

Le CloudConfigurationManager lit les paramètres du Rôle du fichier de configuration, qui peut être modifié via le Portail de Gestion Windows Azure en vertu de la section configurer de vos services cloud.

L'exemple suivant permet de planifier une tâche qui doit être exécutée tous les jours à 6 h, 8 h, 10 h, à 12 H 30 et 4:30 PM. Le planning est défini dans le Rôle de paramètres qui peuvent être modifiés par le biais de Visual Studio. Pour atteindre les paramètres de Rôle, allez à votre Service en Nuage Windows Azure projet et de trouver le Rôle souhaité configurations sous le Rôle dossier. Ouvrir l'éditeur de configuration en double-cliquant sur le fichier de configuration, puis accédez à l'onglet "Paramètres". Cliquez sur "Ajouter un Paramètre" et le nom du 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, à l'aide de la JobSchedule horaire quotidien de travail en utilisant le calendrier défini dans le Rôle du fichier de configuration.

var schedule = new JobSchedule();

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

Le DailyJob mise en œuvre se déroule comme suit. Puisque c'est une démo, je vais pas ajouter de la logique spécifique à l'emploi.

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

Le JobSchedule enveloppe le Quartz.Net IScheduler. Dans un post précédent, j'ai parlé de l'importance de l'emballage de votre 3ème partie outils, c'est un excellent exemple car je suis contenant le travail de planification logique et je pourrait potentiellement changer cette logique sans affecter le code à l'aide de la JobSchedule.

Le JobSchedule doit être configuré lorsque le Rôle démarre et la JobSchedule instance doit être maintenue tout au long de la Rôle de sa vie. La modification de l'annexe peut être obtenue en changeant le ‘JobDailySchedule' paramètre via le Portail de Gestion Windows Azure en vertu de la section configurer de vos services cloud. Ensuite, pour appliquer le nouveau barème, redémarrez l'instance de Rôle à travers le Portail de Gestion Windows Azure en vertu de 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);
        });
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X