【发布时间】:2018-10-06 10:21:54
【问题描述】:
我想问一下有没有办法定义 HangFire 服务器不应该处理重复的作业?
有两个应用程序(Windows 服务和 Web 应用程序)使用 HangFire 来运行后台作业,因此有两个 Hangfire 服务器(队列定义正确)。
服务仅创建重复作业,并且使用“默认”队列。 Web 应用程序创建了即发即弃的作业,并且它正在使用其他队列(例如 web_app_queue)。
似乎由 Web 应用程序创建的 HangFire 服务器正在尝试调度/处理重复作业,尽管已为其他队列定义,但 Web 应用程序 HangFire 服务器无权访问可用于 Windows 服务的所需程序集。
Web App HangFire 服务器:
var backgroundJobServer = new BackgroundJobServer(new BackgroundJobServerOptions { Queues = new[] { "web_app_queue" } });
Web 应用程序 HangFire 工作:
var client = new BackgroundJobClient();
var state = new EnqueuedState("web_app_queue");
var jobId = client.Create(methodCall, state);
Windows 服务 HangFire 服务器:
var server = new BackgroundJobServer();
Windows 服务 HangFire 作业:
private static void AddRecurringJob<T>(string cronExpression) where T : IJob
{
RecurringJob.AddOrUpdate<T>(job => job.Execute(), cronExpression, TimeZoneInfo.Local);
}
没有为 Windows 服务 HangFire 服务器和作业定义队列名称,因此应用了默认队列(“default”)。
异常信息和详细信息在这里:
message="Recurring job ... can not be scheduled due to job load exception."
detail="Hangfire.Common.JobLoadException: Could not load the job. See inner exception for the details.
---> System.IO.FileNotFoundException: Could not load file or assembly 'XXX.YYY, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.;
at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type);
at System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName);
at System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase);
at Hangfire.Storage.InvocationData.Deserialize();
--- End of inner exception stack trace
at Hangfire.Storage.InvocationData.Deserialize();
at Hangfire.Server.RecurringJobScheduler.TryScheduleJob(JobStorage storage, IStorageConnection connection, String recurringJobId, IReadOnlyDictionary`2 recurringJob);
at Hangfire.Server.RecurringJobScheduler.Execute(BackgroundProcessContext context)"
【问题讨论】:
-
您可能应该发布用于设置队列的代码。
-
感谢您的建议,已更新