是否有 Hangfire 的内存作业存储包?

Is there an in memory job storage package for Hangfire?

我有一个控制台应用程序来测试 HangFire。这是代码:

using System;
using Hangfire;

namespace MyScheduler.ConsoleApp
{
    internal static class Program
    {
        internal static void Main(string[] args)
        {
            MyMethod();

            Console.WriteLine("[Finished]");
            Console.ReadKey();
        }

        private static void MyMethod()
        {
            RecurringJob.AddOrUpdate(() => Console.Write("Easy!"), Cron.Minutely);
        }
    }
}

但它在 运行 时间抛出异常:

Additional information: JobStorage.Current property value has not been initialized. You must set it before using Hangfire Client or Server API.

所以我需要一个作业存储到 运行 这个。但是 SQL 存储中的所有示例等。有什么方法可以 运行 这个示例使用某种内存存储吗?

JobStorage.Current = new SqlServerStorage("ConnectionStringName", options);  
// to  
JobStorage.Current = new MemoryDbStorage(string.Empty, options);  

您可以使用 Hangfire.MemoryStorage 来实现。

只需添加 this nuget package.

然后你可以像这样使用它 -

GlobalConfiguration.Configuration.UseMemoryStorage();

正如 Yogi 所说,您可以使用 Hangfire.MemoryStorage 或 Hangfire.MemoryStorage.Core(对于 .Net Core)。

该答案中缺少的是需要放入 ConfigureServices(..) 中的完整代码(对于 .Net Core):

var inMemory = GlobalConfiguration.Configuration.UseMemoryStorage();
services.AddHangfire(x => x.UseStorage(inMemory));

对于 NET Core(Web 应用程序):

只是为了让它变得非常明显,因为它对我来说并不明显。

安装以下 nuget 包:

  • Hangfire.AspNetCore (v1.6.17 atow)
  • Hangfire.MemoryStorage.Core (v1.4.0 atow)

在Startup.cs中:

    public void ConfigureServices(IServiceCollection services)
    {
        // other registered services
        ...

        services.AddHangfire(c => c.UseMemoryStorage());
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        // other pipeline configuration            
        ...

        app.UseHangfireServer();

        app.UseMvc();
    }

任何低于上面的内容,我的入队方法都没有触发。

为了完整起见,Hangfire 库的作者添加了一个名为 Hangfire.InMemory 的新包,其版本在 Nuget 上可用。存储库自述文件将其定位为针对生产用途。引用 github repo URL 如下“..Hangfire 的高效事务内存存储,其数据结构接近其最佳表示。此尝试的结果应该支持生产就绪使用此存储实现并处理特定属性内存处理.."

熟悉的配置概念也适用于此: GlobalConfiguration.Configuration.UseInMemoryStorage();

我个人补充如下: services.AddHangfire(configuration => { configuration.UseInMemoryStorage(); });