Skip to content

Consumer 소유 스레드 기반 타이머 등록·취소 지원 - #65

Merged
yong5eon merged 4 commits into
masterfrom
feature/62
Nov 4, 2026
Merged

yong5eon merged 4 commits into
masterfrom
feature/62

Conversation

@task-stream-automation

@task-stream-automation task-stream-automation Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

변경 내용

원본 이슈: #62

README.md

Consumer 소유 스레드 기반 타이머 등록·취소 지원

이슈와 작업 상태

  • 원본: GitHub Issues #62
  • 제목: Consumer 소유 스레드 기반 타이머 등록·취소 지원
  • 상태: Open
  • 유형·레이블: 기능 (feature), 원본 이슈에 적용됨
  • 원본 레이블: feature, rabbitmq
  • 작업 대상: yong5eon/DefStream, 작업 브랜치 feature/62
  • 분기 기준: origin/master와 동일한 로컬 master의 f1bf897
  • 병합 대상: master
  • 로컬 진행 상태: 타이머 구현·실행 샘플·사용 문서 반영, 단위·회귀 45개 통과, 실제 RabbitMQ 검증은 서버 연결 불가
  • 댓글: 없음

작업 문서

이슈 원문

해결하려는 문제

RabbitMQ Consumer로 메시지를 소비하면서, 메시지가 없는 동안에도 연결 유지용 콜백 등을 일정 시간 뒤 실행할 필요가 있습니다.

현재 Consumer.call(callback)은 연결 소유 스레드로 콜백을 전달하지만 지연 타이머의 등록·취소 API는 제공하지 않습니다. 따라서 호출자가 Pika의 BlockingConnection.call_later()·remove_timeout()에 직접 의존하거나 별도 스레드 타이머의 수명주기를 관리해야 합니다.

threading.Timer에서 직접 출력·소비 중단을 처리하면 메시지 처리와 동시 실행될 수 있고, 타이머 스레드에서 발생한 예외도 소비 루프로 자동 전파되지 않습니다. Consumer.call()로 다시 전달할 수는 있지만 타이머 생성·재등록·취소·소비 종료 후 실행 방지는 호출자가 계속 관리해야 합니다.

제안하는 해결 방법

DefStream의 소비자 API를 통해 소비자 소유 스레드에서 실행되는 타이머를 등록·취소할 수 있게 지원해 주세요. 우선 현재 사용 사례인 RabbitMQ Consumer를 대상으로 합니다.

  • 지연 시간과 콜백을 지정해 일회성 타이머를 등록하고 취소 가능한 핸들을 반환합니다.
  • 메시지가 없는 소비 대기 중에도 콜백이 소비자 소유 스레드에서 실행되어야 합니다.
  • 반복 실행은 콜백에서 다음 타이머를 재등록하는 방식으로도 충분합니다. 별도 범용 스케줄러나 전용 타이머 스레드는 요구하지 않습니다.
  • 소비 종료·close 시 남은 타이머가 이후에 실행되지 않도록 수명주기를 정리합니다.
  • 콜백 오류는 기존 소비 루프의 오류 처리·전파 방식과 일관되게 드러내며 별도 스레드에서 조용히 유실하지 않습니다.
  • 호출자는 Pika 연결 객체·구현체 타이머 ID를 직접 다루지 않아도 되어야 합니다.

구체적인 메서드 이름과 핸들 타입은 구현 시 기존 인터페이스와 대조해 결정하면 됩니다. 예를 들어 지연 콜백 등록과 해당 핸들 취소 형태를 고려할 수 있으며, 이 예시를 확정 API로 지정하는 것은 아닙니다.

확인 기준

  • 메시지가 없는 동안에도 예약 콜백이 실행되고 메시지 처리와 같은 소유 스레드에서 실행되는지 확인합니다.
  • 취소한 타이머와 소비 종료 후의 타이머가 실행되지 않는지 확인합니다.
  • 재등록을 통한 주기 실행과 정상·오류 종료의 자원 정리를 검증합니다.
  • 콜백 예외가 기존 소비 오류 처리 경계로 전파되는지 확인합니다.
  • 기존 구독·ACK·소비 순서와 Consumer.call() 동작을 유지합니다.
  • 지원 범위·시간 단위·실행 지연 가능성·등록 및 취소 사용법을 관련 매뉴얼에 반영합니다.

