重试 Reactor 中的特定异常
Retry for specific exception in Reactor
我有微服务应用程序。为了协作,每个服务都使用异步消息传递。我知道,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();
}
我不喜欢这里的递归。对此有更好的解决方案吗?
以下每 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();
}
我有微服务应用程序。为了协作,每个服务都使用异步消息传递。我知道,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();
}
我不喜欢这里的递归。对此有更好的解决方案吗?
以下每 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();
}