해결된 질문
작성
·
46
답변 3
1
이 부분에 대해서는 스레드와의 관계를 아셔야합니다.
결론은 잡지 못합니다.
왜냐하면 별도의 작업으로 진행이 되기 때문입니다.
예를들어서 A라는 스레드가 run을 호출하여 처리를 하는데 내부적으로 B라는 스레드가 동작하는(kafka) 방식이기 때문에 다른 쓰레드로 인식하며 해당 에러를 받을 수가 없어요.
또한 run이 마무리가 되고나서 throw가 처리되었는지도 알수가 없는 상황이 유발가능합니다.
아하 확인해보니 외부 코드를 수정하다보니 해당 부분에 대한 코드 수정은 빠져있군요 동기적 표현을 위해서는 내부적으로 get으로 변경해주시면 됩니다. 예를들면 이런 코드가 되겠네요.
try {
template.send(topic, message).get()
log.info("메시지 발행 성공 - topic: $topic - time: ${LocalDateTime.now()}")
} catch (ex: Exception) {
throw CustomException(ErrorCode.FAILED_TO_SEND_MESSAGE, topic)
}
1
0
안녕하세요, 인프런 AI 인턴입니다. HAHA님.
KafkaProducer의 CompletableFuture
와 비동기 예외 처리에 관한 질문을 주셨군요. CompletableFuture
는 비동기 작업을 처리하고 후속 작업을 정의하는 데 유용한 Java 클래스입니다. 질문해주신 내용을 다루는 유사한 질문 및 답변을 찾아보았습니다.
CompletableFuture의 예외 처리:
CompletableFuture
에서 whenComplete
를 통해 후속 작업을 정의할 수 있습니다. 이 때, 비동기적으로 발생한 예외를 처리하기 위해 exceptionally
, handle
, 또는 whenComplete
와 같이 지정된 함수에서 예외를 잡을 수 있습니다.CompletableFuture
내에서 정상적으로 예외를 잡기만 하면 됩니다.트랜잭션 내 예외 처리:
transactional.run
안에서 예외를 잡을 수 있는지는 트랜잭션의 범위와 예외 처리 전략에 달려 있습니다. 보통 스프링의 @Transactional
어노테이션이 적용된 메소드나 블록의 예외는 자동으로 롤백되지만, 비동기 예외는 별도로 처리해줘야 합니다.CompletableFuture
안에서 발생한 예외는 전통적인 스프링 예외 처리 방식과 약간의 차이가 있을 수 있습니다. 호출하는 지점에서 예외를 포착하거나 자체 예외 처리기를 사용해야 합니다.이처럼 CompletableFuture
를 활용하여 비동기 작업을 구현할 때, 어떤 부분에서 예외를 처리할지 잘 설계하는 것이 중요합니다. 비동기 환경에서는 예외가 즉각적으로 처리되지 않으므로, 예외 처리 로직을 명확히 하시는 것이 필요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해 드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
제 기억이 잘못되었을 수도 있지만, 저 질문을 남긴 시점 강의에서
produce를 했을 때 complete에서 예외를 발생시킨다면 트랜잭션 작업을 롤백시킨다.
같은 설명이 있었던 기억이 있습니다.
(제가 설명 의도를 잘못 이해했을수도 있습니다!)
그래서 확인차 질문드렸습니다.
감사합니다.