Program Tip

Quartz.net을 ASP.NET과 함께 사용하는 방법

programtip 2020. 10. 27. 23:10
반응형

Quartz.net을 ASP.NET과 함께 사용하는 방법


ASP.NET에서 Quartz.dll을 사용하는 방법을 모르겠습니다. 매일 아침 메일을 트리거하는 작업을 예약하기위한 코드를 어디에 작성해야합니까? 어떤 신체가 그것에 대해 알고 있다면 나를 도와주세요 ...

편집 : Quartz.NET을 PRO 방식으로 사용하는 방법을 찾았 습니까? 정말 유용합니다.


수행하려는 작업과 설정 방법에 따라 몇 가지 옵션이 있습니다. 예를 들어 Quartz.Net 서버를 독립 실행 형 Windows 서비스로 설치하거나 asp.net 애플리케이션에 임베드 할 수도 있습니다.

임베디드를 실행하려면 다음과 같이 global.asax에서 서버를 시작할 수 있습니다 (소스 코드 예제, 예제 # 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();

서비스로 실행하면 다음과 같이 원격으로 연결할 수 있습니다 (예제 # 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();

스케줄러에 대한 참조가 있으면 (원격을 통하거나 포함 된 인스턴스가 있기 때문에) 다음과 같이 작업을 예약 할 수 있습니다.

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

다음은 Quartz.Net을 시작하는 사람들을 위해 작성한 일부 게시물에 대한 링크입니다. http://jvilalta.blogspot.com/2009/03/getting-started-with-quartznet-part-1.html


몇 주 전에 Quartz.Net을 사용하여 Windows Azure 작업자 역할에서 작업을 예약하는 방법에 대해 썼습니다. 그 이후로 Quartz.Net IScheduler 주위에 래퍼를 만들도록 요구하는 요구 사항에 부딪 혔습니다. JobSchedule은 CloudConfigurationManager에서 일정 문자열을 읽고 작업을 예약 할 책임이 있습니다.

CloudConfigurationManager는 클라우드 서비스의 구성 섹션에서 Windows Azure 관리 포털을 통해 편집 할 수있는 역할의 구성 파일에서 설정을 읽습니다.

다음 예제는 매일 오전 6시, 오전 8시, 오전 10시, 오후 12시 30 분 및 오후 4시 30 분에 실행해야하는 작업을 예약합니다. 일정은 Visual Studio를 통해 편집 할 수있는 역할 설정에서 정의됩니다. 역할 설정에 도달하려면 Windows Azure 클라우드 서비스 프로젝트로 이동하고 역할 폴더에서 원하는 역할 구성을 찾습니다. 구성 파일을 두 번 클릭하여 구성 편집기를 연 다음 '설정'탭으로 이동합니다. '설정 추가'를 클릭하고 새 설정의 이름을 'JobDailySchedule'로 지정하고 값을 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.

그런 다음 JobSchedule을 사용하여 역할의 구성 파일에 정의 된 일정을 사용하여 일일 작업을 예약합니다.

var schedule = new JobSchedule();

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

DailyJob 구현은 다음과 같습니다. 이것은 데모이므로 특정 논리를 작업에 추가하지 않을 것입니다.

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

JobSchedule은 Quartz.Net IScheduler를 래핑합니다. 이전 게시물에서 제 3 자 도구를 래핑하는 것의 중요성에 대해 이야기했습니다. 이것은 작업 스케줄링 로직을 포함하고 있고 JobSchedule을 사용하는 코드에 영향을주지 않고이 로직을 잠재적으로 변경할 수 있기 때문에 훌륭한 예입니다.

JobSchedule은 역할이 시작될 때 구성되어야하며 JobSchedule 인스턴스는 역할의 수명 동안 유지되어야합니다. 클라우드 서비스의 구성 섹션에서 Windows Azure 관리 포털을 통해 'JobDailySchedule'설정을 변경하면 일정을 변경할 수 있습니다. 그런 다음 새 일정을 적용하려면 클라우드 서비스의 인스턴스 섹션에서 Windows Azure 관리 포털을 통해 역할 인스턴스를 다시 시작합니다.

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

참고URL : https://stackoverflow.com/questions/1356789/how-to-use-quartz-net-with-asp-net

반응형