【问题标题】:AspNet Boilerplate: Hangfire QueuesAspNet 样板:Hangfire 队列
【发布时间】:2020-10-07 19:50:16
【问题描述】:

我正在尝试在我的 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);
    }
}

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

【问题讨论】:

  • 尝试使用 hangfire 的 IBackgroundJobClient 来启动作业
  • 你试过这样的**静态方法吗? BackgroundJob.Enqueue&lt;TestJob&gt;(x =&gt; x.Execute(123))
  • @RajithaKithuldeniya:是的,这就是下面给出的答案。

标签: aspnetboilerplate hangfire


【解决方案1】:

不能使用 ABP 指定队列名称,因为框架将使用依赖注入来解析类型 IBackgroundJob&lt;TArgs&gt; int 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));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多