检查HangFire.JobStorage是否已实例化

时间:2017-06-06 09:38:34

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

我有一个作为Hangfire客户端的ASP.NET MVC应用程序 - 它将不同的作业排入队列。我正在使用SqlServerJobStorage进行Hangfire使用。

目前我正在处理一个与Hangfire数据库没有连接的情况,并且未来连接的某个地方正在实例化。

目标是我的ASP.NET MVC应用程序应该在此之前继续工作。连接恢复后,它应该开始排队作业。

因此,应用程序将在Global.asax中抛出异常:

Hangfire.GlobalConfiguration.Configuration.UseSqlServerStorage("EshopServiceHangfire");

此外,所有工作入队也会抛出异常:

 BackgroundJob.Enqueue<ISomeClass>(x => x.DoSomethingGreat(JobCancellationToken.Null));

我把Global.asax中的行放在try / catch块中,所以它不会抛出。 当有人排队工作时,我想检查JobStorage.Current,如果它没有初始化,我会尝试使用相同的代码再次启动它:

Hangfire.GlobalConfiguration.Configuration.UseSqlServerStorage("EshopServiceHangfire");

有人知道这样做的方法吗?文档没有关于此的信息。

Hangfire.GlobalConfiguration.JobStorage.IsInitialized

之类的东西

从Job enqueue中捕获异常也是一种方式,但我不喜欢它,因为它抛出非特定的

  

InvalidOperationException:尚未初始化JobStorage.Current属性值。您必须在使用Hangfire客户端或服务器API之前进行设置。

非常感谢那些读过这个地方的人)

2 个答案:

答案 0 :(得分:6)

您可以使用Hangfire.JobStorage.Current静态属性本身来检查Hangfire存储配置:

//InvalidOperationException " JobStorage.Current property value has not been initialized"
var storage = JobStorage.Current;

GlobalConfiguration.Configuration.UsePostgreSqlStorage(vaildConnString);

//no exception
storage = JobStorage.Current;

此外,您可以查询数据库以测试连接:

JobStorage.Current.GetConnection().GetRecurringJobs();

考虑到例外,我认为抛出InvalidOperationException而不是像SqlException这样的东西是正确的。 Hangfire核心与特定数据库的详细信息隔离。

答案 1 :(得分:0)

您好,您可以使用这条路:

1-安装Hangfire -> Hangfire.AspNetCore(v1.7.14)和Hangfire.Core(v1.7.14)

2-注册服务

class Program
{
    static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args)
    {
      return WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
    }
 }

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Add Hangfire services.
        services.AddHangfire(configuration => configuration
            .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
            .UseSimpleAssemblyNameTypeSerializer()
            .UseRecommendedSerializerSettings()
            .UseSqlServerStorage("Server=-; Database=-; user=-; password=-;"));

        // Add the processing server as IHostedService
        services.AddHangfireServer();
     }

3-添加仪表板用户界面

public void Configure(IApplicationBuilder app, IBackgroundJobClient 
                      backgroundJobs, IHostingEnvironment env)
    {
        app.UseHangfireDashboard();
        backgroundJobs.Enqueue(() => Console.WriteLine("Hello world from 
                                                        Hangfire!"));
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
  }

4-运行应用程序 由于我们创建了后台作业,因此以下消息也应出现,其唯一行为是将消息写入控制台。 Hangfire的Hello world!