ASP .NET - 仅Quartz Scheduler在用户访问

时间:2017-05-16 14:12:35

标签: c# asp.net quartz.net quartz

我需要从我的.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中我可能会添加!

2 个答案:

答案 0 :(得分:0)

+1 @BRAHIMKamel。您可以考虑使用Hangfire在ASP.NET应用程序中执行某些作业处理。

请注意,只要您依赖IIS应用程序池,您的作业就可以随时终止并重新启动。这意味着您的工作代码必须容忍多个后续执行。关于电子邮件,这意味着在尝试实际发送邮件之前,您应该检查是否已经发送了所需内容。

答案 1 :(得分:0)

我能够提出更优雅的解决方案。使用Zapix工具,我可以安排我的网站每20分钟进行一次质量检查。 Zapix只是访问了该网站并收到了http响应。通过使用Zapix,它模仿了手动访问网站以触发电子邮件的功能。