2012-06-11 62 views
2

我目前正在使用亞馬遜的SQS,並且在嘗試刪除當前「正在進行中」的隊列消息時遇到問題。使用收據處理刪除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很敏感。所以你需要先對它進行網址編碼。我做了同樣的工作。