我正在开始使用 Hangfire 并将其构建为在控制台应用程序而不是 aspnet 中运行后台作业。我看到 sqlstorage 有后台进程,想添加一个额外的进程。有一个关于
AddHangfireServer
包含额外进程的争论,但是,它需要 JobStorage。配置服务时JobStorage.Current
会引发异常Current JobStorage instance has not been initialized yet
。我确实发现我可以创建 SqlStorage 的后代并向 GetComponents
添加一个项目,但它被标记为“已过时”。我如何使用非过时的方法来设置它?
private static void Main(string[] args) {
var host = Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((ctx, cb) => ConfigBuilder(cb, args))
.ConfigureServices((ctx, svcColl) => ConfigureServices(svcColl, ctx.Configuration))
.ConfigureLogging(Configurelogging)
.Build()
.Run();
}
private static void ConfigureServices(IServiceCollection services, IConfiguration cfg) {
var dbcs = cfg.GetValue<string>("ConnectionStrings:DB");
_ = services.AddHangfire(gc => {
_ = gc
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(dbcs);
});
_ = services.AddHangfireServer(JobStorage.Current, new[] { new MyProcess { } });
}
当前JobStorage实例尚未初始化
如此处回答jobstorage未初始化
您应该调用 JobStorage.Current = new 初始化之前的 SqlServerStorage("ConnectionStringName", options) 你的后台作业服务器。
现在关于这个
我看到 sqlstorage 有后台进程,想要添加一个 额外一个
选项1
JobStorage.Current = new SqlServerStorage("connectionString");
_ = services.AddHangfireServer(storage: JobStorage.Current , additionalProcesses: new[] { new MyProcess()} );
选项2
任何在 DI 中注册为 IBackgroundProcess 的类都会自动 添加为附加服务
IBackgroundProcess。 从源代码中,您只需让您的类实现此接口并将其注册到 DI 容器中,它将通过
services.GetServices
询问您的 DI 容器以获取您所做的任何注册。
services.AddTransient<IBackgroundProcess, BackgroundWorker>();
然后在这里就不需要在其他进程下添加它了
JobStorage.Current = new SqlServerStorage("connectionString");
_ = builder.Services.AddHangfireServer(storage: JobStorage.Current);