Vraag Hoe Quartz.net met ASP.NET te gebruiken


Ik weet niet hoe ik Quartz.dll moet gebruiken in ASP.NET. Waar moet ik de code schrijven voor het plannen van taken om elke ochtend e-mail te activeren? Als een of ander lichaam ervan op de hoogte is, help me dan ...

Bewerk: ik vond HOE gebruik je Quartz.NET op PRO manier? echt nuttig zijn.


71
2017-08-31 10:15


oorsprong


antwoorden:


Je hebt een aantal opties, afhankelijk van wat je wilt doen en hoe je het wilt instellen. U kunt bijvoorbeeld een Quartz.Net-server installeren als zelfstandige Windows-service of u kunt deze ook insluiten in uw asp.net-toepassing.

Als u het ingesloten wilt laten lopen, dan kunt u de server starten vanaf uw global.asax, zoals deze (uit de broncodevoorbeelden, voorbeeld # 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();

Als je het als een service uitvoert, zou je op afstand op deze manier verbinding willen maken (van voorbeeld # 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();

Nadat u een verwijzing naar de planner hebt gemaakt (via remoting of omdat u een ingesloten instantie hebt), kunt u taken als deze plannen:

// 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);

Hier is een link naar enkele berichten die ik schreef voor mensen die begonnen zijn met Quartz.Net: http://jvilalta.blogspot.com/2009/03/getting-started-with-quartznet-part-1.html


74
2017-09-02 17:27



Een paar weken geleden schreef ik over het gebruik van Quartz.Net om banen te plannen in Windows Azure Worker Roles. Sindsdien heb ik een vereiste tegengekomen die me ertoe heeft aangezet om een ​​wrapper rond de Quartz.Net IScheduler te maken. De JobSchedule is verantwoordelijk voor het lezen van een planningstack uit de CloudConfigurationManager en het plannen van een taak.

De CloudConfigurationManager leest instellingen uit het configuratiebestand van de rol, die kunnen worden bewerkt via de Windows Azure Management Portal onder het configuratiegedeelte van uw cloudservices.

In het volgende voorbeeld wordt een taak gepland die elke dag om 6:00, 08:00, 10:00 uur, 12:30 uur en 16:30 uur moet worden uitgevoerd. Het schema wordt gedefinieerd in de rolinstellingen die kunnen worden bewerkt via Visual Studio. Om de rolinstellingen te bereiken, gaat u naar uw Windows Azure Cloud Service-project en zoekt u de gewenste rolconfiguraties onder de rolmap. Open de configuratie-editor door te dubbelklikken op het configuratiebestand en ga vervolgens naar het tabblad 'Instellingen'. Klik op 'Instelling toevoegen' en noem de nieuwe instelling 'JobDailySchedule' en stel de waarde in op 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.

Gebruik vervolgens het JobSchedule-schema voor een dagelijkse taak volgens het schema dat is gedefinieerd in het configuratiebestand van de rol.

var schedule = new JobSchedule();

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

De implementatie van DailyJob verloopt als volgt. Aangezien dit een demo is, voeg ik geen specifieke logica toe aan de taak.

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

De JobSchedule omhult de Quartz.Net IScheduler. In een vorige post sprak ik over het belang van het inpakken van je 3rd party tools, dit is een uitstekend voorbeeld omdat ik de job scheduling-logica bevat en ik deze logica mogelijk zou kunnen veranderen zonder de code te beïnvloeden die de JobSchedule gebruikt.

De JobSchedule moet worden geconfigureerd wanneer de rol wordt gestart en de JobSchedule-instantie gedurende de hele levensduur van de rol moet worden behouden. Het wijzigen van het schema kan worden bereikt door de instelling 'JobDailySchedule' te wijzigen via de Windows Azure Management Portal onder het configuratiegedeelte van uw cloudservices. Vervolgens kunt u de nieuwe planning toepassen door de rolinstantie opnieuw te starten via de Windows Azure Management Portal onder het gedeelte instanties van uw cloudservices.

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