Hangfire自定义状态到期

Voo*_*Voo 6 c# hangfire

我实现了一个自定义状态“已阻止”,该状态在满足某些外部要求之后将进入排队状态。

有时,这些外部要求从未得到满足,这导致作业陷入阻塞状态。我想让处于这种状态的作业在经过一段可配置的时间后自动过期。

有这种要求的支持吗?有一个ExpirationDate领域,但是从代码来看,它似乎仅用于final状态。

状态非常简单:

    internal sealed class BlockedState : IState
    {
        internal const string STATE_NAME = "Blocked";

        public Dictionary<string, string> SerializeData()
        {
            return new Dictionary<string, string>();
        }

        public string Name => STATE_NAME;

        public string Reason => "Waiting for external resource";

        public bool IsFinal => false;

        public bool IgnoreJobLoadException => false;
    }
Run Code Online (Sandbox Code Playgroud)

并简单地用作 _hangfireBackgroundJobClient.Create(() => Console.WriteLine("hello world"), new BlockedState());

在稍后的阶段,然后通过 _hangfireBackgroundJobClient.ChangeState(jobId, new EnqueuedState(), BlockedState.STATE_NAME)

jbl*_*jbl 5

我会以DelayedJobSchedulerIBackgroundProcess为例进行自定义实现 ,它会定期拾取延迟的作业并将其排入队列。

在此自定义实现中,我将使用 aJobStorageConnection.GetAllItemsFromSet("blocked")来获取所有被阻止的作业 ID(其中DelayedJobScheduler使用JobStorageConnection.GetFirstByLowestScoreFromSet

然后我会使用 获取每个被阻止的作业数据JobStorageConnection.GetJobData(jobId)。对于它们中的每一个,根据其CreatedAt字段,如果作业未过期,我将不执行任何操作,或者Failed如果作业已过期,则将其状态更改为另一个状态(?)。

自定义作业流程可以这样声明:

       app.UseHangfireServer(storage, options, 
             new IBackgroundProcess[] { 
                        new MyCustomJobProcess(
                                myTimeSpanForExpiration, 
                                (IBackgroundJobStateChanger) new BackgroundJobStateChanger(filterProvider)) });
Run Code Online (Sandbox Code Playgroud)

这里的一个困难是获取 an ,IBackgroundJobStateChanger因为服务器似乎没有公开自己的。如果您FilterProvider为服务器使用自定义选项,则将其值传递为filterProvider,否则使用(IJobFilterProvider) JobFilterProviders.Providers