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

时间:2017-06-29 17:16:06

标签: hangfire

是否有人使用具有相同SQL DB的Hangfire(在不同应用程序中)的多个实例进行配置。因此,我不想为每个hangfire实例创建新的SQL DB,而是希望与多个实例共享相同的DB。

根据hangfire documentation here,自v1.5起支持它。但论坛讨论herehere表明我们仍然遇到运行多个具有相同db的实例的问题

更新1
所以基于建议和documentation我配置了hangfire来使用队列

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

调用方法

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

}

这就是我排队工作的方式

 _backGroundJobClient.Enqueue<IPrepareService>(x => x.Start(request.ID));

然而,当我检查[JobQueue]表时,新作业的队列名称为default,因为该挂起将永远不会获取该作业,因为它会为队列选择作业。

我认为是一个错误

更新2

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

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

 _backGroundJobClient.Enqueue<IPrepareService>(x => x.Start(request.ID));

但是,如果我使用静态方法,则hangfire会创建具有已配置队列名称instance1

的新作业
  BackgroundJob.Enqueue<IPrepareService>(x => x.Start(prepareRequest.ID));

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

1 个答案:

答案 0 :(得分:5)

只需为每个实例设置不同的模式名称的SQL服务器选项即可。

实例1:

configuration.UseSqlServerStorage(
    configuration.GetConnectionString("Hangfire"),
    new SqlServerStorageOptions { SchemaName = "PrefixOne" }
);

实例2:

configuration.UseSqlServerStorage(
    configuration.GetConnectionString("Hangfire"),
    new SqlServerStorageOptions { SchemaName = "PrefixTwo" }
);

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

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