2012-06-11 2 views
2

현재 amazon의 SQS를 사용하고 있으며 현재 "In Flight"인 대기열 메시지를 삭제하려고 할 때 문제가 있습니다. 수신 핸들이있는 SQS 메시지 삭제

ReceiveMessageRequest queueRequest = new ReceiveMessageRequest(); 
     queueRequest.WithMaxNumberOfMessages(1); 
     queueRequest.WithQueueUrl(config.QueueURL); 
     queueRequest.WithAttributeName("All"); 

     ReceiveMessageResponse response = sqs.ReceiveMessage(queueRequest); 

     if (response.IsSetReceiveMessageResult()) 
     { 
      ReceiveMessageResult result = response.ReceiveMessageResult; 

      if (result.IsSetMessage()) 
      { 
       if (result.Message.First() != null) 
       { 
        return new Tuple<string, string, bool>(result.Message.First().ReceiptHandle, result.Message.First().Body ?? null, false); 
       } 
      } 
     } 

지금 핸들 및 메시지 본문을 모두받은 후, 나는 클라우드 스토리지에 영수증 핸들 문자열을 저장 (DynamoDB의 예) : 아래

몇 가지 예제 코드입니다. 내가 나중에 부하의 스토리지 서비스에서 처리하고, 다음과 유사한 뭔가 삭제를 호출한다 :

sqs.DeleteMessage(new DeleteMessageRequest() { QueueUrl = "urL", ReceiptHandle = handle }); 

을하지만 그 선을 실행할 때, 나는 "입력 영수증 핸들이 잘못되었습니다"오류가 발생 메시지.

참고로이 메시지가 다시 수신되지 않았으므로 영수증 핸들이 기록되고 가장 최근의 메시지 여야합니다. 또한 현재 동일한 애플리케이션 내에서 메시지를 삭제할 수 있습니다. 단순히 메시지를 수신 한 후 잠자기 한 다음 위와 같이 삭제하려고합니다.

아이디어가 있으십니까?

+0

이 사무엘을 해결 했습니까? 나는 똑같은 문제를 겪고있는 것처럼 보인다. –

답변

2

메시지의 VisibilityTimeout이 만료 될 때까지 기다렸다가 다시 사용할 수 있습니다. 이렇게하면 해당 메시지를 처리하는 기계가해야 할 일을 수행 할 수 있습니다.

+0

그러면 컴퓨터 A가 메시지 X를 전달한다고 가정 해 봅시다. 컴퓨터 A는 가시성 제한 시간을 지금부터 2 일로 설정합니다. 그런 다음이 메시지에 대해 작업을 시작합니다 (삭제). 그게 효과가 있니? –

0

두 작업 (ReceiveMessage 및 DeleteMessage)을 모두 실행하는 경우 큐를 참조하는 동일한 URL을 사용하고 있는지 확인하십시오.

0

ReceiptHandle에는 URL에 민감한 특수 문자가 포함되어 있습니다. 따라서 먼저 URL을 인코딩해야합니다. 나는 똑같이했고 효과가 있었다.