Hangfire RecurringJob "does not contain a method with signature"
Hangfire RecurringJob "does not contain a method with signature"
我正在使用在我的 WebAPI .NET Framework 4.7.2 应用程序中配置的 Hangfire。
我正在 Global.asax.cs 中配置它
我的依赖注入链是使用 Autofac 配置的。
这是我调用循环作业的方式
RecurringJob.AddOrUpdate<RunnerClass>(nameof(RunnerClass.MyMethod)+"_"+DateTime.UtcNow.ToString("yyMMddHHmmss"), r => r.MyMethod(), "* * * * *", queue: "specialqueue");
我正在尝试确保将其传送到只有我的本地应用程序正在侦听的特殊队列,以避免其他服务器接收此任务。此外,每次启动 WebAPI 项目时我的任务名称都是唯一的,以避免获取一些旧的 dll 缓存(不确定这是否可能)
我的MyMethod
实现如下:
public class RunnerClass
{
public RunnerClass(IDependenciesInjectedByAutofac dependency){
//do something with dependencies
}
public string MyMethod(){
// perform database calls to a database NOT the same where Hangfire schema lives
// log some stuff to Cloud Provider
var storeList = new List<Guid>();
Parallel.ForEach(listOfGuids, g => { storeList.Add(MySubMethod(g)); }
//some more DB stuff and logging
return "finished";
}
public Guid MySubMethod(Guid guid){
// do DB stuff
}
}
这行不通。 运行ning.
时出现以下异常
System.InvalidOperationException: Recurring job can't be scheduled, see inner exception for details. ---> Hangfire.Common.JobLoadException: Could not load the job. See inner exception for the details. ---> System.InvalidOperationException: The type MyNamespace.RunnerClass
does not contain a method with signature MyMethod()
at Hangfire.Storage.InvocationData.DeserializeJob()
--- End of inner exception stack trace ---
at Hangfire.Storage.InvocationData.DeserializeJob()
at Hangfire.RecurringJobEntity..ctor(String recurringJobId, IDictionary`2 recurringJob, ITimeZoneResolver timeZoneResolver, DateTime now)
--- End of inner exception stack trace ---
at Hangfire.Server.RecurringJobScheduler.ScheduleRecurringJob(BackgroundProcessContext context, IStorageConnection connection, String recurringJobId, RecurringJobEntity recurringJob, DateTime now)
现在,当我尝试 运行 通常使用 BackgroundJob
而不是 RecurringJob
时,不会发生这种情况。这很奇怪,因为我 100% 没有其他实例接替我的工作。
还值得一提的是,有时如果我在函数调用中添加一个断点,它就会起作用。从头开始构建函数允许我添加重复作业,但它突然停止工作,没有任何明显原因...
编辑
清理 bin 和 obj 目录似乎有效,直到它不起作用...
我的调用有问题吗?我试图删除 Parallel.ForEach,但无济于事。
当作业正在从正在侦听特定队列的工作程序执行时;只有这个工人需要实施。但是从重复条目创建(和排队)作业将由 any Hangfire 服务器完成。这就是目前失败的原因。为避免此问题,请创建一个仅包含与您的方法匹配的接口的单独项目,并将此接口项目添加到您的所有服务器,并且在重复的作业创建调用中,也仅使用此接口。
在监听特殊队列的服务器中,在 DI 框架中注册您的实现,这样您本地的 Hangfire worker 就知道选择什么来实例化给定接口的 class。
通过这种方法,每个服务器都可以 create/enqueue 作业,但它只会被正在侦听定义的队列名称的工作人员处理。
我正在使用在我的 WebAPI .NET Framework 4.7.2 应用程序中配置的 Hangfire。 我正在 Global.asax.cs 中配置它 我的依赖注入链是使用 Autofac 配置的。
这是我调用循环作业的方式
RecurringJob.AddOrUpdate<RunnerClass>(nameof(RunnerClass.MyMethod)+"_"+DateTime.UtcNow.ToString("yyMMddHHmmss"), r => r.MyMethod(), "* * * * *", queue: "specialqueue");
我正在尝试确保将其传送到只有我的本地应用程序正在侦听的特殊队列,以避免其他服务器接收此任务。此外,每次启动 WebAPI 项目时我的任务名称都是唯一的,以避免获取一些旧的 dll 缓存(不确定这是否可能)
我的MyMethod
实现如下:
public class RunnerClass
{
public RunnerClass(IDependenciesInjectedByAutofac dependency){
//do something with dependencies
}
public string MyMethod(){
// perform database calls to a database NOT the same where Hangfire schema lives
// log some stuff to Cloud Provider
var storeList = new List<Guid>();
Parallel.ForEach(listOfGuids, g => { storeList.Add(MySubMethod(g)); }
//some more DB stuff and logging
return "finished";
}
public Guid MySubMethod(Guid guid){
// do DB stuff
}
}
这行不通。 运行ning.
时出现以下异常System.InvalidOperationException: Recurring job can't be scheduled, see inner exception for details. ---> Hangfire.Common.JobLoadException: Could not load the job. See inner exception for the details. ---> System.InvalidOperationException: The type
MyNamespace.RunnerClass
does not contain a method with signatureMyMethod()
at Hangfire.Storage.InvocationData.DeserializeJob() --- End of inner exception stack trace --- at Hangfire.Storage.InvocationData.DeserializeJob() at Hangfire.RecurringJobEntity..ctor(String recurringJobId, IDictionary`2 recurringJob, ITimeZoneResolver timeZoneResolver, DateTime now) --- End of inner exception stack trace --- at Hangfire.Server.RecurringJobScheduler.ScheduleRecurringJob(BackgroundProcessContext context, IStorageConnection connection, String recurringJobId, RecurringJobEntity recurringJob, DateTime now)
现在,当我尝试 运行 通常使用 BackgroundJob
而不是 RecurringJob
时,不会发生这种情况。这很奇怪,因为我 100% 没有其他实例接替我的工作。
还值得一提的是,有时如果我在函数调用中添加一个断点,它就会起作用。从头开始构建函数允许我添加重复作业,但它突然停止工作,没有任何明显原因...
编辑 清理 bin 和 obj 目录似乎有效,直到它不起作用...
我的调用有问题吗?我试图删除 Parallel.ForEach,但无济于事。
当作业正在从正在侦听特定队列的工作程序执行时;只有这个工人需要实施。但是从重复条目创建(和排队)作业将由 any Hangfire 服务器完成。这就是目前失败的原因。为避免此问题,请创建一个仅包含与您的方法匹配的接口的单独项目,并将此接口项目添加到您的所有服务器,并且在重复的作业创建调用中,也仅使用此接口。
在监听特殊队列的服务器中,在 DI 框架中注册您的实现,这样您本地的 Hangfire worker 就知道选择什么来实例化给定接口的 class。
通过这种方法,每个服务器都可以 create/enqueue 作业,但它只会被正在侦听定义的队列名称的工作人员处理。