Настройка Quartz.net на веб-сайте asp.net - PullRequest
9 голосов
/ 14 июля 2010

Я только что добавил 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 ]

23 голосов
/ 14 июля 2010

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

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


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

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

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

Затем необходимо инициализировать планировщик quartz.net, чтобы вызывать вашу работу один раз в день в6: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, чтобы вызывать ваше консольное приложение один раз в день в нужное время.
2 голосов
/ 20 июля 2010

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

0 голосов
/ 04 августа 2014

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

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

PM> Install-Package кварц

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

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

3. в глобальном

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 раз.удачи

...