Jobs in die Warteschlange stellen
Dank JobRunr war der Aufruf der Fire-and-Forget Jobs noch nie so einfach.
Wie Sie bereits aus dem 5-minütigen Intro wissen, müssen Sie nur ein Lambda mit der entsprechenden Methode und ihren Argumenten übergeben, um einen Hintergrundjob in die Warteschlange zu stellen:
JobId jobId = BackgroundJob.enqueue(() -> myService.doWork());
JobId jobId = BackgroundJob.<MyService>enqueue(x -> x.doWork());
Die Enqueue-Methode ruft die Zielmethode nicht sofort auf, sondern führt stattdessen die folgenden Schritte aus:
- Analysieren Sie das Lambda, um die Methodeninformationen und alle ihre Argumente zu extrahieren.
- Serialisieren Sie die Methodeninformationen und alle ihre Argumente.
- Erstellen Sie einen neuen Hintergrundjob basierend auf den serialisierten Informationen.
- Speichern Sie den Hintergrundjob im konfigurierten
StorageProvider
. - Nachdem diese Schritte ausgeführt wurden, kehrt die Methode “BackgroundJob.enqueue” sofort zum Aufrufer zurück. Eine andere JobRunr-Komponente namens “BackgroundJobServer” überprüft den persistenten Speicher auf Hintergrundjobs in der Warteschlange und führt sie zuverlässig aus.
Anstelle der statischen Methode “BackgroundJob.enqueue” können Sie auch die Bean “JobScheduler” verwenden. Es hat genau die gleichen Methoden wie die BackgroundJob-Klasse. Um es zu verwenden, lassen Sie einfach Ihr Abhängigkeitsinjektionsframework eine Instanz der JobScheduler-Bean injizieren und fahren Sie wie zuvor fort:
@Inject
private JobScheduler jobScheduler;
jobScheduler.enqueue(() -> myService.doWork());
Nach wie vor benötigen Sie auch keine Instanz des verfügbaren myService, wenn die MyService-Klasse Ihrem Abhängigkeitsinjektionsframework bekannt ist.
@Inject
private JobScheduler jobScheduler;
jobScheduler.<MyService>enqueue(x -> x.doWork());
Hintergrundjobs in großen Mengen in die Warteschlange stellen
Manchmal möchten Sie viele Jobs in die Warteschlange stellen - zum Beispiel eine E-Mail an alle Benutzer senden. JobRunr kann einen Java 8-Stream
Stream<User> userStream = userRepository.getAllUsers();
BackgroundJob.enqueue(userStream, (user) -> mailService.send(user.getId(), "mail-template-key"));
Stream<User> userStream = userRepository.getAllUsers();
BackgroundJob.enqueue<MailService, User>(userStream, (service, user) -> service.send(user.getId(), "mail-template-key"));
Dies ermöglicht eine gute Integration in das Spring Data-Framework, das Java 8-Streams zurückgeben kann. Auf diese Weise können Elemente inkrementell verarbeitet werden und die gesamte Datenbank darf nicht in den Speicher gestellt werden.
Natürlich können die beiden oben genannten Warteschlangenmethoden auch mit der JobScheduler-Bean ausgeführt werden.
@Inject
private JobScheduler jobScheduler;
Stream<User> userStream = userRepository.getAllUsers();
jobScheduler.enqueue(userStream, (user) -> mailService.send(user.getId(), "mail-template-key"));
@Inject
private JobScheduler jobScheduler;
Stream<User> userStream = userRepository.getAllUsers();
jobScheduler.enqueue<MailService, User>(userStream, (service, user) -> service.send(user.getId(), "mail-template-key"));