AspNet样板:Hangfire队列

问题描述

我正试图在我的AspNet Zero项目中使用Hangfire Queues

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

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

但是,将QueueAttribute应用于Execute()方法似乎并没有指定应在哪个队列上处理作业。 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);
    }
}

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

解决方法

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

使用 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));
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...