Quartz.net настройка в an asp.net сайт


Я только что добавил: quartz.net dll в мою корзину и начал мой пример. Как вызвать метод C# с помощью quartz.net основываясь на времени?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Quartz;
using System.IO;


public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if(SendMail())
             Response.write("Mail Sent Successfully");
    }
   public bool SendMail()
   {
    try
    {
        MailMessage mail = new MailMessage();
        mail.To = "test@test.com";
        mail.From = "sample@sample.com";
        mail.Subject = "Hai Test Web Mail";
        mail.BodyFormat = MailFormat.Html;
        mail.Body = "Hai Test Web Service";
        SmtpMail.SmtpServer = "smtp.gmail.com";
        mail.Fields.Clear();
        mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
        mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "redwolf@gmail.com");
        mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "************");
        mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", "465");
        mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true");
        SmtpMail.Send(mail);
        return (true);
    }
    catch (Exception err)
    {
        throw err;
    }
}
}

Здесь я просто отправляю письмо на загрузку страницы. Как я могу позвонить SendMail() один раз в день в определенное время (скажем, в 6.00 утра), используя quartz.net - я не знаю, с чего начать. Должен ли я настроить его в моем файле global.asax? Есть предложения?

3 9

3 ответа:

Вы пробовали quartz.net учебник ?

Поскольку ваше веб-приложение может быть переработано / перезапущено, вам, вероятно, следует (повторно)инициализировать quartz.net планировщик в обработчике Application_Start в global.асакс.CS.


Обновление (с полным примером и некоторыми другими соображениями):

Вот полный пример того, как это сделать с помощью quartz.net прежде всего, вы должны создать класс, который реализует интерфейс IJob, определенный quartz.net этот класс называется своим quartz.net планировщик в Tne настроен вовремя и поэтому должен содержать ваши функции отправки почты:

using Quartz;
public class SendMailJob : IJob
{
    public void Execute(JobExecutionContext context)
    {
        SendMail();
    }
    private void SendMail()
    {
        // put your send mail logic here
    }
}

Далее вы должны инициализировать quartz.net планировщик для вызова задания один раз в день в 06:00. Это можно сделать в Application_Start из global.asax:

using Quartz;
using Quartz.Impl;

public class Global : System.Web.HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        ISchedulerFactory schedFact = new StdSchedulerFactory();
        // get a scheduler
        IScheduler sched = schedFact.GetScheduler();
        sched.Start();
        // construct job info
        JobDetail jobDetail = new JobDetail("mySendMailJob", typeof(SendMailJob));
        // fire every day at 06:00
        Trigger trigger = TriggerUtils.MakeDailyTrigger(06, 00);
        trigger.Name = "mySendMailTrigger";
        // schedule the job for execution
        sched.ScheduleJob(jobDetail, trigger);
    }
    ...
}

Вот и все. Ваша работа должна выполняться каждый день в 06: 00. Для тестирования можно создать триггер, который срабатывает каждую минуту (например). Взгляните на метод TriggerUtils.

В то время как вышеуказанное решение может сработать для вас, есть одна вещь, которую вы должны учитывать: ваше веб-приложение будет переработано/остановлено, если в течение некоторого времени нет активности (т. е. нет активных пользователей). Это означает, что ваша функция отправки почты может не выполняться (только если была какая-то активность в то время, когда почта должна быть отправлена).

Поэтому вам следует подумать о других решениях вашей проблемы:
  • возможно, вы захотите внедрить службу windows для отправки ваших электронных писем (служба windows будет всегда быть бегущим)
  • или гораздо проще: реализуйте функцию отправки почты в небольшом консольном приложении и настройте запланированную задачу в windows для вызова консольного приложения один раз в день в требуемое время.

В дополнение к хорошему ответу M4N, вы можете взглянуть на spring.net интеграция системы quartz.net lib , который позволяет вызывать методы без необходимости реализации IJob.

Я ищу кварц . я делаю это для своей работы:

1: установить кварц из визуальной консоли:

PM> Install-Package quartz

2: Создайте класс, подобный этому:

using Quartz;
public class Quartz : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        //do some 
    }
}

3.in глобальный

using Quartz;
using Quartz.Impl;

    protected void Application_Start(object sender, EventArgs e)
    {
        //for start time at first run after 1 hour
        DateTimeOffset startTime = DateBuilder.FutureDate(1, IntervalUnit.Hour);
        IJobDetail job = JobBuilder.Create<Quartz>()
                                   .WithIdentity("job1")
                                   .Build();
        ITrigger trigger = TriggerBuilder.Create()
                                         .WithIdentity("trigger1")
                                         .StartAt(startTime)
                                         .WithSimpleSchedule(x => x.WithIntervalInSeconds(10).WithRepeatCount(2))
                                         .Build();
        ISchedulerFactory sf = new StdSchedulerFactory();
        IScheduler sc = sf.GetScheduler();
        sc.ScheduleJob(job, trigger);
        sc.Start();
    }

Это код, который делает какую-то работу в каждые 10 секунд в течение 3-х раз. удачи