【问题标题】:How to implement scheduled task on EF (DB first) entities?如何在 EF(DB 优先)实体上实现计划任务?
【发布时间】:2015-06-02 08:04:41
【问题描述】:

我对@9​​87654323@ 很陌生,并且有一个使用Entity Framework 的网站。每天晚上,我都需要对我的Person 实体做一些工作。 因此我安装了Quartz.Net 并尝试在Global.asax 中以这种方式使用它:

<%@ Application Language="C#" %>

<%@ Import Namespace="Quartz" %>
<%@ Import Namespace="Quartz.Impl" %>

<script runat="server">

    private IScheduler Scheduler { get; set; }

    void Application_Start(object sender, EventArgs e) 
    {
        Scheduler = StdSchedulerFactory.GetDefaultScheduler();
        Scheduler.Start();

        IJobDetail dailyReset = JobBuilder.Create<ApplicationJobs.DailyReset>()
            .WithIdentity("dailyReset", "group1")
            .Build();

        ITrigger dailyResetTrigger = TriggerBuilder.Create()
            .WithIdentity("dailyResetTrigger", "group1")
            .StartAt(DateBuilder.DateOf(3, 0, 0))
        .WithSimpleSchedule(x => x
            .WithIntervalInHours(24)
            .RepeatForever())
        .Build()

        Scheduler.ScheduleJob(dailyReset, dailyResetTrigger);
    }
</script>

然后是我的 ApplicationJobs 类:

public class ApplicationJobs : System.Web.HttpApplication
{
    public class DailyReset : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            using (var uow = new UnitOfWork())
            {
                foreach (Person person in uof.Context.Persons)
                {
                    //do something
                }
            }
        }
    }
}

最后是 UnitOfWork:

public class UnitOfWork : IDisposable
{
    private const string _httpContextKey = "_unitOfWork";
    private MyEntities _dbContext;

    public static UnitOfWork Current
    {
        get { return (UnitOfWork)HttpContext.Current.Items[_httpContextKey]; }
    }

    public UnitOfWork()
    {
        HttpContext.Current.Items[_httpContextKey] = this;
    }

    public MyEntities Context
    {
        get
        {
            if (_dbContext == null)
                _dbContext = new MyEntities();

            return _dbContext;
        }
    }
}

但是using (var uow = new UnitOfWork()) 不起作用,因为uow 的构造函数中的HttpContext.Current.Items[_httpContextKey] = this; ;我读到HttpContext.CurrentApplication_Start 中不可用。

在阅读相关帖子中,尤其是 this one,但我真的不明白我是否需要创建类似 UnitOfWorkScope described here 的东西,或者是否有办法像目前这样。

那么有没有什么干净和安全的方法来安排一些使用我的UnitOfWork 来更新实体的任务?

非常感谢。

【问题讨论】:

    标签: c# asp.net entity-framework scheduled-tasks


    【解决方案1】:

    您的问题来自这样一个事实,即当您的作业将运行时,它将由石英调度程序调用,而不是来自 http 请求(即使作业位于 ASP 网站中)。

    所以 HttpContext.Current 很可能为 null。

    请记住,在使用 Quartz 时,您应该将其视为与您的网站完全平行的过程,几乎就像一个单独的服务。

    如果你需要将“参数”传递给你的工作,你可以使用工作数据映射

    JobDataMap dataMap = jobContext.JobDetail.JobDataMap;
    

    (请参阅此处了解更多信息:http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/more-about-jobs.html

    如果您需要访问您的工作,只需在创建工作密钥时使用相同的密钥和组(您在 WithIdentity

    中使用的那个

    请注意,建议实体上下文仅在您需要它的操作时处于活动状态,因此您可能只需在作业开始时实例化一个新上下文并在结束时处理它。

    【讨论】:

    • 感谢您的回复!这是我第一次做这种事情,所以真的很有帮助。我查看了您链接的教程,但我真的不明白在这种情况下可以用JobDataMap 做什么。我了解它是如何工作的,但是我可以将什么参数传递给工作以便能够在其中使用我的实体?
    • jobdatamap 允许您在为未来运行的作业创建作业期间传递参数(字符串、数字和对象)。在您的情况下,您不需要传递参数,只需在作业执行部分开始时使用using(_dbContext = new MyEntities())
    • 这很好用,我不敢相信我什至没有想过直接使用new MyEntities()。非常感谢(您对 Quartz 调度程序保持活跃的评论),您让我很开心!
    【解决方案2】:

    问题是您没有在 Web 请求中执行作业。如,Web 请求开始,您检查未完成的工作,根据需要执行工作,请求结束。如果没有 Web 请求,您将没有上下文 - 因为上下文是 Web 请求的生命周期,并且可以通过请求线程访问。

    您将遇到的另一个问题是应用程序池,如果没有活动,使用默认设置可能会结束。所以你需要一种方法让它保持活力。

    另一种方法是使用诸如 win 任务调度程序之类的东西来访问网站以开始工作。

    【讨论】:

    • 感谢 Plebsori 的解释!我不得不承认我对网络请求还不是很熟悉,但你帮助我理解了发生了什么。我也不是特别了解应用程序池,但我会调查一下。那么从你的角度来看什么是最好的;找到一种方法让它保持活动状态或使用任务调度程序触发它?
    • 我可以根据经验告诉 Quartz 调度程序在没有任何特定配置的情况下保持应用程序池的活动,所以你不必担心 ^^
    • 我已经看到了这个问题的各种解决方案。没有一个很好,都有优点/缺点。我建议快速谷歌搜索“asp.net 后台工作”或类似内容
    • 如果石英调度程序实际上在没有任何特定配置的情况下保持活力,正如雷米所说,那将是完美的,我想我还是会看看它,以确保并了解更多关于它 !非常感谢你们两个,你们的回答真的很相关并且帮助了我;)
    • @RemyGrandin 我相当肯定应用程序池将进入休眠状态或被拆除。您是否有其他说明的链接?
    猜你喜欢
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2011-06-09
    相关资源
    最近更新 更多