通过参数控制Hangfire并发
Control Hangfire concurrency by a parameter
我有一个 hangfire 作业按以下方式排队:
BackgroundJob.Enqueue(() => AnalyzeRequest(request));
request
对象包含一个 userName
字符串类型字段。
我希望允许并行分析请求,只要它们在 userName
字段中具有不同的值,但是属于同一用户的请求应该一个接一个地分析。因为我想保持不同用户请求的并发性,所以我不想使用 DisableConcurrentExecution
属性。理想情况下,我想做这样的事情:
[DisableConcurrentExecution(request => request.userName)]
是否有任何内置方法可以实现此目的?
谢谢
我很确定 hangfire 不能按用户名或参数对它们进行分组,让它们按顺序执行(这是可能的,但看起来很糟糕 - 你应该在完成时在作业中创建作业,但这可能会失败并出现一堆骇人听闻的代码)。
我建议您做的是在 AnalyzeRequest() 方法中管理它。
例如,您可以创建用户名及其各自锁定对象的共享字典。并在执行时对此对象调用 Monitor.TryEnter。如果输入成功 - 继续,否则 - 优雅地放弃工作。
是的,它会创建 "empty" 个作业调用,但是 hangfire 可以很好地处理这个空调用。
我有一个 hangfire 作业按以下方式排队:
BackgroundJob.Enqueue(() => AnalyzeRequest(request));
request
对象包含一个 userName
字符串类型字段。
我希望允许并行分析请求,只要它们在 userName
字段中具有不同的值,但是属于同一用户的请求应该一个接一个地分析。因为我想保持不同用户请求的并发性,所以我不想使用 DisableConcurrentExecution
属性。理想情况下,我想做这样的事情:
[DisableConcurrentExecution(request => request.userName)]
是否有任何内置方法可以实现此目的?
谢谢
我很确定 hangfire 不能按用户名或参数对它们进行分组,让它们按顺序执行(这是可能的,但看起来很糟糕 - 你应该在完成时在作业中创建作业,但这可能会失败并出现一堆骇人听闻的代码)。
我建议您做的是在 AnalyzeRequest() 方法中管理它。 例如,您可以创建用户名及其各自锁定对象的共享字典。并在执行时对此对象调用 Monitor.TryEnter。如果输入成功 - 继续,否则 - 优雅地放弃工作。
是的,它会创建 "empty" 个作业调用,但是 hangfire 可以很好地处理这个空调用。