고려한 대안

  • Pika 연결의 타이머를 직접 사용: 같은 스레드에서 실행할 수 있지만 호출자가 브로커 구현체에 결합됩니다.
  • threading.Timer와 Consumer.call() 조합: 실행 스레드 전달은 가능하지만 별도 스레드·타이머 수명주기를 호출자가 관리해야 합니다.
  • 메시지를 받을 때만 경과 시간 검사: 유휴 중 실행이 필요한 요구를 충족하지 못합니다.

추가 정보

연결 유지용 출력은 사용 예시일 뿐이며 DefStream이 HTTP·SSE 프로토콜이나 해당 출력 내용을 구현해 달라는 요청은 아닙니다. 우선 타이머 등록·취소와 소비자 수명주기 통합만 지원하면 됩니다.

원문

REQUIREMENTS.md

Connection 기반 선택적 타이머 요구사항

목적과 범위

원본 이슈와 작업 정보를 기준으로, 연결 구현체가 제공하는 타이머를 공통 계약으로 이용한다. 이번 범위는 Connection을 이용하는 SetTimer, Timer, TimerCallback과 이를 지원하는 RabbitMQ 연결 구현, 직접 관련된 테스트·문서로 한정한다.

Consumer의 인터페이스·구현과 Worker·Ping·Executor 등 다른 구성 요소는 변경하지 않는다. 앞서 논의한 리팩터링은 후속 작업으로 분리한다.

이번 문서는 확정 요구사항을 담는다. 구현 순서와 검증 방법은 작업 계획, 실제 결과와 남은 검증은 구현 종합에 구분하여 기록한다.

분석 근거와 현재 동작

  • Connection은 연결의 기본 계약과 GetExchange, GetQueue, GetStream, GetConsumer 등 선택적 기능의 프로토콜을 구분한다. 타이머도 모든 연결에 강제하지 않고 같은 방식으로 분리한다.
  • RabbitMQ Consumer는 이미 Pika의 call_later와 remove_timeout으로 내부 확인용 타이머를 관리한다. 소비 루프의 finally에서 해당 타이머를 취소한다.
  • 기존 Consumer의 타이머와 종료 처리는 변경하지 않는다. 새 예약의 등록·취소는 연결 객체를 통해 제공하며 소비자별 예약 관리 기능은 추가하지 않는다.

원문과 대화에서 변경한 사항

  • 원문은 소비자 API를 통한 타이머 지원을 제안했지만, 대화에서는 연결 객체의 선택적 SetTimer 프로토콜로 제공하기로 확정했다.
  • 프로토콜과 반환 핸들·콜백의 명칭은 SetTimer, Timer, TimerCallback으로 확정했다.
  • 앞서 논의한 Consumer의 complete, fail, call 제거와 close 추상 메서드 선언은 이번 요구사항에서 철회했다. 기존 선언·구현·호출 흐름을 그대로 유지한다.
  • 원문의 소비 종료 시 예약 정리는 이번 범위에서 제외한다. 타이머 수명주기와 적절한 취소 시점은 호출자와 기반 구현이 관리하며, 별도 자동 정리 계층을 추가하지 않는다.

확정 요구사항

R1. 선택적 타이머 등록

  • 연결 계약 모듈에 별도 SetTimer 프로토콜을 정의한다. 기본 Connection과 Consumer에는 타이머 등록을 필수 계약으로 추가하지 않는다.
  • 지원하는 연결 구현체가 지연 시간과 콜백을 받아 일회성 예약을 등록하고 Timer 핸들을 반환한다. 타이머의 구현 방식은 각 연결 구현체에 맡긴다.
  • 우선 RabbitMQ 연결에서 구현한다. Redis 등 다른 연결에는 타이머 구현이나 미지원 예외 메서드를 강제하지 않는다.
  • 이번 RabbitMQ 구현은 Pika의 내부 타이머를 사용한다. 별도 타이머 스레드나 범용 스케줄러를 추가하지 않으며, 호출자가 Pika 연결 객체나 타이머 ID를 직접 다루지 않게 한다.

