首页 > 解决方案 > AspNet 样板:Hangfire 队列

问题描述

我正在尝试在我的 AspNet Zero 项目中使用Hangfire 队列。

我将后端配置为仅处理特定队列,如本例所示:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHangfireServer(options =>
    {
        options.Queues = new[] { "alpha", "beta", "default" };
    });
}

但是,将 应用于QueueAttributeExecute()方法,似乎并未指定应在哪个队列上处理作业。Hangfire 数据库中的条目始终为default.

public class TestJob : BackgroundJob<int>, ITransientDependency
{
    [Queue("alpha")]
    public override void Execute(int number)
    {
        // Do something
    }
}

该作业根据 ABP 文档排入队列:

public class MyService
{
    private readonly IBackgroundJobManager _backgroundJobManager;

    public MyService(IBackgroundJobManager backgroundJobManager)
    {
        _backgroundJobManager = backgroundJobManager;
    }

    public void Test()
    {
        _backgroundJobManager.Enqueue<TestJob, int>(42);
    }
}

入队时如何指定作业队列?

标签: aspnetboilerplatehangfire

解决方案


无法使用 ABP 指定队列名称,因为框架将使用依赖注入来解析IBackgroundJob<TArgs>HangfireBackgroundJobManager的类型

使用 DI 时,interface必须用[Queue("your_queue"]属性修饰,并且我们无法访问IBackgroundJob此级别的接口,原因很明显。

我通过直接使用 Hangfire 解决了这个问题。编码:

public interface ITestJob : ITransientDependency
{
    [Queue("alpha")]
    public void Execute(int number);
}
public class TestJob : ITestJob, ITransientDependency
{
    public void Execute(int number)
    {
        // Do something
    }
}
using Hangfire;

public class MyService
{
    public MyService()
    {
    }

    public void Test()
    {
        BackgroundJob.Enqueue<ITestJob>(x => x.Execute(42));
    }
}

推荐阅读