Hangfire是否有一个内存作业存储包?

44

我有一个控制台应用程序用于测试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);
        }
    }
}

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

附加信息:JobStorage.Current 属性值尚未初始化,您必须在使用 Hangfire 客户端或服务器 API 之前设置它。

因此我需要一个作业存储来运行它。但所有的示例都是使用 SQL 存储等方式。有没有一种使用某种内存存储来运行此示例的方法?

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

1
你试过在Google上搜索“Hangfire memory”吗?我在不到10秒钟的时间里找到了你问题的答案。即使你决定这不适合你,还有很多其他易于设置的选项,如SQL Server LocalDB、SQLite和Mongo。 - mason
1
我更新了我的问题。文档也应该更新。祝你有美好的一天。 - Lost_In_Library
NuGet的搜索功能不太好用。建议使用Google/Bing。无论如何,没有必要告诉我们关于文档的问题。您可以提交一个拉取请求来更新它或在他们的GitHub上提出问题。无论如何,我认为他们的文档很好。如果您仔细阅读,"Hangfire.Core is enough" 明确指的是不需要安装主要的 "Hangfire" 包,因为它有一些控制台应用程序不需要的依赖项。而且,在此之前,它明确说明您需要一个作业存储包。对我来说非常清楚。 - mason
我没有编辑你的回答。你没有回答!你有一个问题。问题帖子是用来提问的,回答帖子是用来回答的。这就是我们在Stack Overflow上试图保持事情清晰的方式。你编辑到你的问题中的内容不是问题的一部分(也不是解决方案),只是一些更适合作为评论的想法。这就是为什么我将其编辑掉 - 为了保持你的问题干净,并集中于问题本身。 - mason
我已经阅读了你提供的文档 - 我自己也多次阅读过那个页面,在几个项目中使用了Hangfire。对我来说,文档已经足够清晰明了了。它指出要使用Hangfire.Core,而不是Hangfire。并且它还指出需要一个作业存储包。这很简单明了。但如果你有不同意见,Stack Overflow 不是发泄不满的地方。如果你想更新文档,你可以自己动手或者通过在他们的GitHub仓库上提交问题请求别人来做。在这里声称“有人应该更新它”只会产生噪音。专注于问题! - mason
我看到您在我的解释后,将文本重新编辑到您的问题中。也许您应该说明为什么认为它应该包含在您的问题中,而不是我单方面地撤消它。 - mason
5个回答

67

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

只需添加此NuGet包即可。

然后您就可以像这样使用它 -

GlobalConfiguration.Configuration.UseMemoryStorage();

2
@mason:是的,我也听说了: ),但以防万一...,也许他有点困惑或者什么的,但他发了这个问题,这比谷歌搜索要花更多的精力,所以我想也许他需要我们的答案 :) - Yogi
2
正如作者所指出的那样,内存存储不应该在生产环境中使用。 - Karel Kral
我想利用Hangfire进行持续的后台作业,但我不想在任何地方存储数据。我有自己的日志记录系统。我也不想使用内存存储,因为我的应用程序对内存敏感。我有哪些选择? - Vin Shahrdar
@VinShahrdar - 这在HF中是不可能的,因为HF需要存储。话虽如此,你可以将HF作为一个独立的应用程序运行,这样它就不会影响你的主应用程序。 - Yogi
@Yogi,我不能将它用作单独的应用程序。我知道这违反了最佳实践,但我的要求是在应用程序初始化时启动一个单独的线程,并在该线程中执行源和目标之间的连续文件同步。您认为我应该只使用简单的线程代码吗? - Vin Shahrdar
@VinShahrdar,如果你需要的话可以使用任务并行库(TPL)。(https://learn.microsoft.com/en-us/dotnet/standard/parallel-programming/task-parallel-library-tpl) - Yogi

41

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

如果不满足以上条件,我的排队方法将不会触发。


6
为了让它非常明显:不要忘记使用 "Hangfire" 和 "Hangfire.MemoryStorage" 的声明。 - Ian

9
为了完整起见,Hangfire库的作者添加了一个名为Hangfire.InMemory的新包,并且该版本可在Nuget上获得。 仓库自述文件将其定位为针对生产使用。 引用github仓库URL如下所示:“... Hangfire的高效事务内存存储,数据结构接近其最佳表示。此尝试的结果应该可以实现该存储实现的生产就绪使用并处理内存中处理的特定属性...”。
熟悉的配置概念在这里同样适用:GlobalConfiguration.Configuration.UseInMemoryStorage(); 我个人添加如下:services.AddHangfire(configuration => { configuration.UseInMemoryStorage(); });

1
可以同时使用SQL和InMemory吗? - sabiland

6

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

这个回答中缺失的是完整的代码(适用于.Net Core),需要放在ConfigureServices(..)内:

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

0
对于使用.NET 6控制台应用程序(作为Windows服务)的内存中操作,我使用以下代码,同时还配置了仪表板,如果您希望使用它:
using Hangfire;
using Hangfire.Services;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

await Host
    .CreateDefaultBuilder()
    .ConfigureWebHostDefaults(builder =>
    {
        builder.Configure(app =>
        {
            app.UseHangfireDashboard();

            RecurringJob.AddOrUpdate(() => Console.Write("Easy!"), Cron.Minutely);
        });
    })
    .UseWindowsService()
    .ConfigureServices(services =>
    {
        services.AddHangfire(opt =>
        {
            opt.UseInMemoryStorage();
        });

        services.AddHangfireServer();
    })
    .Build()
    .RunAsync();

这是使用来自Hangfire的官方包 - https://github.com/HangfireIO/Hangfire.InMemory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接