【问题标题】:initialization of Hangfire servers for multitenants application为多租户应用程序初始化 Hangfire 服务器
【发布时间】:2018-01-01 08:05:21
【问题描述】:

我在为多租户应用程序添加 Hangfire 服务器时遇到问题。在我的应用程序启动中,我遍历所有租户并为每个租户初始化和添加一组作业。它在每个租户数据库中添加服务器,但作业仅添加到第一个租户数据库。我在其他租户数据库和仪表板中看不到任何工作。以下是我正在尝试的代码:

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();
                }

            }

任何帮助将不胜感激。 谢谢

【问题讨论】:

  • 我认为你应该使用BackgroundJobServerOptions
  • 我正在使用它。您有如何在这种情况下使用它的示例。 @阿里亚
  • 我也在使用 Hangfire,但我没有使用这种方法,但我也在寻找这种方法......试图提供帮助。
  • 好的,谢谢@Aria
  • 如您所知,您将GlobalConfiguration 的SQL 服务器存储配置为第一个tanent 连接,因此所有作业都将在第一个数据库中创建。

标签: c# asp.net-mvc multi-tenant hangfire


【解决方案1】:

默认不支持,所以你应该使用EnqueuedState,如下:

  Hangfire.States.IState state = new Hangfire.States.EnqueuedState
                {
                    Queue = serverName
                };  
  client.Create(() => Console.WriteLine(serverName), state); 

所以为了实际测试,我在 SQL Server 中创建了两个名为 DB1DB2 的数据库并测试以下代码(效果很好):

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); 
     }

上面的代码是运行后的示例我已经看到创建了两个作业但在不同的数据库中,如下图所示:

【讨论】:

  • 但是它将如何帮助重复性工作。我有很多经常性的工作。每周每天等
  • @IrfanTahirKheli 也一样,将name作为第一个参数传递给RecurringJob,就像RecurringJob.AddOrUpdate(name,method,Cron.Yearly);一样
  • 当我使用带有重复作业添加的队列时,它会将多个作业队列添加到同一个数据库。所有数据再次进入第一个数据库
  • 你有没有试过不使用GlobalConfiguration.Configuration,你可以看到我没有在我的示例代码中使用它。
  • 同样的事情。一切都登陆第一台服务器
猜你喜欢
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
  • 2022-06-24
  • 2011-01-18
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 2021-06-08
相关资源
最近更新 更多