我正在寻找以下问题的解决方案:我有一个网站,希望每隔一小时(大约)将邮件发送到某个地址。 所以我决定使用Quartz库来实现C#。我写了作业,Start()函数和Execute:
public static void Start()
{
IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();
IJobDetail job = JobBuilder.Create<EmailJob>().Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInMinutes(50)
.RepeatForever())
.Build();
scheduler.ScheduleJob(job, trigger);
}
在Application_start()中:
JobScheduler.Start();
当我在本地运行网站时,它的工作非常完美,因为应用程序位于&#34; Play&#34;模式一直都是。所以它按预期每50分钟发送一次邮件。
现在出现问题:将网站上传到服务器时,Job只工作了一次 - 第一次。在我读到它之后,我对这个问题的结论是网站应用程序有一个&#34; sleep&#34;模式,所以如果有人没有进入网站,应用程序处于睡眠状态,因此工作无效,电子邮件也没有发送。
所以我的问题是 - 如果我想要一个每50分钟运行一次功能的调度程序,我该怎么办?如果有人进入该网站,我该怎么办?
答案 0 :(得分:0)
检查您的设计。通过创建控制台应用程序并使用windows task Scheduler或撰写Windows Service Application
,您可以获得更好的效果答案 1 :(得分:0)
根据您使用的IIS版本,它看起来略有不同。但您需要以alwaysrunning
模式设置应用程序:
在web.config
中添加这样的applicationsPools部分:
<applicationPools>
<add name="appName" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>
或者,您可以通过单击应用程序池上的高级设置在IIS管理中更改此设置。
(将managedRuntimeVersion
设置为您的应用程序版本当然)
编辑:正如Ravi所说,这必须与启动模块或一些保持网站运行的外部服务相结合。
另一种解决方案可能是迁移到Hangfire
并使用IProcessHostPreloadClient
和我总是运行的方法。