2016-11-21 285 views
0

我有大致限定的駱駝路線如下:駱駝AWS-SQS:設置visibilityTimeout動態

from("aws-sqs://my-queue") 
.process(myProcessor) 
.to(myEndpoint); 

然而,myProcessor依賴於上游服務,有時變得不可用或返回一個「掛起」的響應,所以處理器拋出一個異常,並將交換留在隊列中。然後駱駝連續輪詢並失敗,直到消息被DLQed。

我想要做的是動態配置visibilityTimeout來實現指數回退,直到上游服務再次可用。因此,而不是from("aws-sqs://my-queue?visibilityTimeout=30"),我會在我的路徑登記異常處理程序和它的內部,這樣做:

sqsClient.setVisibilityTimeout(Math.pow(2 * visibilityTimeout)); 

這可能嗎?作爲獎勵,是否可以配置特定消息ID的可見性超時(例如,因此它不會影響其他消息的可見性超時)?

回答

0

是的,可以更改正在處理的消息的VisibilityTimeout。

AWS docs

當您收到一個消息隊列,並開始對其進行處理,該隊列的 可見性超時可能不足(例如,您 可能需要處理和刪除信息)。您可以通過使用 ChangeMes​​sageVisibility操作指定新的超時值來縮短或擴展消息的可見性。

例如,如果對於一個隊列中的超時時間爲60秒,15秒已經 經過,並且您發送ChangeMes​​sageVisibility呼叫與 VisibilityTimeout設定爲10秒,總超時值將被 的經過時間(15秒)加上新的超時值(10秒),共012秒,共012秒。 25秒後發送呼叫將導致 錯誤。

新的超時時間會從你打電話 的ChangeMes​​sageVisibility行動的時候效果。另外,新的超時時間將僅適用於特定收到的消息。 ChangeMes​​sageVisibility操作不影響稍後收到消息或更新隊列的 的超時時間。

0

AWS SQS通過調用「ChangeMes​​sageVisibility」方法提供了更改消息級別(處理消息時)的visibilityTimeout的靈活性。

但是無法檢索消息的當前可見性超時以執行所需的操作(Math.pow(2 * visibilityTimeout));

ChangeMes​​sageVisibility方法調用:

sqsClient.ChangeMessageVisibility(myEndpoint, myMessage.getReceiptHandle(), 60); 

上面的代碼添加60秒的visibilityTimeout到消息的經過超時。

(i。e)如果消息具有剩餘30秒的缺省隊列級別visibilityTimeout,則上面的代碼將增加60秒,並將其他消費者的消息不可用性增加到90秒。

+0

以上代碼不會添加原始可見性時間。實際上,它只會增加經過時間+所需時間。示例 - 初始可見性時間設置爲30秒,10秒後再次請求延長60秒,然後10 + 60 = 70秒。不是90秒。 – Ash