pro*_*011 5 c# asp.net-mvc hangfire hangfire-autofac asp.net-core-2.0
我正在Hangfire BackgroundJob使用以下代码在 C# 中创建后台作业。
var options = new BackgroundJobServerOptions
{
ServerName = "Test Server",
SchedulePollingInterval = TimeSpan.FromSeconds(30),
Queues = new[] { "critical", "default", "low" },
Activator = new AutofacJobActivator(container),
};
var jobStorage = new MongoStorage("mongodb://localhost:*****", "TestDB", new MongoStorageOptions()
{
QueuePollInterval = TimeSpan.FromSeconds(30)
});
var _Server = new BackgroundJobServer(options, jobStorage);
Run Code Online (Sandbox Code Playgroud)
它创建 Jobserver 对象,然后,我创建计划、重复作业,如下所示。
var InitJob = BackgroundJob.Schedule<TestInitializationJob>(job => job.Execute(), TimeSpan.FromSeconds(5));
var secondJob = BackgroundJob.ContinueWith<Test_SecondJob>(InitJob, job => job.Execute());
BackgroundJob.ContinueWith<Third_Job>(secondJob, job => job.Execute());
RecurringJob.AddOrUpdate<RecurringJobInit>("test-recurring-job", job => job.Execute(), Cron.MinuteInterval(1));
Run Code Online (Sandbox Code Playgroud)
之后,我想在我的应用程序停止或关闭时删除或停止所有作业。因此,在我的应用程序的 OnStop 事件中,我编写了以下代码。
var monitoringApi = JobStorage.Current.GetMonitoringApi();
var queues = monitoringApi.Queues();// BUT this is not returning all queues and all jobs
foreach (QueueWithTopEnqueuedJobsDto queue in queues)
{
var jobList = monitoringApi.EnqueuedJobs(queue.Name, 0, 100);
foreach (var item in jobList)
{
BackgroundJob.Delete(item.Key);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,上面获取所有作业和所有队列的代码不起作用。它总是返回"default"队列而不返回所有作业。
任何人都可以有想法使用 Hangfire 获取所有作业JobStorage并在应用程序停止时停止这些作业吗?
任何帮助将不胜感激!
谢谢
要获取所有重复作业,您可以使用作业存储(例如通过静态实例或 DI):
using (var connection = JobStorage.Current.GetConnection())
{
var recurringJobs = connection.GetRecurringJobs();
foreach (var recurringJob in recurringJobs)
{
if (NonRemovableJobs.ContainsKey(recurringJob.Id)) continue;
logger.LogWarning($"Removing job with id [{recurringJob.Id}]");
jobManager.RemoveIfExists(recurringJob.Id);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您的应用程序充当单个 Hangfire 服务器,则一旦应用程序停止,所有作业处理都将停止。在这种情况下,它们甚至不需要被删除。
在对多个服务器使用相同 Hangfire 表的多实例设置中,您将遇到并非所有应用程序都具有可用的所有程序集的问题。使用上述方法,Hangfire 尝试反序列化它找到的每个作业,这会导致“找不到程序集”异常。
为了防止这种情况,我使用了以下解决方法,从表“哈希”中加载“键”列。它的格式为“重复作业:{YourJobIdentifier}”。然后,如果需要,作业 ID 用于删除作业:
var queue = 'MyInstanceQueue'; // probably using queues in a multi server setup
var recurringJobsRaw = await dbContext.HangfireHashes.FromSqlInterpolated($"SELECT [Key] FROM [Hangfire].[Hash] where Field='Queue' AND Value='{queue}'").ToListAsync();
var recJobIds = recurringJobsRaw.Select(s => s.Key.Split(":").Last());
foreach (var id in recJobIds)
{
if (NonRemovableJobs.ContainsKey(id)) continue;
logger.LogWarning($"Removing job with id [{id}]");
jobManager.RemoveIfExists(id);
}
Run Code Online (Sandbox Code Playgroud)
PS:为了使其与 EF Core 一起使用,我对 Hangfire.Hash 表使用了Keyless 实体。
| 归档时间: |
|
| 查看次数: |
8636 次 |
| 最近记录: |