标签: hangfire

Hangfire DisableConcurrentExecution vs Worker Count = 1

DisableConcurrentExecution和 和有Worker Count = 1什么区别?

我设置Worker Count = 1了我的BackgroundJobServerOptions但似乎两个作业都执行了(只有一个队列)。如果可以运行多个作业,设置此值有什么意义?

c# batch-processing hangfire

1
推荐指数
1
解决办法
5504
查看次数

如何将 dbcontext/工作单元发送到 Hangfire 作业过滤器

我们将 Hangfire 用于一些夜间和长时间运行的作业,并且我们正在单独的数据库中跟踪每个作业的其他相关详细信息/元数据,以避免将来出现 Hangfire 升级问题。作业过滤器 ( https://docs.hangfire.io/en/latest/extensibility/using-job-filters.html ) 将帮助我们以更简单的方式跟踪每个作业的状态,但我找不到如何将依赖项发送到作业过滤器的示例。

我们正在使用依赖注入 (DI) 和存储库 + 工作单元模式运行 ASP.NET Core。

我如何能够从作业过滤器中访问数据库上下文(或工作单元,或通过 DI 可用的任何其他项目)?

谢谢

编辑 我创建了一个包含一个小示例项目的存储库,其中概述了我在这里尝试做的事情:https : //github.com/joelpereira/hfjobfilter/tree/master/HFJobFilter

它编译但在线上有错误: .UseFilter(new TypeFilterAttribute(typeof(LogToDbAttribute)))

c# hangfire asp.net-core

1
推荐指数
1
解决办法
1928
查看次数

HangFire 在 3 个给定时间重复执行作业

我已经设置了一个要在此时运行的重复作业,但我想在另外 2 个特定时间重复它。我该怎么做?

app.UseHangfireDashboard();

RecurringJob.AddOrUpdate<TerminaTurnos>(t => t.Termina(),  Cron.Daily(22, 10), TimeZoneInfo.Local);
Run Code Online (Sandbox Code Playgroud)

c# hangfire asp.net-core

1
推荐指数
1
解决办法
2968
查看次数

HangFire 上重复作业的默认时区

有谁知道 Hangfire 在设置定期作业时使用的默认时区?我怀疑它是 UTC 而不是主机服务器的时区。

.net timezone cron-task hangfire

1
推荐指数
1
解决办法
4491
查看次数

旧的 Hangfire 服务器不断返回并运行旧代码

我在 .NET Core 2.2 Web 应用程序中使用 Hangfire.AspNetCore 版本 1.7.25 来执行后台作业。

我在startup.cs的ConfigureServices方法中使用services.AddHanfire和services.AddHangfireServer设置,并在Configure方法中使用app.UseHangfireDashboard。

我在我的一个控制器中编写了代码,允许用户通过单击按钮来安排 Hangfire 作业。该代码类似于以下内容:

var id = client.Schedule(() => Repository.MyJob(), TimeSpan.FromMinutes(1));
Run Code Online (Sandbox Code Playgroud)

通常,当用户单击按钮时,MyJob() 代码首先被发送到 Hangfire Enqueue,然后几乎立即进入处理模式,并执行 MyJob() 代码。但是,最近,如果我更改代码并通过单击按钮执行作业,Hangfire 会忽略新代码并运行旧版本的代码,就好像它已缓存在某处一样。

我还注意到,在仪表板上查看服务器时,Hangfire 不断创建“额外”或“旧”服务器以及新服务器。

我相信,虽然我不是 100% 肯定,但这些旧服务器是执行旧代码的原因。我在 Startup.cs 中编写了以下代码,以便在 Hanfire 初始化后立即删除任何现有服务器:

    IMonitoringApi monitoringApi = JobStorage.Current.GetMonitoringApi();
    foreach (var s in monitoringApi.Servers())
    {
        JobStorage.Current.GetConnection().RemoveServer(s.Name);
    }
Run Code Online (Sandbox Code Playgroud)

上面的代码似乎确实有效,但是,几秒钟后,旧服务器会自动返回 Hangfire 仪表板的服务器列表中,并且旧代码将再次执行。

我在 Hangfire 设置中使用 SQL 存储,并且在执行应用程序之前删除了数据库中的所有 Hangfire 表,因此允许 Hanfire 在重新添加时重新创建它们。我还通过从应用程序中删除 Hanfire 包并重建代码来删除对 Hanfire 的所有引用。我还清除了 Chrome 的缓存文件。我基本上已经尝试了在谷歌搜索中找到的有关此问题的所有内容,但我无法摆脱旧服务器或阻止 Hanfire 执行旧代码。

我知道我不是唯一遇到此问题的开发人员。有没有人找到解决这个问题的方法?有解决办法吗?我怎样才能摆脱那些旧服务器并阻止 Hanfire 执行旧代码?

我真的很感激任何帮助。谢谢!

.net asp.net-mvc hangfire .net-core asp.net-core

1
推荐指数
1
解决办法
1581
查看次数

表达式主体应为“MethodCallExpression”类型

我有一个功能 -

public async Task DoWork(Frequency value) { // do work }
Run Code Online (Sandbox Code Playgroud)

这里的想法是将此功能作为重复作业添加到 Hangfire 中。

显式添加作业是有效的,如下所示 -

RecurringJob.AddOrUpdate("triggerId", () => DoWork(frequency), Cron.Daily())
Run Code Online (Sandbox Code Playgroud)

但是,如果我想创建一个函数来添加触发器

private void AddTrigger(string triggerId, Frequency frequency, Func<Frequency, Task> trigger)
{
    RecurringJob.AddOrUpdate(triggerId, () => trigger(frequency), Cron.Daily());
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误Expression body should be of type 'MethodCallExpression'

当我调试时,它们似乎是同一类型的对象。我在这里缺少什么导致这个错误?

() => trigger(frequency)    {Method = {System.Threading.Tasks.Task <<>m0>b__0()}}   object {System.Func<System.Threading.Tasks.Task>}
() => DoWork(frequency)     {Method = {System.Threading.Tasks.Task <<>m0>b__0()}}   object {System.Func<System.Threading.Tasks.Task>}
Run Code Online (Sandbox Code Playgroud)

c# delegates hangfire

1
推荐指数
1
解决办法
475
查看次数

如何以编程方式立即执行 ReccurringJob?

我有很多 Hangfire 经常性工作,效果很好。

但是,我需要添加功能以允许用户抢占计划并立即运行任务。

这是我的启动:

RecurringJob.AddOrUpdate<SendFilesJob>("SendFilesJob", j => j.Execute(), send_schedule);
Run Code Online (Sandbox Code Playgroud)

我告诉用户作业最后一次运行的时间以及下次运行的时间,如下所示:

using (var connection = JobStorage.Current.GetConnection())
{
    foreach (var recurringJob in connection.GetRecurringJobs())
    {
        //report LastExecution, NextExecution, LastJobState
    }
}
Run Code Online (Sandbox Code Playgroud)

这也显示了当前正在通过 处理作业的时间LastJobState,这很棒。

但是,当用户抢占立即运行任务时,我这样调用它:

BackgroundJob.Enqueue<SendFilesJob>(j => j.Execute());
Run Code Online (Sandbox Code Playgroud)

这可行,但它不会与定期的工作录入报告挂钩;LastJobState因此用户看不到或值的变化LastExecution

有没有办法访问它RecurringJob本身并触发它,以便它更新这些值?

hangfire

0
推荐指数
1
解决办法
3473
查看次数

Hangfire如何处理应用程序域重启?

在我的ASP.NET MVC应用程序中,我将运行后台任务,有时持续约10分钟.我已经阅读了这个主题,看到应用程序域有时会重新启动,从而删除我的线程.

所以我找了一些解决方案.我找到的主要解决方案是Hangfire.我知道它会在失败等情况下重新启动作业,但是他们会以某种方式"绕过"应用程序域重新启动,还是只在这种情况下重新启动作业?

asp.net asp.net-mvc appdomain backgroundworker hangfire

0
推荐指数
1
解决办法
1368
查看次数

该字段未编入索引,无法查询未在Raven.Database.Indexing中编制索引的字段

我是RavenDB和HangFire的新手,我正在创建一个后台任务但是当我查询ravendb文件时出现索引错误,如下所示:

    public static void UpdateDoNotDisturb()
    {
        IList<HotelRoom> rooms = new List<HotelRoom>();
        Hotel project;
        IQueryable<HotelRoom> queryableObj;
        //Update Rooms with DND status and DndUntil greater than now.
        using (var session = MvcApplication.DocumentStore.OpenSession())
        {
            queryableObj = session.Query<HotelRoom, HotelRoom_Search>().Where(x => x.Status == "DND" && x.DndUntilUtc < DateTime.Now).OfType<HotelRoom>();
            //queryableObj = session.Query<HotelRoom, HotelRoom_Search>().Where(x => x.Status == "DND").OfType<HotelRoom>();
            using (var enumerator = session.Advanced.Stream(queryableObj))
            {
                while (enumerator.MoveNext())
                {
                    var room = enumerator.Current.Document;
                    rooms.Add(room);
                }
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

在文件上:

{
  "HotelId": "hotels/1474",
  "RoomNumber": "407",
  "Floor": "4th Floor",
  "Status": "DND", …
Run Code Online (Sandbox Code Playgroud)

c# ravendb hangfire

0
推荐指数
1
解决办法
469
查看次数

Hangfire:缺少 UseSqlServerStorage 方法

我正在尝试为 ASP.NET 代码项目安装 HangFire。

当我按照官方文档(https://www.hangfire.io/blog/2016/07/16/hangfire-1.6.0.html)或其他链接资源(http://www.dotnetjalps.com/2017/ 04/aspnet-core-hangfire-integation.html),听起来很清楚。添加这个

services.AddHangfire(config=>config.UseSqlServerStorage(Configuration.GetConnectionString("MyConnectionString")));
Run Code Online (Sandbox Code Playgroud)

但它不起作用。此扩展方法不存在。我错过了什么吗?

sql-server hangfire asp.net-core

0
推荐指数
1
解决办法
2442
查看次数

为什么 Hangfire 在轮询 SQL Server 作业时每隔几秒等待 15 秒?

我\xe2\x80\x99继承了一个使用Hangfire和sql server作业存储的系统。通常,当计划立即运行作业时,我们会注意到它需要几秒钟的时间才能触发\xe2\x80\x99s。

\n

在我的开发环境中运行时查看 SQL Profiler,针对 Hangfire 数据库运行的 SQL 如下所示 -

\n
exec sp_executesql N\'delete top (1) JQ\noutput DELETED.Id, DELETED.JobId, DELETED.Queue\nfrom [HangFire].JobQueue JQ with (readpast, updlock, rowlock, forceseek)\nwhere Queue in (@queues1) and (FetchedAt is null or FetchedAt < DATEADD(second, @timeout, GETUTCDATE()))\',N\'@queues1 nvarchar(4000),@timeout float\',@queues1=N\'MYQUEUENAME_master\',@timeout=-1800\n\n-- Exactly the same SQL as above is executed about 6 times/second for about 3-4 seconds,\n-- then nothing for about 2 seconds, then: \n\nexec sp_getapplock @Resource=N\'HangFire:recurring-jobs:lock\',@DbPrincipal=N\'public\',@LockMode=N\'Exclusive\',@LockOwner=N\'Session\',@LockTimeout=5000\nexec sp_getapplock @Resource=N\'HangFire:locks:schedulepoller\',@DbPrincipal=N\'public\',@LockMode=N\'Exclusive\',@LockOwner=N\'Session\',@LockTimeout=5000\nexec sp_executesql N\'select top (@count) Value from [HangFire].[Set] with (readcommittedlock, forceseek) …
Run Code Online (Sandbox Code Playgroud)

.net asp.net hangfire

0
推荐指数
1
解决办法
3844
查看次数

是否有带 Redis 的 HangFire 的免费版本?

有没有办法在 Redis 数据库中使用 HangFire 免费版本?

redis hangfire

0
推荐指数
1
解决办法
241
查看次数