R2. 타이머 핸들과 콜백

  • Timer는 내부 구현을 숨기는 반환 핸들의 프로토콜이며, 공개 기능은 remove() -> None으로 한정한다.
  • remove는 아직 실행되지 않은 예약을 취소한다. 실행 중인 콜백을 강제로 중단하는 기능은 포함하지 않는다.
  • 실행 완료·중복 취소 여부를 이유로 자체 오류나 별도 상태 관리 계층을 추가하지 않는다. 취소 동작과 오류는 기반 타이머 API를 따른다.
  • TimerCallback은 인자 없이 실행되며 반환값이 없는 __call__() -> None 계약이다.
  • 반복 실행은 콜백에서 다음 타이머를 등록하는 방식으로 지원한다. 별도 반복 타이머 API, 재설정, 상태 조회 기능은 요구하지 않는다.

등록과 반환 타입의 계약은 다음과 같다. 아래 코드는 공개 계약의 명세이며, 실제 선언은 연결 계약 모듈에 있다.

from abc import abstractmethod
from typing import Protocol, runtime_checkable


@runtime_checkable
class Timer(Protocol):
  @abstractmethod
  def remove(self) -> None: ...


class TimerCallback(Protocol):
  def __call__(self) -> None: ...


@runtime_checkable
class SetTimer(Protocol):
  @abstractmethod
  def set_timer(self, cb: TimerCallback, seconds: int) -> Timer: ...
  • 등록 메서드는 set_timer이며, 인자 순서는 cb, seconds이다.
  • 두 인자는 기본값 없이 필수로 받으며, 위치 인자 또는 cb=, seconds= 키워드 인자로 전달할 수 있다.
  • seconds의 타입은 int, 단위는 초이며 반환 타입은 Timer이다.
  • Timer, SetTimer에는 @runtime_checkable을 적용하고, 각각 remove, set_timer에 @abstractmethod를 적용한다. TimerCallback에는 이 두 데코레이터를 추가하지 않는다.

R3. 기반 구현의 동작 이용

  • 지연 시간은 등록 시점부터 초 단위로 계산한다. 소비 루프 시작에 맞춰 예약을 연기하거나 재등록하지 않는다.
  • RabbitMQ는 Pika의 타이머 등록·취소 API에 위임한다. 이벤트 처리가 진행되면 메시지가 없어도 연결 소유 스레드에서 콜백이 실행된다. 긴 처리 등에 따른 실행 지연은 기반 구현의 동작을 따른다.
  • 등록·취소 가능한 시점, 스레드 제약, 연결 종료 후 동작은 기반 API의 계약을 따르며 호출자가 이에 맞춰 사용한다. 완전한 스레드 안전성을 독자적으로 보장하는 동기화·전달 계층을 추가하지 않는다.
  • 타이머 목록·종료 상태를 별도로 추적하여 자동 취소하는 기능을 요구하지 않는다. 새 타이머를 위해 Consumer나 연결의 종료 처리를 변경하지 않는다.
  • 이미 실행·취소된 핸들, 종료된 연결의 취소, 음수·0초 지연의 처리는 기반 API에 맡긴다. 자체 입력 검증·기본값·폴백을 추가하지 않으며 발생한 오류를 숨기지 않는다.
  • 콜백 예외는 기반 타이머의 이벤트 처리 경로를 통해 드러나게 한다. 별도로 잡아서 무시하거나 정상 종료로 바꾸지 않는다.

R4. 기존 코드와의 경계

  • Consumer의 complete, fail, call, close, run 등 인터페이스와 구현은 변경하지 않는다.
  • Worker·Ping·Pool·Executor·Event의 구현 및 호출 흐름을 변경하지 않는다.
  • 타이머 추가를 이유로 ACK·NACK·RPC·중단·복구 처리나 프로세스 시작 방식을 리팩터링하지 않는다.
  • 기존 구독·소비 순서·소유 스레드 전달·연결 소유권을 유지한다.

