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 ответа:
Вы пробовали 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-х раз. удачи