我有以下执行顺序。当调用import时,它会调用perform_tasks然后进入on_complete上的redis订阅循环:
class Record < ActiveRecord::Base
def self.import(params)
peform_tasks params[:record]
on_complete
end
def self.peform_tasks(record_params)
record_params.each do |param|
AddressWorker.perform_async param
end
end
def self.on_complete
redis.subscribe('address_notifier') do |payload|
on_post_execute payload
end
puts 'BUT WE NEVER GET HERE'
end
def self.on_post_execute(payload)
puts 'Yes we get here'
end
end
问题是当块完成执行并且on_post_execute运行时,执行不会离开块。而且我们永远不会接受这条线:
puts 'BUT WE NEVER GET HERE'
为什么我们不在阻挡后到达线?
请注意,使用ruby redis gem中的redis.subscribe
在这里应该是无关紧要的,因为我到了块,它是一个常规的ruby块。
答案 0 :(得分:2)
正如您所指出的,redis.subscribe
的使用并不完全无关紧要。
此方法是loop,在您unsubscribe
之前不会中断。因此,在这种情况下,我并不认为您实际上正在退出该区块,因此您的puts
行不会被执行。
def self.on_complete
redis.subscribe_with_timeout(5, 'address_notifier') do |payload|
on_post_execute payload
redis.unsubscribe
end
puts 'Should get here now'
end
def self.on_post_execute(payload)
puts 'Yes we get here'
end
或者使用subscribe_with_timeout
:
def self.on_complete
redis.subscribe_with_timeout(5, 'address_notifier') do |payload|
on_post_execute payload
end
puts 'Should get here now'
end
def self.on_post_execute(payload)
puts 'Yes we get here'
end