gpt4 book ai didi

hangfire - 如何在运行时确定作业的队列

转载 作者:行者123 更新时间:2023-12-04 17:15:16 33 4
gpt4 key购买 nike

我们的网络应用程序允许最终用户在 UI 上设置重复作业的队列。 (我们为每个服务器创建一个队列(使用服务器名称)并允许用户选择要运行的服务器)作业的注册方式:

RecurringJob.AddOrUpdate<IMyTestJob>(input.Id, x => x.Run(), input.Cron, TimeZoneInfo.Local, input.QueueName);

它工作正常,但有时我们检查 Production 上的日志,发现它运行在错误的队列(服务器)上。我们没有更多的生产访问权限,因此我们尝试在开发中重现,但没有成功。

为了临时解决这个问题,我们需要在作业运行时获取队列名称,然后将其与当前服务器名称进行比较,当它们不同时停止。

是否可能以及如何从 PerformContext 中获取它?

注意:我们使用 HangFire 版本:1.7.9 和 ASP.NET Core 3.1

最佳答案

你可以看看https://github.com/HangfireIO/Hangfire/pull/502

专用过滤器拦截队列更改并恢复原始队列。

我想您可以在一个非常相似的过滤器中停止执行,或者设置一个参数以在 IElectStateFilter.OnStateElection 阶段通过将 CandidateState 更改为完全停止执行失败状态

也许您的问题来自于一个已经存在的过滤器,它弄乱了队列。

这是上面链接中的代码:

    public class PreserveOriginalQueueAttribute : JobFilterAttribute, IApplyStateFilter
{
public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
{
var enqueuedState = context.NewState as EnqueuedState;

// Activating only when enqueueing a background job
if (enqueuedState != null)
{
// Checking if an original queue is already set
var originalQueue = JobHelper.FromJson<string>(context.Connection.GetJobParameter(
context.BackgroundJob.Id,
"OriginalQueue"));

if (originalQueue != null)
{
// Override any other queue value that is currently set (by other filters, for example)
enqueuedState.Queue = originalQueue;
}
else
{
// Queueing for the first time, we should set the original queue
context.Connection.SetJobParameter(
context.BackgroundJob.Id,
"OriginalQueue",
JobHelper.ToJson(enqueuedState.Queue));
}
}
}

public void OnStateUnapplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
{
}
}

关于hangfire - 如何在运行时确定作业的队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68831260/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com