R5. 사용 문서

  • 관련 한국어·영어 매뉴얼에 지원 범위, 등록 시점 기준의 초 단위 시간, 실행 지연 가능성, 등록·취소, 재등록 예시와 기반 API의 사용 제약을 반영한다.
  • Connection을 이용하는 선택적 기능으로 설명하고 Consumer 종료 시 자동 취소를 보장하지 않음을 명시한다. 아직 구현하지 않은 API를 사용 가능한 기능으로 안내하지 않는다.
  • 실행 가능한 RabbitMQ 타이머 샘플을 제공한다. 기존 Stream 샘플의 소비 중단도 별도 스레드 타이머 대신 연결 타이머를 이용한다.

계약 확정 결과

  1. 등록 계약은 위 R2의 set_timer(self, cb: TimerCallback, seconds: int) -> Timer로 확정했다.
  2. 지연 시간은 등록 시점부터 계산한다. 등록 가능한 시점은 기반 구현을 따른다.
  3. 타이머의 수명주기와 취소 시점은 호출자와 기반 구현의 책임이다. 별도 연결 종료·오류 정리 기능을 추가하지 않는다.
  4. 스레드 제약은 기반 구현을 따른다. 공통 프로토콜이나 래퍼에서 추가 스레드 안전성을 보장하지 않는다.
  5. 중복 취소·종료된 연결·음수·0초 등의 동작은 기반 API에 맡긴다. 이 차이를 통일하기 위한 자체 상태 관리·검증을 추가하지 않는다.

인수 기준과 검증 범위

기준 검증 내용
선택적 기능 RabbitMQ 연결의 타이머 지원과 기본 Connection·Consumer 및 Redis에 타이머 의무가 없음을 확인
API 계약 확정한 시그니처·데코레이터, 위치·키워드 인자 호출과 반환 핸들의 계약 확인
유휴 실행 메시지가 없는 실제 소비 대기 중 콜백 실행 및 메시지 처리와 소유 스레드 일치 확인
등록·취소 위임 등록 시점의 지연 시간이 기반 타이머에 전달되고 remove가 기반 취소 API에 위임되는지 확인
반복·예외 콜백 재등록에 의한 반복 실행 및 콜백 예외의 소비 루프 전파 확인
변경 경계 Consumer·Worker·Ping·Pool·Executor·Event 및 Redis 구현이 수정되지 않았음을 확인
회귀 연결 타이머 관련 테스트와 직접 영향받는 기존 검증으로 소비·연결 동작 유지 확인
문서 확정 API와 한국어·영어 예제, 지원 범위·제약 및 호환성 안내의 일치 확인

위 항목은 인수 기준이다. 실제 검증 결과와 실행하지 못한 항목은 작업 종합에 기록하며, 실제 RabbitMQ 검증은 서버 연결 불가로 남아 있다.

제외 범위

  • HTTP·SSE 프로토콜 및 연결 유지용 출력 자체의 구현
  • Redis 타이머 지원 추가와 모든 브로커에 대한 스케줄러 제공
  • 별도 타이머 스레드, 범용 작업 스케줄러, 실시간 실행 보장
  • Consumer 인터페이스 정리, complete·fail·call 제거 및 close 추상 메서드 선언
  • Worker·Ping·Pool·Executor·Event 리팩터링, 실행기 교체와 프로세스 시작 방식 변경
  • 소비자별 타이머 소유권 관리와 소비 종료 시 새 예약의 자동 취소
  • 타이머 수명주기의 별도 추적·자동 정리, 추가 스레드 동기화 및 기반 API와 중복되는 입력·상태 검증

원문

CHANGELOG.md

연결 타이머 등록과 취소

추가된 기능

RabbitMQ 연결에서 set_timer(cb, seconds)로 일회성 콜백을 예약하고,
반환된 Timer의 remove()로 취소할 수 있습니다.
호출자는 Pika 연결이나 내부 타이머 ID를 직접 다루지 않아도 됩니다.

SetTimer는 연결의 선택적 기능이며, Timer, TimerCallback과 함께
DefStream.Broker 및 DefStream.Broker.Connection에서 import할 수 있습니다.
반복 실행은 콜백에서 다음 타이머를 등록하는 방식으로 구성합니다.

실행 가능한 타이머 샘플에서
취소와 재등록을 확인할 수 있습니다. 기존 Stream 샘플의 소비 중단도
외부 스레드 타이머 대신 연결 타이머를 사용합니다.

