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