Configuración de Quartz.net en un sitio web asp.net

Acabo de agregar quartz.net dll a mi contenedor y comencé mi ejemplo. ¿Cómo llamo a un método de C # utilizando quartz.net en función del tiempo?

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

Aquí estoy enviando un correo en la carga de la página. ¿Cómo llamo a SendMail() una vez al día en un momento determinado (digamos a las 6.00 AM) usando quartz.net? No sé cómo comenzar. ¿Debo configurarlo en mi archivo global.asax ? ¿Cualquier sugerencia?

¿Has probado el tutorial de quartz.net ?

Dado que su aplicación web podría reciclarse / reiniciarse, probablemente debería (re) inicializar el planificador de quartz.net en el controlador Application_Start en global.asax.cs.


Actualización (con un ejemplo completo y algunas otras consideraciones):

Aquí hay un ejemplo completo de cómo hacer esto usando quartz.net. En primer lugar, debe crear una clase que implemente la interfaz IJob definida por quartz.net. El progtwigdor de quartz.net llama a esta clase en el momento configurado y, por lo tanto, debe contener su funcionalidad de envío de correo:

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

A continuación, debe inicializar el planificador de quartz.net para invocar su trabajo una vez al día a las 06:00. Esto se puede hacer en Application_Start of 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); } ... } 

Eso es. Su trabajo debe ejecutarse todos los días a las 06:00. Para las pruebas, puede crear un disparador que dispare cada minuto (por ejemplo). Eche un vistazo al método de TriggerUtils .

Si bien la solución anterior podría funcionar para usted, hay una cosa que debe tener en cuenta: su aplicación web se reciclará / detendrá si no hay actividad durante un tiempo (es decir, no hay usuarios activos). Esto significa que su función de envío de correo podría no ejecutarse (solo si había alguna actividad alrededor del momento en que se debe enviar el correo).

Por lo tanto, debe pensar en otras soluciones para su problema:

  • es posible que desee implementar un servicio de Windows para enviar sus correos electrónicos (el servicio de Windows siempre se ejecutará)
  • o mucho más fácil: implemente su funcionalidad de envío de correo en una aplicación de consola pequeña y configure una tarea progtwigda en Windows para invocar su aplicación de consola una vez al día en el momento requerido.

Además de la buena respuesta proporcionada por M4N, puede echar un vistazo a la integración de spring.net de la lib de quartz.net que permite llamar a métodos sin la necesidad de implementar IJob.

Estoy buscando a Quartz. hago esto por mi trabajo:

1: instal Quartz desde la consola visual:

PM> Install-Package quartz

2: crea una clase como esta:

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

3.in global

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

es un código que hace un trabajo en cada 10 segundos por 3 tiempo. buena suerte