Управлять параллелизмом Hangfire с помощью параметра - PullRequest
0 голосов
/ 28 января 2019

У меня задание Hangfire ставится в очередь следующим образом:

BackgroundJob.Enqueue(() => AnalyzeRequest(request)); 

Объект request содержит поле userName типа строки.Я бы хотел, чтобы запросы анализировались параллельно, если они имеют разные значения в поле userName, но запросы, принадлежащие одному и тому же пользователю, должны анализироваться один за другим.Поскольку я хотел бы сохранить параллелизм для разных пользовательских запросов, я бы не хотел использовать атрибут DisableConcurrentExecution.В идеале я хотел бы сделать что-то вроде этого:

[DisableConcurrentExecution(request => request.userName)]

Есть ли какой-нибудь встроенный способ добиться этого?

Спасибо

1 Ответ

0 голосов
/ 28 января 2019

Я почти уверен, что hangfire не может сгруппировать их по имени пользователя или параметру, пусть последовательно выполнят их (что возможно, но выглядит очень плохо - вы должны создать задание внутри задания по окончании, но это может дать сбой и идет скуча хакерского кода).

Что я рекомендую вам сделать - это управлять этим внутри вашего метода AnalyzeRequest ().Например, вы можете создать общий словарь имени пользователя и соответствующие им объекты блокировки.И при выполнении вызвать Monitor.TryEnter для этого объекта.Если ввод завершен успешно - продолжайте дальше, в противном случае - изящно покиньте задание.

Да, это создаст "пустые" вызовы заданий, но Hangfire может обработать эти пустые вызовы довольно хорошо.

...