我有一个通过以下方式入队的hangfire作业:
BackgroundJob.Enqueue(() => AnalyzeRequest(request));
request
对象包含一个userName
字符串类型字段。
我想允许对请求进行并行分析,只要它们在userName
字段中具有不同的值即可,但是属于同一用户的请求应一个接一个地进行分析。由于我想为不同的用户请求保留并发性,因此我不想使用DisableConcurrentExecution
属性。理想情况下,我想做这样的事情:
[DisableConcurrentExecution(request => request.userName)]
有没有内置的方法来实现这一目标?
谢谢
答案 0 :(得分:1)
我很确定hangfire不能按用户名或参数对它们进行分组,让它们按顺序执行(这是可能的,但看起来很糟糕-您应该在作业内部创建作业,但是这样做可能会失败并附带一个一堆hacky代码)。
我建议您做的是-在AnalyzeRequest()方法中进行管理。 例如,您可以创建用户名及其各自的锁定对象的共享词典。并在执行时在此对象上调用Monitor.TryEnter。如果成功输入-请继续,否则-放弃工作。
是的,它将创建“空”作业发票,但是hangfire可以很好地处理此空呼叫。