Spring Boot Scheduled + długo działający proces

0

Cześć.
Mam taki ciekawy case:
Otóż mam @Service, ktory uruchamia się co minutę:

@Scheduled(cron = "0 * * * * *") // tu mi coś smierdzi - bo validator nie rozpoznaje co to jest za czas....
public void sync() {
List<Transaction> transactions =
                    transactionRepository
                            .findByExternalSourceAndTransactionStatusIn(XXX_TRANSACTION, Arrays.asList(TransactionStatus.PAID, TransactionStatus.IN_PROGRESS));
checkCorrectPriceAndSetStatusToInProgressIfPriceIsWrong(xxxTransactions);

A w samej metodzie:

 try {
                XXXAmount xxxAmount = xxxClient.getXXXAmount(transaction, OffsetDateTime.now());
                String tariffId = xxxAmount.getTariffId();
//... jakaś tam logika
transaction.setTransactionStatus(TransactionStatus.IN_PROGRESS);
/// logika dalej
transactionRepository.save(transaction);
} catch(...){

xxxClient strzela do zewnętrzego api i sprawdza, czy bilet parkingowy został opłacony.
Jeśli trwa to bardzo długo, to serwis prawdopodobnie drugi raz odapala metodę i robią sie kwiatki
Efekt jest taki, że klientowi wyskakuje raz, że zapłacił i może wyjechać z parkingu a raz że nie. bo statusy potrafią skakać wte i z powrotem.

Teraz pytanie. czy ktoś miał podbny problem?
Jak synchronizowac takie rzeczy, które sa time consuing, czy wystarczy block synchronized?

Pozdrawiam.

1

Wydaje mi się że taki przypadek powinno się zrobić tak że scheduler nie wykonuje bezpośrednio zapytania do zewnętrznego API tylko dodaje kolejne zadanie do kolejki, jakiś ExecutorService czy coś w tym guście.

0

Jeżeli chcesz aby task wykonywał się co minute i aby kolejny się odpalał tylko po zakończeniu poprzedniego użyj:

@Scheduled(fixedDelay = 60000)
1

Powinieneś przy pobieraniu transakcji oznaczyć ją jako "przetwarzana" tak, aby kolejne odpalenie joba (albo równoległe odpalenie na innej instancji aplikacji) nie spowodowało jej przetworzenia kilkukrotnie. Oczywiście samo przetwarzanie powinieneś zrzucać na osobną pulę wątków, ale to niezależny problem.

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