DisableConcurrentExecution
和 和有Worker Count = 1
什么区别?
我设置Worker Count = 1
了我的BackgroundJobServerOptions
但似乎两个作业都执行了(只有一个队列)。如果可以运行多个作业,设置此值有什么意义?
我们将 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)))
我已经设置了一个要在此时运行的重复作业,但我想在另外 2 个特定时间重复它。我该怎么做?
app.UseHangfireDashboard();
RecurringJob.AddOrUpdate<TerminaTurnos>(t => t.Termina(), Cron.Daily(22, 10), TimeZoneInfo.Local);
Run Code Online (Sandbox Code Playgroud) 有谁知道 Hangfire 在设置定期作业时使用的默认时区?我怀疑它是 UTC 而不是主机服务器的时区。
我在 .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 执行旧代码?
我真的很感激任何帮助。谢谢!
我有一个功能 -
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) 我有很多 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
本身并触发它,以便它更新这些值?
在我的ASP.NET MVC应用程序中,我将运行后台任务,有时持续约10分钟.我已经阅读了这个主题,看到应用程序域有时会重新启动,从而删除我的线程.
所以我找了一些解决方案.我找到的主要解决方案是Hangfire.我知道它会在失败等情况下重新启动作业,但是他们会以某种方式"绕过"应用程序域重新启动,还是只在这种情况下重新启动作业?
我是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) 我正在尝试为 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)
但它不起作用。此扩展方法不存在。我错过了什么吗?
我\xe2\x80\x99继承了一个使用Hangfire和sql server作业存储的系统。通常,当计划立即运行作业时,我们会注意到它需要几秒钟的时间才能触发\xe2\x80\x99s。
\n在我的开发环境中运行时查看 SQL Profiler,针对 Hangfire 数据库运行的 SQL 如下所示 -
\nexec 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) hangfire ×12
c# ×5
asp.net-core ×4
.net ×3
asp.net ×2
asp.net-mvc ×2
.net-core ×1
appdomain ×1
cron-task ×1
delegates ×1
ravendb ×1
redis ×1
sql-server ×1
timezone ×1