Powiedzmy, że chcę wysyłać e-maile lub odtwarzać mapę witryny lub cokolwiek co 4 godziny, jak mam to zrobić w Phoenix lub po prostu z Elixirem?
elixir
phoenix-framework
NoDisplayName
źródło
źródło
Process.send_after
do własnej funkcji, aby można ją było wywołać zarówno z, jakinit
i zhandle_info
?:timer.send_interval
jest w porządku, ale pamiętaj, że interwały będą stałe. Wyobraź sobie więc, że chcesz coś robić co minutę, aw przyszłości sama praca zajmie więcej niż minutę. W takich przypadkach cały czas pracujesz, a kolejka wiadomości staje się nieograniczona. Powyższe rozwiązanie zawsze będzie czekać przez określony czas po zakończeniu pracy.Quantum pozwala tworzyć, znajdować i usuwać zadania w czasie wykonywania.
Co więcej, możesz przekazać argumenty do funkcji zadania podczas tworzenia współdziałania, a nawet zmodyfikować strefę czasową, jeśli nie jesteś zadowolony z UTC.
Jeśli Twoja aplikacja działa jako wiele izolowanych instancji (np. Heroku), istnieją procesory zadań wspierane przez PostgreSQL lub Redis, które również obsługują planowanie zadań:
Oban: https://github.com/sorentwo/oban
Przykład: https://github.com/akira/exq
Toniq: https://github.com/joakimk/toniq
Verk: https://github.com/edgurgel/verk
źródło
Możesz do tego użyć erlcron . Używasz tego jak
A
job
jest krotką 2-elementową. Pierwszy element to krotka reprezentująca harmonogram zadania, a drugi element to funkcja lub MFA (moduł, funkcja, arity). W powyższym przykładzie uruchamiamy:io.fwrite("It's 2 Thursday morning")
co 2 nad ranem w czwartek.Mam nadzieję, że to pomaga!
źródło
Użyłem biblioteki Quantum Quantum -Elixir .
Postępuj zgodnie z poniższymi instrukcjami.
Wszystko gotowe. Uruchom serwer, uruchamiając poniższe polecenie.
źródło
Uważam, że jest
:timer.send_interval/2
nieco bardziej ergonomiczny w użyciu z (GenServer
niżProcess.send_after/4
w przyjętej odpowiedzi ).Zamiast zmieniać harmonogram powiadomień za każdym razem, gdy sobie z nim poradzisz,
:timer.send_interval/2
ustaw interwał, w którym otrzymasz wiadomość w nieskończoność - nie musisz dzwonićschedule_work()
tak, jak korzysta z akceptowanej odpowiedzi.Co 1000 ms (tj. Raz na sekundę)
IntervalServer.handle_info/2
będzie wywoływany, drukuj bieżącycount
i aktualizuj stan GenServer (count + 1
), dając ci dane wyjściowe takie jak:źródło
Poza tym
Process.send_after
możesz także użyć : timer.apply_interval .źródło
Quantum jest świetne, używamy go w pracy jako zamiennika crona z interfejsem feniksa, a także dodajemy zadania w czasie rzeczywistym, co jest bardzo miłe.
źródło