콘텐츠로 이동
무료 평가 시작

pdcomm_gem_spool_complete_delivery

함수

전달 시도를 완료하고, 성공하면 맨 앞 메시지를 디큐합니다.

PdcommStatus pdcomm_gem_spool_complete_delivery(PdcommTcpEndpoint *endpoint, PdcommGemResult *result, uint8_t success, PdcommGemSpoolWriteInfo *info)

선언 위치: #include <pdcomm_gem_spooling.h>

result는 현재 진행 중인 시도의 전달 결과여야 합니다. W1 메시지에는 #PDCOMM_GEM_SPOOL_DELIVERY_RESPONSE, W0 메시지에는 #PDCOMM_GEM_SPOOL_DELIVERY_WRITTEN입니다. 실패한 전달 결과에는 쓸 수 있는 증거가 없습니다.

  • success가 1이면 맨 앞 메시지를 디큐합니다(#PDCOMM_GEM_SPOOL_REMOVED). W1 메시지는 먼저 응답 본문을 검사하고 메시지별 성공 정책을 직접 적용합니다. 펑션이 일치하는 것만으로는 성공 정책이 되지 않습니다. W0 증거는 프레임을 로컬에서 끝까지 기록했다는 뜻이지, 호스트가 받거나 처리했다는 뜻이 아닙니다. 설치 전에 디큐가 실패하면 결과에 success_accepted와 dequeue_pending이 기록됩니다. 다시 보내지 말고 pdcomm_gem_spool_retry_dequeue()로 마무리합니다. #PDCOMM_SPOOL_UNCONFIRMED와 함께 설치된 디큐는 이미 완료된 것이므로 다시 디큐하면 안 됩니다.
  • success가 0이면 맨 앞 메시지를 유지하고 전송 실행을 멈춥니다.

큐가 비거나 max_transmit에 도달해도 실행이 멈춥니다. 전달은 정확히 한 번(exactly once)이 아니라 최소 한 번(at least once)입니다. 선택 변경으로 대체된 증거는 기록 후에도 거부될 수 있으며, 복구 과정에서 메시지를 다시 보낼 수 있습니다.

매개변수

이름설명
endpoint스풀이 있고 Synchronized이면서 Communicating 상태인 장비 엔드포인트입니다.
resultpdcomm_gem_handle_event()가 만든 전달 결과입니다.
success전달을 수락하려면 1, 거부하려면 0입니다. 다른 값은 유효하지 않습니다.
info디큐 결과를 받습니다. NULL이 아니어야 합니다.

반환값

성공하면 #PDCOMM_OK를 반환합니다(거부한 경우도 포함). 디렉터리 동기화가 확인되지 않은 채 디큐를 설치했으면 #PDCOMM_SPOOL_UNCONFIRMED를 반환합니다. 결과가 다른 엔드포인트, 세대, 선택에서 왔거나, 이미 완료되었거나, 진행 중인 시도와 맞지 않으면 #PDCOMM_STALE_TOKEN을 반환합니다. 결과가 전달 결과가 아니거나, GEM이 Communicating 상태가 아니거나, 스풀이 동기화되지 않았으면 #PDCOMM_INVALID_STATE를 반환합니다. 인수가 NULL이거나, info가 너무 작거나, success가 1보다 크면 #PDCOMM_INVALID_ARGUMENT를 반환합니다. 준비된 TCP 이벤트(staged event)가 대기 중이면 #PDCOMM_BACKPRESSURE를 반환합니다. 디큐가 대기 상태로 남으면 #PDCOMM_IO_ERROR 같은 영속화(persistence) 오류를 반환합니다. 그 밖에 #PDCOMM_POISONED를 반환할 수 있습니다.