Mam do zaimplementowania w serwisie powiadomienia mailowe w reakcji na różne zdarzenia.
Część z nich jest full synchroniczna - w reakcji na jakiś create czy update - i do nich Observer + ActionMailer wystarcza.
Ale część z nich nie jest związana z konkretnym requestem/responsem - np. “powiadamiaj x godzin przed upływem czasu”.
Podejrzewam, że potrzebuję jakiegoś skryptu działającego w tle i mającego dostęp do środowiska Rails? Czy macie jakieś doświadczenie jak to zaimplementować i nie zamulić serwera?
Możesz skorzystać z crona, który będzie działał sobie w tle i okresowo wykonywał zadania.
Najprościej jest skorzystać ze script/runner, który umożliwia uruchamianie kodu w railsowym środowisku.
/home/my_project/log/script.log 2>&1’[/code]
Co uruchomi nam zawsze o 3:25 funkcję UserMailer.notify_something (czyli dowolny kod korzystający z railsowego środowiska), no i log nam zapisze do script.log. Oczywiście można ustawić, żeby skrypt wykonywał się np co 5 minut, wtedy mamy:
Ja uzywam backgroundrb, ale sprawdz sobie railscasts.com#127, #128, #129 bo moze te techniki lepiej rozwiaza Twoj problem. Zwlaszcza #128 wyglada ciekawie. Zobacz tez na OpenWFEru.
Dzięki za odpowiedzi! RailsCasty - dokładnie czego szukałem. Na razie stanęło na daemons.
@tjeden: z tego co już teraz wiem (hehe teraz to mądrala :)) to z cronem problem jest taki - każde uruchomienie skryptu, to od nowa ładowanie środowiska Rails. Przy rzadkich zadaniach to pewnie bez znaczenia, ale przy uruchamianiu zadania raz na minutę korzystniejszy może być daemon chodzący cały czas z załadowanym Railsem.
Ja stosuję i polecam latający sobie w tle serwerek DRb z Rufus-Schedulerem (nowa nazwa na OpenWFEru Scheduler) - patrz moja prezentacja na tegorocznym Euruko, jak się odezwiesz mailowo mogę Ci podesłać PDFa i działający przykładowy kod (do podobnego zadania: wysyłania wiadomości na godzinę przed daną imprezą).
A generalnie żeby mieć dostęp do danych railsowych - w tym modeli AR - to po prostu sobie zrób require ‘config/environment.rb’ i tyle. Uwaga, mocno wydłuża czas startu i zwiększa pamięciożerność (ładuje całą aplikację RoR w końcu).