在嘗試異步處理時,我發現了一個不尋常的現象。
@Slf4j
@ControllerAdvice
public class ErrorAdvice {
@ExceptionHandler(Exception.class)
public void ex(Exception e) {
log.info("error e = ", e);
}
@ExceptionHandler(CompletionException.class)
public void ex2(CompletionException e) {
log.info("error e = ", e);
}
}
@Service
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
@Transactional
public void save(String name) {
memberRepository.save(new Member(name));
throw new IllegalStateException();
}
}
public class Client {
@Transactional
public void save(String name) {
CompletableFuture.runAsync(() -> memberService.save(name));
}
}
Client 啟動一個事務,CompletableFuture 啟動另一個執行緒,從而啟動一個新系結的事務范圍。
但問題是我無法在 ControllerAdvice 中發現錯誤。現在我認為在實際的應用程式操作中是非常危險的。是什么原因以及如何解決?
在我看來,ControllerAdvice 將控制器包裝為代理,因此即使 Memberservice 進行異步處理,因為它在代理內部,所以不處理例外是沒有意義的。它甚至不留下任何日志。為什么例外被忽略?
uj5u.com熱心網友回復:
你為什么用CompletableFuture.runAsync(() -> memberService.save(name));?
試試看嘛memberService.save(name));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/491599.html
上一篇:帶有SpringMVC和SpringSecurity的Vaadin22
下一篇:Unit_Tests的問題
