Hangfire .NET Core-获取排队的工作列表

时间:2018-08-10 05:15:45

标签: c# background-process asp.net-core-webapi hangfire

Hangfire API中是否有一种方法可以获取排队的工作(可能是通过Job ID或其他方式)?

我对此进行了一些研究,但找不到任何东西。

请帮助我。

2 个答案:

答案 0 :(得分:4)

我在Hangfire的官方论坛中找到了答案。

这里是链接: https://discuss.hangfire.io/t/checking-for-a-job-state/57/4

根据Hangfire的官方开发者,awk还为您提供了有关作业,队列和配置的服务器的所有详细信息!

Hangfire仪表板似乎正在使用相同的API。

:-)

答案 1 :(得分:1)

我遇到了一个案例,我想查看特定队列的 ProcessingJobs、EnqueuedJobs 和 AwaitingState 作业。我从来没有找到一种开箱即用的好方法,但我确实发现了一种在 Hangfire 中创建“一组”作业的方法。我的解决方案是将每个作业添加到一个集合中,然后查询匹配集合中的所有项目。当作业达到最终状态时,从集合中移除作业。

这是创建集合的属性:

public class ProcessQueueAttribute : JobFilterAttribute, IApplyStateFilter
{
    private readonly string _queueName;

    public ProcessQueueAttribute()
        : base() { }

    public ProcessQueueAttribute(string queueName) 
        : this()
    {
        _queueName = queueName;
    }

    public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
    {
        if (string.IsNullOrEmpty(context.OldStateName))
        {
            transaction.AddToSet(_queueName, context.BackgroundJob.Id);
        }
        else if (context.NewState.IsFinal)
        {
            transaction.RemoveFromSet(_queueName, context.BackgroundJob.Id);
        }
    }

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

你这样装饰你的工作:

[ProcessQueue("queueName")]
public async Task DoSomething() {}

然后您可以按如下方式查询该设置:

using (var conn = JobStorage.Current.GetConnection())
{
    var storage = (JobStorageConnection)conn;
    if (storage != null)
    {
        var itemsInSet = storage.GetAllItemsFromSet("queueName");
    }
}