hangfire - 如何让 Hangfire 挑选工作在最后一小时内排队?
问题描述
我的要求是只处理最新的工作而忽略旧的工作。如何在 Hangfire 中配置它?
我试过 IApplyStateFilter 来设置 ExpirationAttribute
public class ExpirationAttribute : JobFilterAttribute, IApplyStateFilter
{
private int _hours;
public ExpirationAttribute(int hours)
{
_hours = hours;
}
public void OnStateUnapplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
{
context.JobExpirationTimeout = TimeSpan.FromHours(_hours);
}
public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction)
{
context.JobExpirationTimeout = TimeSpan.FromHours(_hours);
}
}
解决方案
你可以做类似这样的事情:
public class ExpirationAttribute : JobFilterAttribute, IElectStateFilter
{
private int _hours;
public ExpirationAttribute(int hours)
{
_hours = hours;
}
public void OnStateElection(ElectStateContext context)
{
var processing = context.CandidateState as ProcessingState;
if (processing == null)
{
return;
}
if (DateTime.UtcNow - context.BackgroundJob.CreatedAt > TimeSpan.FromHours(_hours))
{
context.CandidateState = new SucceededState(new { }, 0, 0) { Reason = "Execution skipped due to expiration." };
}
}
}
它只是将过期的作业移至成功,而不是处理它们。我根本没有测试过它,但通常应该是正确的。
推荐阅读
- http - WebLogic 为空主机头请求返回错误请求
- python - Airflow Docker 映像未按预期处理 Python 模块
- google-cloud-platform - 如何防止 GCE 实施者删除 SSH/HTTP/HTTPS 防火墙规则?
- linux - 为什么我无法通过这个 linux shell 脚本检测文件是否存在?
- javascript - 我怎样才能使这个实现更短?
- featuretools - 您如何使用特征工具检测或控制变量的危险使用及其转换?
- angular - 我需要帮助来设置角度网站的移动视图
- typescript - 如何将映射的泛型类型转换为打字稿中的元组联合
- class - 如果在 Dart 的不同文件中,继承的类不能使用主类方法
- node.js - 如何使用 vue-ssr-renderer 将服务器数据/上下文传递给 webpack 生成的 Vue SSR 应用程序?