ASP .NET - Quartz Scheduler 仅在用户访问时执行作业
ASP .NET - Quartz Scheduler only Executes jobs on user visit
我需要从我的 .NET 应用程序自动发送我的电子邮件。但是,在为未来安排作业时,作业仅在用户访问该站点时执行。
Global.asax.cs
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
JobScheduler.Start();
}
作业计划程序(ScheduledTasks.cs)
public class EmailJob : IJob
{
public void Execute(IJobExecutionContext context)
{
BDL.Utilities.sendEmailNotification(to, subject, body);
}
}
public static void start()
{
foreach (AspNetUser user in users)
{
IJobDetail job = JobBuilder.Create<EmailJob>().WithIdentity((jobidentity))
.UsingJobData("to", user.Email)
.UsingJobData("subject", subject)
.UsingJobData("body", bodyholder).Build();
ITrigger trigger = TriggerBuilder.Create()
// schedule for 1 day in the future
.StartAt(expdate.AddDays(1)))
.WithIdentity(triggerid)
.Build();
scheduler.ScheduleJob(job, trigger);
}
}
我已将触发器安排在未来 1 天。此触发器应使我的工作在未来 1 天执行。但是,出于某种原因,只有当用户在计划启动的那天访问我的站点时,该作业才会执行。如何让这些Jobs被Quartz自动执行???
编辑:我的目标是在不干扰应用程序池线程的情况下完成此操作。接受的答案表明这个问题只是关于用自动化脚本替换用户交互。而副本要求维护应用程序池线程的方法,在 Java 中我可能会添加!
+1 @BRAHIMKamel。您可以考虑使用 Hangfire 在您的 ASP.NET 应用程序中进行一些作业处理。
但请注意,只要您依赖 IIS 应用程序池,您的作业就可能随时终止和重新启动。这意味着您的作业代码必须容忍多次后续执行。关于电子邮件,这意味着您应该在尝试实际发送消息之前检查您是否已经发送了您想要的内容。
我想出了一个更优雅的解决方案。使用 Zapix 工具,我能够安排我的网站每 20 分钟进行一次质量检查。 Zapix 只是访问了站点并收到了 http 响应。通过使用Zapix,它模仿了手动访问网站以触发电子邮件的功能。
我需要从我的 .NET 应用程序自动发送我的电子邮件。但是,在为未来安排作业时,作业仅在用户访问该站点时执行。
Global.asax.cs
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
JobScheduler.Start();
}
作业计划程序(ScheduledTasks.cs)
public class EmailJob : IJob
{
public void Execute(IJobExecutionContext context)
{
BDL.Utilities.sendEmailNotification(to, subject, body);
}
}
public static void start()
{
foreach (AspNetUser user in users)
{
IJobDetail job = JobBuilder.Create<EmailJob>().WithIdentity((jobidentity))
.UsingJobData("to", user.Email)
.UsingJobData("subject", subject)
.UsingJobData("body", bodyholder).Build();
ITrigger trigger = TriggerBuilder.Create()
// schedule for 1 day in the future
.StartAt(expdate.AddDays(1)))
.WithIdentity(triggerid)
.Build();
scheduler.ScheduleJob(job, trigger);
}
}
我已将触发器安排在未来 1 天。此触发器应使我的工作在未来 1 天执行。但是,出于某种原因,只有当用户在计划启动的那天访问我的站点时,该作业才会执行。如何让这些Jobs被Quartz自动执行???
编辑:我的目标是在不干扰应用程序池线程的情况下完成此操作。接受的答案表明这个问题只是关于用自动化脚本替换用户交互。而副本要求维护应用程序池线程的方法,在 Java 中我可能会添加!
+1 @BRAHIMKamel。您可以考虑使用 Hangfire 在您的 ASP.NET 应用程序中进行一些作业处理。
但请注意,只要您依赖 IIS 应用程序池,您的作业就可能随时终止和重新启动。这意味着您的作业代码必须容忍多次后续执行。关于电子邮件,这意味着您应该在尝试实际发送消息之前检查您是否已经发送了您想要的内容。
我想出了一个更优雅的解决方案。使用 Zapix 工具,我能够安排我的网站每 20 分钟进行一次质量检查。 Zapix 只是访问了站点并收到了 http 响应。通过使用Zapix,它模仿了手动访问网站以触发电子邮件的功能。