【问题标题】:Work with Quartz on ASP.NET MVC在 ASP.NET MVC 上使用 Quartz
【发布时间】:2013-08-07 04:51:25
【问题描述】:

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

变量被声明为静态:

public static ISchedulerFactory scheduleFactory = new StdSchedulerFactory();

public static IScheduler scheduler = scheduleFactory.GetScheduler();

Quards 的 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 方法,即使服务器上没有活动会话?

【问题讨论】:

    标签: asp.net-mvc cron quartz.net


    【解决方案1】:

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

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

    以下链接可能会有所帮助:Use one windows service to execute jobs and two web applications to schedule jobs

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        相关资源
        最近更新 更多