我有两个按计划作业运行的 Sitecore 代理。代理 A 是一个长期运行的任务,具有低 优先级。代理 B 是一个短期运行的任务,具有高 优先级。 B 运行的间隔比 A 的间隔短。
问题是 B 永远不会运行,而 A 已经在运行。
我已经实现了 this能够在内容编辑器中手动运行代理。当我这样做时,我可以运行 B,尽管 A 已经在运行(即使我在自定义对话框中将它们设置为相同的线程优先级)。
如何在配置文件中指定 B 的优先级高于 A?或者让我的预定作业设置为多线程,以便在 Sitecore 中同时运行作业?有没有标准的方法来做到这一点?
我试过一些东西like this我在代理实现中设置线程优先级,但是当 A 已经在运行时,此代码永远不会在 B 中调用。因此,应该以某种方式在作业实现本身“之前”完成优先级排序。
最佳答案
正如在另一个答案中已经提到的,Sitecore 计划任务按顺序运行,因此每个代理仅在前一个代理完成后运行。
但是,数据库中定义的任务可以 async
运行,这意味着您可以安排多个任务并行运行。
您需要创建一个命令并定义一个时间表:
定义命令
命令在 Sitecore 客户端中定义。
- 在内容编辑器中导航至/sitecore/system/Tasks/Commands
- 使用命令模板创建新项目
- 指定类型和方法字段。
定义时间表
数据库代理将根据调度中的设置执行命令。
- 在内容编辑器中导航至/sitecore/system/Tasks/Schedules
- 使用计划模板创建新项目
- 对于“命令”字段,选择您刚刚创建的“命令”项
- 如果任务适用于特定项目,您可以在“项目”字段中标识这些项目。该字段支持多种格式。
- 对于“计划”字段,您可以确定任务应该运行的时间。此字段的值采用竖线分隔格式。
- 在计划中,检查标记为
Async
的字段。
您可以阅读有关 Database Scheduler in the Sitecore Community Docs 的更多信息.
请注意,如果您安排太多任务以并行运行,这可能会导致性能问题。
如果您不能像在配置中定义的任务那样传递参数,那么从数据库运行计划任务的缺点。如果您不能简单地从代码访问配置设置(并且它们需要传入),那么对于在配置中定义的计划任务,您可以从您的计划任务代码调用 Sitecore 作业。 Sitecore 作业作为一个线程运行,每个作业都会启动一个新线程,因此可以并行运行,只需确保作业名称是唯一的(同名作业将排队)。
关于multithreading - Sitecore 预定作业的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37617609/