Documentation
¶
Index ¶
- Variables
- type Service
- func (s *Service) Cancel(instanceID contract.TaskInstanceID) (err error)
- func (s *Service) SetNotificationSender(notificationSender contract.NotificationSender)
- func (s *Service) Start(serviceStopCtx context.Context, serviceStopWG *sync.WaitGroup) error
- func (s *Service) Submit(ctx context.Context, req *contract.TaskSubmitRequest) (err error)
Constants ¶
This section is empty.
Variables ¶
var ( // ErrNotificationSenderNotInitialized 서비스 시작 시 핵심 의존성 객체인 NotificationSender가 올바르게 초기화되지 않았을 때 반환되는 에러입니다. ErrNotificationSenderNotInitialized = apperrors.New(apperrors.Internal, "NotificationSender 객체가 초기화되지 않았습니다") // ErrServiceNotRunning Task 서비스가 실행 중이 아닐 때 반환되는 에러입니다. ErrServiceNotRunning = apperrors.New(apperrors.Internal, "Task 서비스가 현재 실행 중이지 않아 요청을 수행할 수 없습니다") // ErrInvalidTaskSubmitRequest Submit() 호출 시 전달된 요청 객체가 유효하지 않을 때 반환되는 에러입니다. ErrInvalidTaskSubmitRequest = apperrors.New(apperrors.Internal, "작업 실행 요청 정보가 유효하지 않아 요청을 처리할 수 없습니다") // ErrCancelQueueFull Cancel() 호출 시 취소 요청 대기열이 가득 차 있을 때 반환되는 에러입니다. // 비블로킹 방식으로 채널 전송을 시도하여, 즉시 수신이 불가능하면 재시도 없이 바로 반환합니다. ErrCancelQueueFull = apperrors.New(apperrors.Internal, "작업 취소 대기열이 포화 상태에 도달하여 일시적으로 요청을 접수할 수 없습니다") )
Functions ¶
This section is empty.
Types ¶
type Service ¶
type Service struct {
// contains filtered or unexported fields
}
Service Task 서비스입니다. Task의 제출, 취소, 완료, 스케줄링을 총괄합니다.
모든 상태 변경 이벤트(Submit, Cancel, Done)는 채널을 통해 단일 이벤트 루프로 직렬화됩니다. 이로써 복잡한 Mutex 없이 안전한 동시성을 보장합니다.
주요 책임:
- 중복 실행 방지 및 Fail Fast 검증
- Cron 스케줄에 따른 자동 실행
- 서비스 종료 시 실행 중인 모든 Task의 안전한 정리 (Graceful Shutdown)
func NewService ¶
func NewService(appConfig *config.AppConfig, idGenerator contract.IDGenerator, taskResultStore contract.TaskResultStore) *Service
NewService Task 서비스를 생성합니다.
func (*Service) Cancel ¶
func (s *Service) Cancel(instanceID contract.TaskInstanceID) (err error)
Cancel 전달받은 InstanceID에 해당하는 실행 중인 Task의 취소를 요청합니다.
이 메서드는 취소 요청을 taskCancelC 채널에 전달하는 역할만 담당합니다. 실제 취소 처리(task.Cancel() 호출 및 사용자 알림)는 이벤트 루프의 handleTaskCancel()이 수행합니다.
반환값:
- nil: 취소 요청이 성공적으로 큐에 등록된 경우
- error: 서비스가 실행 중이 아니거나, 취소 요청 큐가 가득 찬 경우
func (*Service) SetNotificationSender ¶
func (s *Service) SetNotificationSender(notificationSender contract.NotificationSender)
SetNotificationSender Task 실행 결과 및 중요 이벤트를 외부로 전달할 NotificationSender를 주입합니다.
Task 서비스는 순환 의존성 문제로 인해 생성자(NewService)에서 NotificationSender를 받지 않으므로, Start() 호출 전에 이 메서드를 통해 별도로 주입해야 합니다. Start() 내부에서 초기화 여부를 검증하므로, 주입 없이 Start()를 호출하면 오류가 반환됩니다.
매개변수:
- notificationSender: 알림을 전송할 구현체입니다. nil을 전달하면 Start() 시 오류가 반환됩니다.
func (*Service) Start ¶
Start Task 서비스를 시작하고 이벤트 루프를 준비합니다.
내부적으로 runEventLoop()를 별도의 고루틴으로 실행하여 Task의 제출, 완료, 취소 이벤트를 처리합니다. 서비스가 이미 실행 중인 경우에는 경고 로그만 남기고 정상 반환합니다.
매개변수:
- serviceStopCtx: 서비스 종료 신호를 전달받는 컨텍스트입니다. 이 컨텍스트가 취소되면 이벤트 루프가 Graceful Shutdown을 시작합니다.
- serviceStopWG: 서비스 종료 시 이벤트 루프 고루틴이 완전히 종료될 때까지 대기하기 위한 WaitGroup입니다.
반환값:
- error: NotificationSender가 주입되지 않았거나 그 외 초기화 실패 시 오류를 반환합니다.
func (*Service) Submit ¶
Submit Task 실행 요청을 검증하고 이벤트 루프의 실행 큐에 등록합니다.
요청은 아래 순서로 검증된 후 큐에 등록됩니다:
- 요청 객체 유효성 검사 (nil 체크, 필드 유효성)
- TaskID / CommandID 지원 여부 확인 (지원하지 않으면 즉시 오류 반환)
- 서비스 실행 상태 확인
- taskSubmitC 채널에 비동기로 전달
매개변수:
- ctx: 채널이 가득 찼을 때 호출자가 대기를 취소할 수 있는 컨텍스트입니다. ctx가 취소되면 ctx.Err()를 반환합니다.
- req: 실행을 요청할 Task의 식별 정보(TaskID, CommandID, NotifierID 등)를 담은 요청 객체입니다.
반환값:
- nil: 요청이 성공적으로 큐에 등록된 경우
- error: 요청이 유효하지 않거나, 서비스가 중지 중이거나, ctx가 취소된 경우