Camel AWS-SQS:动态设置visibilityTimeout

时间:2016-11-21 22:22:28

标签: java amazon-web-services apache-camel amazon-sqs

我的骆驼路线大致定义如下:

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

但是,myProcessor依赖于有时变得不可用的上游服务或者返回" pending"响应,因此处理器抛出异常并且交换留在队列中。然后Camel轮询并连续失败,直到消息为DLQed。

我想要做的是动态配置visibilityTimeout以实现指数退避,直到上游服务再次可用。因此,我会在我的路线中注册一个异常处理程序,而不是from("aws-sqs://my-queue?visibilityTimeout=30"),而是执行以下操作:

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

这可能吗?作为奖励,是否可以为特定消息ID配置可见性超时(例如,它不会影响其他消息的可见性超时)?

2 个答案:

答案 0 :(得分:0)

是的,可以为正在处理的邮件更改VisibilityTimeout。

来自AWS docs

  

当您收到队列的消息并开始处理它时,   队列的可见性超时可能不足(例如,您   可能需要处理和删除消息)。您可以缩短或延长   通过使用指定新的超时值来显示消息的可见性   ChangeMes​​sageVisibility动作。

     

例如,如果队列的超时为60秒,则为15秒   已过去,并发送ChangeMes​​sageVisibility调用   VisibilityTimeout设置为10秒,总超时值将为   经过的时间(15秒)加上新的超时值(10秒),   总共25秒。将在25秒后发送呼叫   错误。

     

请注意

     

新的超时时间将从您拨打电话的时间开始生效   ChangeMes​​sageVisibility操作。另外,新的超时   期间仅适用于特定的收据。该   ChangeMes​​sageVisibility操作不会影响以后的超时   收到消息或以后的队列。

答案 1 :(得分:0)

AWS SQS通过调用" ChangeMes​​sageVisibility"提供了在消息级别(处理消息时)更改visibilityTimeout的灵活性。方法。

但是,无法检索消息的当前可见性超时以执行所需的操作(Math.pow(2 * visibilityTimeout));

ChangeMes​​sageVisibility方法调用:

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

上面的代码为消息的超时超时添加了60秒的visibilityTimeout。

(即)如果消息的默认队列级别visibilityTimeout还剩30秒,则上面的代码会增加60秒,并将其他消费者的消息不可用性提高到90秒。