# 사유 필드와 그 문서 /** * The outcome of classifying one failed attempt (design §9.4). * *
The {@code reason} is a bounded diagnostic string chosen by the policy, never a provider * message, so it is safe to log and to use as a low-cardinality metric tag. */ public record RetryDecision(RetryDisposition disposition, Duration delay, String reason) { # 컴팩트 생성자가 검사하는 것 전부 public RetryDecision { Objects.requireNonNull(disposition, "disposition"); Objects.requireNonNull(delay, "delay"); Objects.requireNonNull(reason, "reason"); if (delay.isNegative()) { throw new IllegalArgumentException("retry delay must not be negative"); } if (disposition != RetryDisposition.RETRY_FULL_TRANSACTION && !delay.isZero()) { throw new IllegalArgumentException("only a full transaction retry may carry a delay"); } if (reason.isBlank()) { throw new IllegalArgumentException("retry decision requires a reason"); } } # 공개 팩토리 넷. 사유를 인자로 받는 것은 셋이다. 30: public static RetryDecision retry(Duration delay) { 36: public static RetryDecision retry(Duration delay, String reason) { 41: public static RetryDecision reconcile(String reason) { 46: public static RetryDecision fail(String reason) { # 이 파일에서 길이·어휘·형식을 검사하는 코드: 0 # 이 타입을 소비하는 main 파일 전부 FullTransactionRetryCoordinator.java DefaultJpaRetryPolicy.java JpaRetryObservation.java # 그중 reason() 을 읽는 줄: 0 # 그런데 결정 객체 자체는 메트릭을 내는 곳까지 간다 106: listener.onAttemptFailed(operation, attempt, failure, decision); 41: LowCardinality.requireRegistered(persistenceUnit); 58: .tag("retry.disposition", decision.disposition().name())