我需要从我的.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();
}
Job Scheduler(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天。但是,由于某些原因,只有当用户在计划发布作业的当天访问我的网站时,才会执行此作业。如何通过Quartz ???
自动执行这些作业编辑:我的目标是在不弄乱应用程序池线程的情况下完成此任务。接受的答案表明,这个问题仅仅是用自动脚本替换用户交互。虽然副本要求维护应用程序池线程的方法,而在Java中我可能会添加!
答案 0 :(得分:0)
+1 @BRAHIMKamel。您可以考虑使用Hangfire在ASP.NET应用程序中执行某些作业处理。
请注意,只要您依赖IIS应用程序池,您的作业就可以随时终止并重新启动。这意味着您的工作代码必须容忍多个后续执行。关于电子邮件,这意味着在尝试实际发送邮件之前,您应该检查是否已经发送了所需内容。
答案 1 :(得分:0)
我能够提出更优雅的解决方案。使用Zapix工具,我可以安排我的网站每20分钟进行一次质量检查。 Zapix只是访问了该网站并收到了http响应。通过使用Zapix,它模仿了手动访问网站以触发电子邮件的功能。