Używam Rails 4.2 i delayed_job 4.0.6 jako mojego backendu ActiveJob.W Railsach 4.2 sprawdź, czy zadanie jest już zakolejkowane
Mam pracę, którą chciałbym jednorazowo zezwolić tylko w kolejce. Praca, o której mowa, trwa ponad minutę. Jest on składany przez wywołanie zwrotne na modelu. Oddzwanianie będzie uruchamiane znacznie częściej niż zadanie może zostać zakończone. Praca nie musi być kolejkowana więcej niż jeden raz w przyszłości.
Oto kilka pseudokod dla tego, co próbuję osiągnąć.
# app/jobs/refresh_account_cache_job.rb
class RefreshAccountCacheJob < ActiveJob::Base
def before_enqueue
skip if job_already_enqueued
end
def perform
Account.write_to_cache
end
def job_already_enqueued
# ?
end
end
Jeśli instancja zadania jest uruchomiona, gdy jest wywoływana ponownie, powinna być nadal zakolowywana na przyszłość. Poszukuję sposobu, aby zlecić wykonanie kolejnej pracy dla przyszłego uruchomienia maksymalnie 1 raz.
Zakładam, że odpowiedź będzie musiała być specyficzna dla delayed_job, ale jeśli można ją uogólnić na ActiveJob, będzie jeszcze lepiej.
Czy można użyć redis? Tak jak w przypadku, czy zainstalowałeś go na swoim stosie? –
Muszę trzymać się Postgres w tym projekcie. –
Nie prosząc o zastąpienie go, ale jeśli możesz używać redis wraz z Postgres, może być proste rozwiązanie. –