사용 조건

  • 지연 시간은 등록 시점부터 정수 초 단위로 지정합니다.
  • RabbitMQ 소비 루프 등 Pika의 이벤트 처리가 진행되어야 콜백이 실행됩니다.
  • 등록·취소는 연결 소유 스레드에서 수행하며, 긴 이벤트 처리로 실행이 지연될 수 있습니다.
  • Consumer 종료 시 예약을 자동 취소하지 않습니다. 취소 시점과 연결의 사용 순서는 호출자가 관리합니다.
  • 중복 취소·종료된 연결·음수·0초 등의 동작과 오류는 기반 Pika API를 따릅니다.
  • Redis 타이머 지원이나 기존 Consumer·Worker API 변경은 포함하지 않습니다.

자세한 사용법은 RabbitMQ 연결 타이머 안내를 참고하세요.

원문

IMPLEMENTS.md

연결 타이머 구현 결과

구현 내용

  • 공통 연결 계약에 Timer, TimerCallback, SetTimer를 추가하고 Broker 공개 진입점에서도 노출했다.
  • Timer, SetTimer의 런타임 검사·추상 메서드 선언과 set_timer(cb: TimerCallback, seconds: int) -> Timer 시그니처를 확정 명세대로 구현했다.
  • RabbitMQ 연결은 SetTimer를 명시적으로 상속한다. 기존 연결 확인 후 즉시 call_later(seconds, cb)로 일회성 예약을 등록하므로 지연 시간은 등록 시점부터 계산된다.
  • 반환하는 구체 Timer는 등록 당시 실제 연결과 불투명 핸들만 보관한다. remove()는 해당 연결의 remove_timeout에 직접 위임하여 상위 연결 객체가 재연결되어도 취소 대상이 바뀌지 않는다.
  • 콜백 래퍼·스레드·추가 동기화·상태 검사·자동 정리 계층은 추가하지 않았다. 스레드 제약·취소·입력값·오류 동작은 Pika API를 따른다.
  • 한국어·영어 RabbitMQ 사용 안내에 일회성·취소·재등록 예제와 사용 제약을 반영했다.
  • 실행 가능한 타이머 샘플을 추가하고, Stream 샘플의 별도 스레드 타이머와 중계 함수를 연결의 set_timer(consumer.stop, 1)로 교체했다.

유지한 범위

Consumer·Worker·Ping·Pool·Executor·Event·Redis 구현과 연결·소비 종료 처리는 변경하지 않았다. 기본 Connection 계약에 타이머를 강제하지 않으며, 별도 이슈 #63·#64의 리팩터링을 포함하지 않았다.

검증과 제한

샘플 검증 추가 후 단위·회귀 45개가 통과했으며 실제 브로커 테스트 4개는 기본 실행에서 건너뛰었다. 별도 유휴 실행 테스트는 로컬 RabbitMQ 연결 실패로 동작 검증까지 진행하지 못했다. 타입·구문 진단과 사용 예제 검증 결과는 작업 종합에 구분하여 기록했다.

구현은 반영했지만 유휴 실행·실제 소유 스레드·취소·재등록·콜백 예외의 실제 브로커 인수 확인은 남아 있다.

구현 기록

원문

변경 유형

  • 버그 수정 및 일반 변경, 핫픽스 처리
  • 기능 추가
  • 호환성에 영향을 주는 변경
  • 문서 또는 예제 변경
  • 기타

검증

TASKS.md

요구사항 분석 결과

요구사항 명세의 범위를 Connection 기반 SetTimer, Timer, TimerCallback과 RabbitMQ 연결 지원 및 직접 관련된 테스트·문서로 한정했다.

앞서 명세한 Consumer의 메서드 제거·close 추상 메서드 선언은 이번 범위에서 철회했다. Consumer·Worker·Ping·Pool·Executor·Event는 변경하지 않으며, 리팩터링은 후속 작업으로 분리한다. 타이머 수명주기는 호출자와 기반 구현이 관리하며, 별도 추적·자동 정리 계층이나 소비 종료 연동은 추가하지 않는다.

