问题描述
我正试图在我的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));
}
}