Реализацията на Redis#subscribe
е цикъл, който ще поеме контрола върху текущата нишка, за да слуша събития. Това означава, че процесът на зареждане се спира при пускане на абонамент в контекста на клас Rails по начина, който сте показали.
Можете да опитате да обвиете обаждането в нишка, но този подход буквално ще създаде нов абонамент всеки път, когато този клас се зареди в нов процес, като релсова конзола или множество еднорози. Освен това ще трябва да внимавате за споделеното състояние и други проблеми с нишката. Това вероятно не е това, което искате.
Най-добре е да започнете различен процес, който зарежда средата на rails и се абонира за redis отделно от процесите, обслужващи уеб заявки. Може да е задача за рейк като следната:
namespace :subscribe do
task :redis => :environment do
$redis.subscribe("bravo") do |on|
on.message do |channel, message|
Rails.logger.info("Broadcast on channel #{channel}: #{message}")
OtherClass.some_method # yada yada
end
end
end
end