在单个数据库中使用hangfire的多个实例

LP1*_*P13 2 hangfire

是否有人在同一SQL DB上使用过多个Hangfire实例(在不同的应用程序中)以进行配置。因此,我不想为每个hangfire实例创建新的SQL DB,而是与多个实例共享同一数据库。

根据此处的hangfire 文档,自v1.5开始支持。但是此处此处的论坛讨论显示,使用相同的数据库运行多个实例仍然存在问题

更新1
因此,根据建议和文档,我将hangfire配置为使用队列

   public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
   ILoggerFactory loggerFactory)
   {
        app.UseHangfireServer(new BackgroundJobServerOptions()
        {
            Queues = new string[] { "instance1" }
        });
   }
Run Code Online (Sandbox Code Playgroud)

调用方法

[Queue("instance1")]
public async Task Start(int requestID)
{

}
Run Code Online (Sandbox Code Playgroud)

这就是我加入工作的方式

 _backGroundJobClient.Enqueue<IPrepareService>(x => x.Start(request.ID));
Run Code Online (Sandbox Code Playgroud)

但是,当我检查[JobQueue]表时,新作业具有队列名称,default并且由于该hangfire,它将永远不会拾取该作业,因为它会拾取队列中的作业。

我认为是一个错误

更新2

再发现一件事。我正在使用的实例IBackgroundJobClient。该实例由.Net Core的内置容器自动注入。

因此,如果我使用实例来排队工作,那么hangfire将使用default队列名称创建新工作

 _backGroundJobClient.Enqueue<IPrepareService>(x => x.Start(request.ID));
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用静态方法,那么hangfire将使用配置的队列名称创建新作业 instance1

  BackgroundJob.Enqueue<IPrepareService>(x => x.Start(prepareRequest.ID));
Run Code Online (Sandbox Code Playgroud)

我如何在.Net Core中配置hangfire,以便IBackgroundJobClient实例将使用配置队列名称?

pla*_*ted 5

只需为每个实例使用不同的架构名称设置SQL Server选项,就可以实现此目的。

实例1:

configuration.UseSqlServerStorage(
    configuration.GetConnectionString("Hangfire"),
    new SqlServerStorageOptions { SchemaName = "PrefixOne" }
);
Run Code Online (Sandbox Code Playgroud)

实例2:

configuration.UseSqlServerStorage(
    configuration.GetConnectionString("Hangfire"),
    new SqlServerStorageOptions { SchemaName = "PrefixTwo" }
);
Run Code Online (Sandbox Code Playgroud)

这两个实例使用相同的连接字符串,并将使用设置中指定的前缀创建所有必需表的两个实例。

队列用于在同一Hangfire实例中具有单独的队列。如果要使用其他队列,则需要指定希望IBackgroundJobClient侦听的队列,然后在创建作业时指定该队列。这听起来不像您要完成的任务。

  • 很有用。我以为队列可以用来隔离不同的应用程序,但后来我发现在 HF 队列中只有在单个应用程序中才有用。模式是解决问题的最佳方式。谢谢 (2认同)