--- kind: REFERENCE slug: messaging-transport-spi-f02 title: 멱등 종료를 보장하는 컴포넌트는 종료 이후의 등록도 정의한다 topic: transport-and-provider-semantics project: clean-architecture-backend-template status: 게시 전 sourceRevision: 21234e38cdb9a926cbc92bb97a2aee2e4a7d2916 rootTreeNode: reference:messaging-transport-spi-f02 verifiedOn: # 이 기록은 이번 회차에 실행 확인을 하지 않았다 source: - analysis/messaging/messaging-transport-spi.md#L668 --- # 멱등 종료를 보장하는 컴포넌트는 종료 이후의 등록도 정의한다 ## 관계 - **드레인 마감 30초가 세 곳에서 독립적으로 결정된다** 이 규칙의 근거는 같은 분석 리프의 판정이 소유한다. ## 목적 이 클래스의 다른 모든 경로가 "정확히 한 번 close" 를 CAS 로 보장한다. 이 한 창만 그 보장 밖이고, 남는 것은 닫히지 않은 브로커 연결이다 — §13 의 세 번째 결함과 같은 결과다. ## 규칙 1. 종료 메서드가 상태를 비우는 순서를 본다 close() 가 draining 은 synchronized 로 비우고, current 는 List.copyOf(current.keySet()) 후 개별 remove 한다. 2. 그 사이에 등록이 들어올 수 있는지 본다 install 이 새 세대를 넣으면 그 세대는 닫히지 않는다. 3. 종료 이후의 등록 동작을 정의한다 close() 에 종료 플래그를 두고, 그 이후의 install 은 즉시 runtime.close() 하게 한다. ## 적용 조건 세대 교체나 참조 계수로 자원 종료를 보장하면서 등록 API 를 함께 노출하는 registry. ## 예외 종료 중 등록이 타입으로 불가능하면 대상이 아니다. 여기서는 install 이 종료 여부를 보지 않는다. ## 예시 DefaultMessagingRuntimeRegistry.java:141-156. 확인 방법은 코드 검토이고, 테스트로 재현하려면 close() 중 install 을 끼워 넣어야 한다.