У меня есть следующая структура работы в моем приложении Rails:
def perform(page_ids, email, order_id)
job_ids = []
page_ids.each do |id|
job_ids << ShoeBuilder.perform_async(id, order_id)
end
CheckStatus.perform_async(job_ids, email) unless job_ids.empty?
end
В основном я запускаю N ShoeBuilders, и у меня есть рабочий CheckStatus, который продолжает проверять, все ли эти задания завершены, чтобы отправить электронное письмо пользователю. Вот как выглядит CheckStatus:
def perform(ids, email, order_id)
finished = []
while finished.size < ids.size
ids.each do |id|
status = Sidekiq::Status::status(id)
# We consider finished if it has been completed or failed
if (( Sidekiq::Status::complete?(id) || Sidekiq::Status::failed?(id) ) && !finished.include?(id))
finished << id
end
end
sleep 5
end
Notifier.thanks(email, order_id).deliver
end
Итак, моя проблема заключается в следующем:
ShoeBuilder выполняет некоторую работу, но в какой-то момент, если он не смог найти свою информацию (это рабочий синтаксический анализатор), запустит другой экземпляр ShoeBuilder. И вот моя проблема:
- Когда я запускаю задание ShoeBuilder из другого задания ShoeBuilder, первое завершается. Как я могу этого избежать?
- Если я не могу избежать этого, как я могу сообщить CheckStatus, чтобы он учитывал этот новый идентификатор задания вместо исходного?