Die Implementierung von Redis#subscribe
ist eine Schleife, die die Kontrolle über den aktuellen Thread übernimmt, um Ereignisse abzuhören. Dies bedeutet, dass der Boot-Prozess angehalten wird, wenn ein Abonnement wie gezeigt in den Kontext einer Rails-Klasse verschoben wird.
Sie könnten versuchen, den Aufruf in einen Thread zu verpacken, aber dieser Ansatz würde jedes Mal, wenn diese Klasse in einem neuen Prozess geladen wird, buchstäblich ein neues Abonnement erstellen, z. B. eine Rails-Konsole oder mehrere Einhörner. Außerdem müssten Sie auf den gemeinsamen Zustand und andere Threading-Probleme achten. Das ist wahrscheinlich nicht das, was Sie wollen.
Am besten starten Sie einen anderen Prozess, der die Rails-Umgebung lädt und Redis abonniert, getrennt von den Prozessen, die Webanforderungen bedienen. Es könnte eine Rake-Aufgabe wie die folgende sein:
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