Tag: hangfire

如何从Lambda表达式的String动态创建方法

我的最终目标是创建一个函数,将函数方法名称动态传递给Hangfire库中的类。 例如,以下是非动态代码: RecurringJob.AddOrUpdate(() => myFunction(), Cron.Hourly) AddOrUpdate的第一个参数的类型是Expression 。 我的第一步是使用reflection来动态插入函数名称: Type thisControllerType = this.GetType(); MethodInfo method = thisControllerType.GetMethod(methodName); //methodName passed as string parameter RecurringJob.AddOrUpdate(() => method.Invoke(this, null), Cron.Hourly); 当我检查Hangfire仪表板时,似乎该表达式被评估为MethodBase.Invoke 。 所以我需要帮助动态传递方法名称。 这可能足以回答我的问题,但我采取的另一条路径是尝试为参数生成整个表达式。 RecurringJob.AddOrUpdate(CreateCallExpression(method), Cron.Hourly); public Expression CreateCallExpression(MethodInfo method) { //trying to pass in zero argument parameter, not sure if this syntax is correct var parameter = […]

设置Hangfire成功的作业到期属性不起作用

我正在使用Hangfire来做工作,我想改变一天后从数据库中删除成功作业的行为 – 我希望它们存储一年。 按照此线程中的说明,这与此SO问题中的相同,我创建了一个类: public class OneYearExpirationTimeAttribute : JobFilterAttribute, IApplyStateFilter { public void OnStateUnapplied(ApplyStateContext context, IWriteOnlyTransaction transaction) { context.JobExpirationTimeout = TimeSpan.FromDays(365); } public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction) { context.JobExpirationTimeout = TimeSpan.FromDays(365); } } 我在我的Asp.net web api启动类中将其注册为全局filter: public class Startup { public void Configuration(IAppBuilder app) { // … other stuff here … GlobalJobFilters.Filters.Add(new OneYearExpirationTimeAttribute()); GlobalConfiguration.Configuration.UseSqlServerStorage(“HangFireDBConnection”); […]

在HangFire中设置“按需”唯一作业

在Hangfire中,我已经成功设置了定期作业,并且如果我愿意,我可以手动触发,这要归功于Web UI及其“触发”按钮。 RecurringJob.AddOrUpdate(..); 但是我愿意设置一个永远不会自动解雇的工作。 仅限WebUi的需求。 将其视为一组仅在需要时触发的维护任务。 手动。 我想在await状态下添加一个非重新安排的Job,但是无法(听起来不对)。 Hangfire可以“仅按需”工作吗?

每8天在Hangfire中执行一个定期工作

是否有可能在Hangfire中创建一个在给定天数后执行的定期作业,比如8。 我发现最接近的是一周内执行一次工作 – RecurringJob.AddOrUpdate(“MyJob”,() => ScheduledJob(), Cron.Weekly()); 了解Hangfire也接受标准的CronExpression ,我试过探索这个频率的cron表达式但是找不到它 – https://en.wikipedia.org/wiki/Cron 一个丑陋的解决方案可能是创建3或4个工作,相应地在某些日期执行一次,但我不想这样做。 请给我任何建议。

Hangfire Dashboard授权配置不起作用

我已经下载了nu-get软件包Hangfire.Dashboard.Authorization 我正在尝试按照以下文档配置基于OWIN的授权,但我得到intellisense错误DashboardOptions.AuthorizationFilters is obsolete please use Authorization property instead 我也得到intellisense错误The type or namespace AuthorizationFilter and ClaimsBasedAuthorizationFilterd not be found using Hangfire.Dashboard; using Hangfire.SqlServer; using Owin; using System; namespace MyApp { public class Hangfire { public static void ConfigureHangfire(IAppBuilder app) { GlobalConfiguration.Configuration .UseSqlServerStorage( “ApplicationDbContext”, new SqlServerStorageOptions { QueuePollInterval = TimeSpan.FromSeconds(1) }); var options = new DashboardOptions […]

计划任务限制(或如何实现任务持久性)?

我已经开始阅读Hangfire文档,但没有发现任务限制。 正如声明的那样,任务(或作业)存储在某处。 因为他们只是代表,所以唯一可以存储,据我所知,是一个代表“身体”(IL?)。 但是可能存在闭包,它为任务提供了一些上下文,例如,一些外部服务,可能需要加载额外的程序集来运行它们的代码等。 Hangfire如何处理这个问题? 任务可以包含其正文中的任何说明,还是有任何限制?

具有返回值的Hangfire背景作业

我正在从Task.Run切换到Hangfire 。 在.NET 4.5+中, Task.Run可以返回Task ,它允许我运行返回void以外的任务。 我通常可以通过访问MyReturnedTask.Result属性来等待并获得我的任务结果 我的旧代码示例: public void MyMainCode() { List listStr = new List(); listStr.Add(“Bob”); listStr.Add(“Kate”); listStr.Add(“Yaz”); List<Task> listTasks = new List<Task>(); foreach(string str in listStr) { Task returnedTask = Task.Run(() => GetMyString(str)); listTasks.Add(returnedTask); } foreach(Task task in listTasks) { // using task.Result will cause the code to wait for the task […]

如何安全地将Hangfire重置为干净状态?

我有一个安装了Hangfire的服务器。 我有一段时间没有检查它,似乎一个重复的工作已经流氓。 它停止工作,然后它重叠了重试,导致看起来完全锁定。 我想清除我的数据库并重新开始。 我可以删除所有表中的数据,还是应该删除表,让Hangfire为我重新创建它们? 这样做会冒任何风险吗? Hangfire.State使用整个Azure Basic数据库2GB的空间。

Hangfire.Autofac与MVC应用程序 – 注入失败

我正在尝试创建一个简单的Hangfire测试,但它无法正常工作。 这是所有重要的代码,以及我如何使用Hangire.Autofac配置它。 不知道我在这里缺少什么。 我在/ hangfire dashbaord中获得的例外也在下面。 public class AmazonSqsService : IAmazonSqsService { private readonly IBackgroundJobClient _backgroundJobClient; private readonly ILogService _logService; public AmazonSqsService(IBackgroundJobClient backgroundJobClient, ILogService logService) { _backgroundJobClient. = backgroundJobClient; _logService= logService; } public async Task Test() { return _backgroundJobClient.Enqueue(() => Looper()); } public void Looper() { while (true) { _logService.Info(“In Looper Loop”); Thread.Sleep(5000); } } […]

Hangfire很容易加载程序集

上下文 我有两个应用程序,一个是我的主要企业应用程序,另一个是我有hangfire(hangfire服务器,客户端和仪表板)托管。 我的主应用程序也使用hangfire执行一些长任务并异步执行它们。 两者都使用相同的DB进行HF存储。 并且只有一个HF服务器。 问题 我间歇性地得到以下错误 – “无法将状态更改为’处理’:找不到目标方法。” 要么 “无法将状态更改为’已排队’:找不到目标方法。” 以下详细信息 – System.IO.FileNotFoundException 无法加载文件或程序集“MyApp.Hangfire,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”或其依赖项之一。 该系统找不到指定的文件。 MyApp.Hangfire是我的hangfire应用程序执行作业。 而且我确信它存在,甚至一些成功的工作也证实了这一点。 请查看附带的屏幕截图以获取更多详细信 意见 问题不一致,作业并不总是失败,有时会失败,重新排队并通过,有时当它没有重试时甚至会失败。 如截图所示