Powiadomienia mailowe asynchroniczne

Witam,

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.

Np tworzysz plik tabaluga.jobs:

[code]25 3 * * * bash -c 'cd /home/my_project; script/runner “UserMailer.notify_something” /

/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:

*/5 * * * *

Uruchamiasz crona:

crontab tabaluga.jobs

Lista aktywnych zadań:

crontab - l

Zatrzymanie crona:

crontab -r

Więcej znajdziesz pod adresem: http://pl.wikipedia.org/wiki/Crontab

U mnie takie coś się sprawdza.
Jeśli jest to sposób niezalecany (całkiem możliwe ;)), to chętnie się dowiem dlaczego i poznam coś podobnie prostego.

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ą). :slight_smile:

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).

Tomash: Też chętnie przejrzę tą prezentacje :slight_smile:

Tomash: na razie działa ładnie daemon (+ skrypty z daemon_generator), więc po co przepłacać :wink:

Sorry że jeszcze tego nie wysłałem, ale ostatnio w domu bywam tylko żeby się kimnąć :wink: Do końca tygodnia powinienem się ogarnąć.