是否有人在同一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实例将使用配置队列名称?
只需为每个实例使用不同的架构名称设置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侦听的队列,然后在创建作业时指定该队列。这听起来不像您要完成的任务。