Wykonywanie zadań w przyszłości w określonym czasie.

Wykonywanie zadań w przyszłości w określonym czasie.
BA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 259
0

Cześć,

chciałbym zaimplementować mechanizm wysyłania maili do klientów. Na potrzeby przykładu załóżmy taki scenariusz:
W systemie tworzy się jakieś wydarzenie, które odbędzie się o jakiejś określonej dacie X. Chciałbym nasłuchiwać to wydarzenie i godzinę przed jego rozpoczęciem wysłać maila do klienta. W projekcie wykorzystuje Springa więc mógłbym wykorzystać jakieś jego mechaniki. Patrzyłem już na Scheduling, ale to raczej nie odzwierciedla istoty mojego problemu. Nie miałem wcześniej do czynienia z wykonywaniem zadań w przyszłości, dlatego pytam o czym powinienem poczytać, jakie mechanizmy wykorzystać?

PI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2787
1

Hmm.. Z jednej strony nie można powiedzieć, że się będzie reagować na zdarzenie, jeśli jakaś akcja (wysłanie maila) ma się odbyć przed wystąpieniem tego zdarzenia..

Tak czy siak, jest Ci potrzebne info o konkretnej dacie i godzinie tego wydarzenia. Być może dynamiczne tworzenie schedulerów (https://thebackendguy.com/spring-schedule-tasks-or-cron-jobs-dynamically/)? Wtedy, podczas tworzenia informacji o danym wydarzeniu, tworzysz również joba z cronem o 1 godzinę wcześniejszym.
Ewentualnie można kombinować dalej ze Spring Batch / quartz.

JA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

Czy mechanizm powiadamiania będzie uruchomiony na jednej czy wielu maszynach?

JA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 52
0

Czy maszyna będzie restartowana pomiędzy dodaniem, a odbyciem się wydarzenia?

DW
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 65
1

Można zrobić job'a, który będzie się wykonywał przykładowo co dwie minuty i sprawdzał warunek:
now() > eventEstimatedStartDate - 1h. W zależności od rezultatu wysyłasz maila bądź nie.
Nie brzmi to świetnie, ale być może rozwiąże Twój problem.

TS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 394
0

Czego brakuje w Springu? Wydaje się, że powinien wystarczyć na ten problem.

W0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3760
1

Twój problem wymaga jakiegoś persistent scheduler'a, tzn. takiego, który - jeśli się wywali apka i wstanie - to i tak wyśle maila.

I tutaj masz dwa rozwiązania:

  • trzymać w jakiejś trwałej warstwie zadania i je "odhaczać", czyli w momencie startu apki zaczyna działać w tle zadanie które sprawdza czy nie ma w np. bazie danych maili do wysłania o danej godzinie. Przykładowo:
  1. Klient cośtam klika, tworzy się zadanie wysyłki maila na godzinę 13
  2. Job co 5 minut sprawdza, czy są jakieś maile do wysłania po aktualnej godzinie (tzn. jak sprawdzenie jest o godzinie 12:45 to jeśli jest niewysłany mail na godzinę 12:40 to go bierze do wysyłki)
  3. Jeśli Takie maile są, to je wykonuje po kolei i odhacza jako zrobione
  • skorzystać z jakiegoś gotowego rozwiązania które pozwala na wrzucanie tasków do bazy danych, np. Quartz
nowyworek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: świat
  • Postów: 174
0

Możliwości jest wiele.
Można użyć ze springa TaskSchedulera, jak nie będzie się data zmieniać,
@Scheduled na metodzie co będzie sprawdzać czy gotowe,
gruby kaliber to spring batch, ale ja tego nie polecam zbytnio.

Polecam wersję drugą, mało roboty a jak apka scraschuje to przy następnym scanowaniu po prostu wyśle

Escanor16
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 367
1

Cron?

nowyworek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: świat
  • Postów: 174
0
dawid.wiklo4 napisał(a):

Można zrobić job'a, który będzie się wykonywał przykładowo co dwie minuty i sprawdzał warunek:
now() > eventEstimatedStartDate - 1h. W zależności od rezultatu wysyłasz maila bądź nie.
Nie brzmi to świetnie, ale być może rozwiąże Twój problem.

tak właśnie tylko pamiętać o truncate i clocku.

Przykładowo:

Kopiuj
var clock = Clock.systemUtc()
Instant.now(clock).truncatedTo(ChronoUnit.MINUTES) == time.minus(1,ChronoUnit.HOURS).truncatedTo(ChronoUnit.MINUTES)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.