Mam aplikację Rails (sieć), która jest potrzebna do dodania subskrybenta (redis) pub/sub.Jak uruchomić subskrybenta subskrypcji programu pubsub w aplikacji Railsowej
Poniżej znajduje się moja klasa PubsubSubscriber, którą muszę uruchomić, a następnie uruchamia się aplikacja.
Połączenie redis jest tworzone w pliku inicjalizacyjnym resque.rb. Próbowałem PubsubSubscriber.new po połączeniu, ale gdy próbuję uruchomić serwer szyn wisi na:
=> Booting Thin
=> Rails 3.2.13 application starting in development on http://0.0.0.0:5000
=> Call with -d to detach
=> Ctrl-C to shutdown server
w przeciwieństwie do tego, kiedy serwer zacznie skutecznie:
=> Booting Thin
=> Rails 3.2.13 application starting in development on http://0.0.0.0:5000
=> Call with -d to detach
=> Ctrl-C to shutdown server
>> Thin web server (v1.5.1 codename Straight Razor)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:5000, CTRL+C to stop
Każdy pomysł dlaczego serwer zawiesza się, gdy próbuję utworzyć instancję klasy PubsubSubscriber w inicjatorze? Czy jest lepsze miejsce na rozpoczęcie tego?
# example modified from https://github.com/redis/redis-rb/blob/master/examples/pubsub.rb
class PubsubSubscriber
def initialize
$redis.psubscribe(:channel_one) do |on|
on.psubscribe do |event, total|
end
on.pmessage do |pattern, event, message|
# message received, kick off some workers
end
on.punsubscribe do |event, total|
end
end
end
end
To normalne, subskrypcja blokuje "na zawsze"; powinieneś uruchomić to z czymś takim jak eventmachine lub innym procesem/wątkiem –
Używam Thin, co brzmi jak handle dla EM, więc nie potrzebuję wyraźnych wywołań EM.run. Próbowałem Thread.new {PubsubSubscriber.new}, ale to też się blokuje. Propozycje? – 99miles
Konstruktor obiektu ** nie ** jest miejscem wykonywania blokowania zdarzeń, a nawet wykonywania innych czynności, takich jak uruchamianie zapytań lub innych. Powinien być używany tylko do zainicjowania obiektu. Nie zdziwiłbym się, gdyby system obiektów Ruby czekał na zakończenie konstruktora, aby obiekt został poprawnie utworzony. Więc spróbuj przenieść to poza konstruktorem i do oddzielnej metody, takiej jak 'start', i uruchom ją jak' Thread.new {PubsubSubscriber.new.start} – Subhas