등록 API는 set_timer(self, cb: TimerCallback, seconds: int) -> Timer로 확정했으며, Timer·SetTimer의 런타임 검사 및 추상 메서드 선언도 명세했다.

지연 시간은 등록 시점부터 계산한다. 스레드 제약과 중복 취소·종료된 연결·음수·0초 등의 동작은 기반 API를 따른다. 이를 공통화하기 위한 추가 동기화·입력 검증·상태 관리는 요구하지 않는다.

작업 계획에 따라 계약·RabbitMQ 구현과 테스트·한국어 및 영어 매뉴얼을 반영했다. 제품 구현의 상세 결과는 구현 종합에 기록했다.

선택된 개발 환경에서 샘플 검증 추가 후 관련 49개 테스트 중 45개가 통과했으며, opt-in 실제 RabbitMQ 테스트 4개는 기본 실행에서 건너뛰었다. 별도로 유휴 실행 통합 테스트를 시도했으나 연결 단계에서 AMQPConnectionError로 막혔다. 전체 인수 완료로 판단하지 않는다.

작업 기록

검증

  • 구현 전 기준선: 관련 4개 모듈 35개 통과.
  • 구현 후 단위·회귀: 샘플 검증을 포함한 관련 5개 모듈 45개 통과, 실제 브로커 테스트 4개 skip.
  • 실제 브로커: 유휴 타이머 테스트 1개를 시도했으나 서버 연결 오류로 동작 검증 전에 실패했다. 연결 가능한 테스트 서버에서 통합 클래스 4개 테스트를 다시 실행해야 한다.
  • 정적 검증: 변경 Python 파일 5개에 타입 오류가 없으며, 테스트 콜백의 미사용 인자에 대한 정보성 진단만 있다. 신규 테스트의 구문 검사도 통과했다.
  • 한국어·영어 타이머 예제 두 개가 동일하며 Python 3.9 문법으로 파싱·컴파일되는지 확인했다.
  • 기본 터미널 환경의 기존 editable 설치 문제와 cp949 콘솔 출력 문제는 제품 변경과 구분하여 기록했다. 설치나 파일 인코딩을 변경하지 않았다.
  • 최종 문서 18개의 구조·링크, 이슈 원문 보존, 제외 코드 미변경과 git diff --check를 확인했다. 변경 Python 파일 5개는 Python 3.9 문법 파싱도 통과했으며 실제 실행 환경은 Python 3.12.10이다.
  • 샘플 추가 후 Mock 기반 등록·취소·재등록·정리 흐름과 기존 샘플 import·로깅 경계 검증이 통과했다. 두 샘플에 Pylance 진단은 없으며 Python 3.9 문법 파싱도 통과했다. 실제 브로커에서 샘플을 실행한 것은 아니다.

원문

  • 관련 테스트를 실행했습니다.
  • 문서와 예제를 확인했습니다.

확인 사항

  • 변경 범위가 요청 사항에 한정되어 있습니다.
  • 공개 API나 기존 동작에 영향을 주는 경우 변경 내용과 마이그레이션 방법을 설명했습니다.
  • 민감 정보나 불필요한 디버깅 코드를 포함하지 않았습니다.

Closes #62

- RabbitMQ Consumer의 메시지 소비 중 타이머 등록·취소 기능 설명
- 지연 시간과 콜백을 지정해 일회성 타이머 등록 및 취소 방법 제안
- 소비 종료 시 타이머 수명주기 정리 및 콜백 오류 처리 방식 설명
- 관련 이슈: #62
- 이슈 URL: #62
- Connection 기반 타이머 계약 명세와 관련 문서 추가
- Consumer 메서드 제거 및 close 추상 메서드 선언 철회
- 요구사항 분석 결과 및 검증 기록 정리

- 관련 이슈: #62
- 이슈 URL: #62
- Connection 기반 타이머 요구사항 및 구현 방향 정리
- 작업 문서에 작업 계획 링크 추가
- 요구사항 문서에 작업 계획 링크 추가
- 작업 기록 문서에 계획 작성 내용 추가
- RabbitMQ 연결 타이머 기능을 구현하고 관련 계약을 정의
- 타이머 샘플을 추가하여 예약 및 취소 기능을 시연
- 기존 Stream 샘플을 연결 타이머로 전환
- 문서 및 매뉴얼에 변경 사항 반영
- 관련 테스트를 추가하고 검증 결과 기록

