C# 多租户应用程序的Hangfire服务器初始化
我面临为多租户应用程序添加Hangfire服务器的问题。在我的应用程序启动中,我循环遍历所有租户,并为每个租户初始化和添加一组作业。它正在每个租户数据库中添加服务器,但作业仅添加到第一个租户数据库。我在其他租户数据库和仪表板中看不到任何工作。以下是我正在尝试的代码:C# 多租户应用程序的Hangfire服务器初始化,c#,asp.net-mvc,multi-tenant,hangfire,C#,Asp.net Mvc,Multi Tenant,Hangfire,我面临为多租户应用程序添加Hangfire服务器的问题。在我的应用程序启动中,我循环遍历所有租户,并为每个租户初始化和添加一组作业。它正在每个租户数据库中添加服务器,但作业仅添加到第一个租户数据库。我在其他租户数据库和仪表板中看不到任何工作。以下是我正在尝试的代码: foreach (var tenant in TenantConvention.GetTenants()) { GlobalConfiguration.Configurati
foreach (var tenant in TenantConvention.GetTenants())
{
GlobalConfiguration.Configuration
.UseSqlServerStorage(DbServer.GetConnectionString(tenant));
var sqlStorage = new SqlServerStorage(DbServer.GetConnectionString(tenant));
app.UseHangfireDashboard($"/dashboard/{tenant}-Jobs", new DashboardOptions
{
Authorization = new[] { new HangfireAuthFilter() }
}, sqlStorage);
var options = new BackgroundJobServerOptions
{
ServerName = tenant//string.Format("{0}.{1}", tenant, Guid.NewGuid().ToString())
};
var jobStorage = JobStorage.Current;
app.UseHangfireServer(options, jobStorage);
var schedulars = ObjectFactory.GetAllInstances();
foreach (var schedular in schedulars) {
schedular.Init();
}
}
任何帮助都将不胜感激。
谢谢默认情况下不支持它,因此您应该使用
排队状态
,如下所示:
Hangfire.States.IState state = new Hangfire.States.EnqueuedState
{
Queue = serverName
};
client.Create(() => Console.WriteLine(serverName), state);
为了进行真正的测试,我在SQL Server中创建了两个名为DB1
和DB2
的数据库,并测试了以下代码(效果很好):
上面的代码是运行后的示例,我看到创建了两个作业,但位于不同的Db中,如下面的屏幕截图所示:
我认为您应该使用
BackgroundJobServerOptions
我正在使用它。您有在这种情况下如何使用它的示例@AriaI也在使用Hangfire,但我没有违反此方法,但我也在寻找此方法…试图提供帮助。好的,谢谢@Arias,你知道你将SQL server存储配置为GlobalConfiguration
到firsttanent
连接。因此,所有作业都将在第一个数据库中创建。但它如何帮助重复作业呢。我有很多经常性的工作。每周每日etc@IrfanTahirKheli同样,将name
作为第一个参数传递给RecurringJob
就像RecurringJob.AddOrUpdate(name,method,Cron.Yearly)代码>当我将队列与定期作业添加一起使用时,它会将多个作业队列添加到同一数据库中。同样,所有的数据都会转到第一个数据库。如果您没有使用全局配置.Configuration
,您可以看到我在示例代码中没有使用它。同样的事情。所有东西都降落在第一个服务器上
string[] connections = new string[] {
"Data Source=localhost;Integrated Security=SSPI;Initial Catalog=DB1",
"Data Source=localhost;Integrated Security=SSPI;Initial Catalog=DB2"};
foreach (string strConnection in connections)
{
string serverName = "str" + DateTime.Now.Ticks;
var sqlStorage = new Hangfire.SqlServer.SqlServerStorage(strConnection);
var options = new BackgroundJobServerOptions
{
ServerName =serverName
};
JobStorage.Current = sqlStorage;
IBackgroundJobClient client = new BackgroundJobClient();
Hangfire.States.IState state = new Hangfire.States.EnqueuedState
{
Queue = serverName
};
client.Create(() => Console.WriteLine(serverName), state);
}