Имам следната структура на работата в моето приложение 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 да вземе предвид този нов идентификатор на задание, вместо оригиналния?