- 관련 이슈: feature/62

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

The returned handle exposes implementation details and the underlying connection through public fields, so those attributes should be private while retaining remove() as the supported operation.

1 open issue
What changed in this PR

This PR adds optional, connection-level one-shot timer registration and cancellation for RabbitMQ connections. Timers use Pika’s owner-thread event loop and return handles that delegate cancellation to the underlying connection.

Changes:

  • Added Timer, TimerCallback, and SetTimer protocols with public exports.
  • Implemented RabbitMQ Connection.set_timer() using Pika’s call_later() and remove_timeout().
  • Added timer and Stream samples, unit/contract tests, documentation, and implementation records.
  • 45 unit and regression tests pass; live RabbitMQ validation could not be completed because a broker connection was unavailable.
  • Nit: In src/Broker/Implements/RabbitMQ/Connection.py, the timer handle exposes connection and timeout publicly despite the opaque-handle API. These should be private attributes.
File Summary
tests/​test_protocol_contracts.py Verifies timer protocol signatures, exports, runtime checks, and optional support.
tests/​rabbitmq/​test_rabbitmq_timers.py Tests timer registration, cancellation, delegation, re-registration, samples, and integration behavior.
src/​Broker/​Implements/​RabbitMQ/​Connection.py Implements Pika-backed timer registration and cancellation handles. Contains the noted public implementation-detail exposure.
src/​Broker/​Implements/​RabbitMQ/​__init__.py Exposes RabbitMQ timer implementation symbols.
src/​Broker/​Connection.py Defines Timer, TimerCallback, and optional SetTimer contracts.
src/​Broker/​__init__.py Re-exports timer contracts from the Broker package.
samples/​Broker/​RabbitMQ/​Sample.Timer.py Demonstrates timer cancellation and repeated registration.
samples/​Broker/​RabbitMQ/​Sample.Stream.py Uses the connection timer instead of an external thread timer.
issues/​feature/​62/​tasks/​1793778440735.md Records timer and Stream sample verification.
issues/​feature/​62/​tasks/​1793778003070.md Records final verification and unavailable broker validation.
issues/​feature/​62/​tasks/​1793777847993.md Records unit verification and documentation updates.
issues/​feature/​62/​tasks/​1793777337621.md Records the Connection timer implementation plan.
issues/​feature/​62/​tasks/​1793775771772.md Records delegation and lifecycle decisions.
issues/​feature/​62/​tasks/​1793775544541.md Records the finalized timer registration signature.
issues/​feature/​62/​tasks/​1793774701691.md Records the narrowed Connection-based scope.
issues/​feature/​62/​tasks/​1793772101827.md Records the initial timer and Consumer contract analysis.
issues/​feature/​62/​TASKS.md Summarizes implementation status, verification results, and remaining integration checks.
issues/​feature/​62/​REQUIREMENTS.md Defines finalized timer contracts, behavior, scope, and exclusions.
issues/​feature/​62/​README.md Records the original issue, objectives, and implementation context.
issues/​feature/​62/​PLAN.md Documents the planned implementation and verification steps.
issues/​feature/​62/​implements/​1793778339166.md Records the runnable timer sample and Stream sample update.
issues/​feature/​62/​implements/​1793777682327.md Records timer contract and RabbitMQ implementation details.
issues/​feature/​62/​IMPLEMENTS.md Summarizes the completed implementation and validation limitations.
issues/​feature/​62/​CHANGELOG.md Documents the user-facing timer feature and its constraints.
docs/​README.md Adds connection timers to the Korean RabbitMQ documentation index.
docs/​README.en.md Adds connection timers to the English RabbitMQ documentation index.
docs/​RabbitMQ.md Documents the Korean timer API, examples, and usage constraints.
docs/​RabbitMQ.en.md Documents the English timer API, examples, and usage constraints.

Review effort: Lite

@yong5eon
yong5eon merged commit b73fbdf into master Nov 4, 2026
34 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Consumer 소유 스레드 기반 타이머 등록·취소 지원

2 participants