Implementacja Redis#subscribe
to pętla, która przejmie kontrolę nad bieżącym wątkiem w celu nasłuchiwania zdarzeń. Oznacza to, że proces rozruchu jest zatrzymywany po upuszczeniu subskrypcji do kontekstu klasy Rails w sposób, który pokazałeś.
Możesz spróbować zawinąć wywołanie w wątek, ale to podejście dosłownie utworzy nową subskrypcję za każdym razem, gdy ta klasa zostanie załadowana w nowym procesie, takim jak konsola rails lub wiele jednorożców. Ponadto musisz uważać na stan współdzielony i inne problemy z wątkami. To prawdopodobnie nie jest to, czego chcesz.
Najlepiej jest rozpocząć inny proces, który ładuje środowisko Rails i subskrybuje redis niezależnie od procesów obsługujących żądania internetowe. Może to być zadanie prowizji, takie jak:
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