1

我使用 Quartz lib 在我的 ASP.NET MVC 项目中按计划执行一些任务。我将我的作业初始化为 Global.asax 文件的 Application_Start 方法。但过了一段时间,Quartz 停止了,因为方法 Application_End 被执行了。

变量被声明为静态:

public static ISchedulerFactory scheduleFactory = new StdSchedulerFactory();

public static IScheduler scheduler = scheduleFactory.GetScheduler();

以下是 Quads 的 Jobs 的初始化方式:

IJobDetail jobSender = new JobDetailImpl("jobSender", "MailGroup", typeof(JobMailSender));

ITrigger triggerSender = new CronTriggerImpl("triggerSender", "SenderGroup", "jobSender", "MailGroup", "0 0/30 * * * ?");

scheduler.ScheduleJob(jobSender, triggerSender);

scheduler.Start();

我找到了它发生的原因。当所有用户的会话将不复存在并且服务器没有活动的用户会话时,方法 Application_End 将执行。

我创建了新的 Quartz 的工作,它每 15 分钟打开一次站点,结果新的用户会话将在服务器上创建。但仍会不时调用 Application_End 方法。

有没有人面临类似的问题?也许 web.config 有一些设置不会执行方法 Application_End,即使服务器上没有活动会话?

4

2 回答 2

2

我发现在 IIS 中运行 Quartz 会导致包括这个在内的问题。您可能会收到 Application_End 因为应用程序池正在回收。

我们通过在同一台机器上安装 Quartz 作为服务解决了这个问题,并通过 Quartz 的远程代理从网站访问该服务。

以下链接可能会有所帮助:使用一个 Windows 服务来执行作业和两个 Web 应用程序来安排作业

于 2012-11-02T14:07:52.877 回答
0

在我们的应用程序中,我们也面临同样的问题,Application_End 在一段时间后或 Web 服务器空闲时被调用,之后在下一个活动 Application_Start 被再次调用,并且计划被一次又一次地执行。

我们最终在数据库中有一个简单的表,即 cron_schedule,它用于维护 Quratz 运行的日志。在我们的触发器方法中,我们首先检查数据库中存在的最后执行时间是否符合我们的执行条件,然后才执行触发器,否则简单地返回或只是做一个日志,这样我们就可以知道调度已执行但什么也没做.

于 2013-05-03T05:17:44.003 回答