是否有人使用具有相同SQL DB的Hangfire(在不同应用程序中)的多个实例进行配置。因此,我不想为每个hangfire实例创建新的SQL DB,而是希望与多个实例共享相同的DB。
根据hangfire documentation here,自v1.5起支持它。但论坛讨论here和here表明我们仍然遇到运行多个具有相同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的实例将使用配置队列名称?
答案 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侦听的队列,然后在创建作业时指定该队列。这听起来不像你想要完成的。