De implementatie van Redis#subscribe
is een lus die de controle over de huidige thread overneemt om naar gebeurtenissen te luisteren. Dit betekent dat het opstartproces wordt stopgezet wanneer een abonnement in de context van een Rails-klasse wordt geplaatst op de manier die u hebt laten zien.
Je zou kunnen proberen de oproep in een thread te verpakken, maar deze aanpak zou letterlijk een nieuw abonnement creëren elke keer dat deze klasse in een nieuw proces laadt, zoals een railsconsole of meerdere eenhoorns. Bovendien moet u voorzichtig zijn met gedeelde status en andere problemen met threading. Dit is waarschijnlijk niet wat je wilt.
U kunt het beste een ander proces starten dat de rails-omgeving laadt en zich abonneert op redis, apart van de proces(sen) die webverzoeken dienen. Het kan een rake-taak zijn zoals de volgende:
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