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.