Sitecore计划作业的优先级

虫子

我有两个按计划的作业运行的Sitecore代理。代理程序A是一项长期运行的任务,具有较低的优先级。代理B是具有优先级的短期任务B以比A的间隔短的间隔运行。

问题是当A已经运行时B永远不会运行。

我已经实现了此功能,以便能够在内容编辑器中手动运行代理。当我这样做时,尽管A已经在运行,我仍然可以运行B(即使我在自定义对话框中将它们设置为相同的线程优先级)。

如何在配置文件中指定B的优先级高于A?还是使我的计划作业设置为多线程,以便可以在Sitecore中同时运行作业?有没有标准的方法可以做到这一点?

我尝试过类似的操作,在代理实现中设置线程优先级,但是当A已经运行时,永远不会在B中调用此代码。因此,应该以某种方式在工作实施之前“确定优先级”。

虫子

我意识到,将我的高优先级计划任务B作为Sitecore的后台代理运行不是一个好的解决方案,因此我得到了以下解决方案。出于这个答案的目的,我现在将其称为B:ExampleJob

我创建了一个名为的新代理类ExampleJobStarter这项工作的目的仅仅是启动另一个运行实际工作的线程ExampleJob

public class ExampleJobStarter
{
    public override void Run()
    {
        if (ExampleJob.RunTheExampleJob) return;
        ExampleJob.RunTheExampleJob = true;
        Task.Run(() => new ExampleJob().Run());
    }
}

public class ExampleJob
{
    public static bool RunTheExampleJob;

    public override void Run()
    {
        while (RunTheExampleJob)
        {
            DoWork();
            Thread.Sleep(10000);
        }
    }

    private void DoWork()
    {
        ... // here I perform the actual work
    }
}

ExampleJobStarter现在已在我的Sitecore配置文件中注册,可以每10分钟运行一次。我还ExampleJob从Sitecore配置中删除了它,因此它不会自动运行(因此,它本身不再是Sitecore作业)。ExampleJobStarter只会确保ExampleJob在另一个线程中运行。ExampleJob本身将每隔10秒执行一次工作,而不会受到仍然作为普通后台代理运行的低优先级工作代理的干扰。

如果您走这条路,请注意死锁问题(在这种情况下,这不是我正在使用的数据的问题)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章