我有微服務應用程式。為了協作,每個服務都使用異步訊息傳遞。我知道,spring data jpa 默認使用樂觀鎖。但是,如果這種方法鎖定不是由用戶呼叫,而是由另一個服務呼叫(在我的示例中,有驗證服務,可以將物件的狀態更新為有效或無效),我想處理例外并重試更新物件。我還必須在這個微服務上使用 webflux 堆疊。現在我有這樣的代碼:
public void updateStatus(String id, EventStatus status) {
eventRepository.findById(id)
.doOnNext(eventDocument -> {
eventDocument.setStatus(status);
eventRepository.save(eventDocument).subscribe();
}).doOnError(OptimisticLockingFailureException.class, exception -> { //Retry in 2 sec if optimistic lock occurs on update
try {
Thread.sleep(2000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
updateStatus(id, status);
})
.subscribe();
}
我不喜歡這里的遞回。有沒有更好的解決方案?
uj5u.com熱心網友回復:
以下每 2 秒重試一次,以防OptimisticLockingFailureException拋出。
private static final int MAX_ATTEMPTS = Integer.MAX_VALUE;
public void updateStatus(String id, EventStatus status) {
eventRepository.findById(id)
.map(eventDocument -> {
eventDocument.setStatus(status);
return eventDocument;
})
.flatMap(event -> Mono.defer(() -> eventRepository.save(eventDocument)
.retryWhen(Retry.backoff(MAX_ATTEMPTS, Duration.ofSeconds(2))
.filter(t -> t instanceof OptimisticLockingFailureException))))
.subscribe();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/334516.html
標籤:爪哇 春天 弹簧数据-jpa 弹簧-webflux 项目反应堆
上一篇:Sonarlint錯誤說:而不是containsKey使用computeIfAbsent
下一篇:SpringSecurityAuthenticationProviderautenticate()回傳null的原因
