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

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ć?

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.

0

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

0

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

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.

0

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

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

1

Cron?

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:

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1