【问题标题】:Scheduled tasks limitations (or how tasks persistence is implemented)?计划任务限制(或任务持久性如何实现)?
【发布时间】:2016-07-08 07:09:43
【问题描述】:

我已经开始阅读 Hangfire 文档,但没有发现任何关于任务限制的信息。

正如声明的那样,任务(或作业)存储在某处。

由于它们只是代表,据我所知,唯一可以存储的是代表“主体”(IL?)。但是可能会有闭包,为任务提供一些上下文,例如,一些外部服务,可能需要加载额外的程序集来运行它们的代码等。

Hangfire 如何处理这个问题?
任务可以在其主体中包含任何指令,还是有任何限制?

【问题讨论】:

    标签: c# hangfire


    【解决方案1】:

    当您创建一个调用Job.FromExpression 的作业时,如果您传递给它的不是方法调用表达式,它就会引发异常。因此,您可以传递给BackgroundJob.Enqueue 的唯一内容是该行调用函数的单行。

    然后它会序列化对象的类型,并使用JobHelper.ToJson 将所有参数传入 JSON。当你传入一个类的实例时,该实例没有被序列化,只有类型被序列化,如果执行跨越进程边界,它将失去内部状态。

    您可能想阅读旧hangfire 博客网站“Are your methods ready to run in background?”上的博客文章

    【讨论】:

    • 感谢您的回答和参考文章!我想,我已经得到了解释,结论是工作/任务方法非常受其内容的限制。需要通过 all 状态,需要执行作业。如果需要一些动态状态,他必须从状态中检索它,该状态在作业调度中被序列化(例如,在数据库或文件名/路径中传递记录标识符)。我有点失望 - 这些都是非常重要的东西,必须放在 Hangfire 主页的顶部。
    【解决方案2】:

    似乎该机制基于Expression 用于调度操作,并且该库主要用于 ASP.Net 网站中的“内部”(进程中)执行。

    意思是,执行计划操作所需的所有程序集都应该已经加载到 Web 应用程序的内存空间中,因为它们是计划作业所必需的(如果缺少 Type,应用程序将不会编译来自未引用的程序集)。

    希望它能让事情更清楚一点!

    【讨论】:

    • “如果应用程序缺少未引用的程序集中的类型,则该应用程序将不会编译” - 我的意思是动态程序集加载,例如一些基于插件的场景,当确切的插件程序集在编译时未知时。
    猜你喜欢
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2011-02-18
    • 2013-02-05
    • 2011-04-15
    • 2012-05-23
    • 1970-01-01
    相关资源
    最近更新 更多