我的骆驼路线大致定义如下:
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配置可见性超时(例如,它不会影响其他消息的可见性超时)?
答案 0 :(得分:0)
是的,可以为正在处理的邮件更改VisibilityTimeout。
来自AWS docs:
当您收到队列的消息并开始处理它时, 队列的可见性超时可能不足(例如,您 可能需要处理和删除消息)。您可以缩短或延长 通过使用指定新的超时值来显示消息的可见性 ChangeMessageVisibility动作。
例如,如果队列的超时为60秒,则为15秒 已过去,并发送ChangeMessageVisibility调用 VisibilityTimeout设置为10秒,总超时值将为 经过的时间(15秒)加上新的超时值(10秒), 总共25秒。将在25秒后发送呼叫 错误。
请注意
新的超时时间将从您拨打电话的时间开始生效 ChangeMessageVisibility操作。另外,新的超时 期间仅适用于特定的收据。该 ChangeMessageVisibility操作不会影响以后的超时 收到消息或以后的队列。
答案 1 :(得分:0)
AWS SQS通过调用" ChangeMessageVisibility"提供了在消息级别(处理消息时)更改visibilityTimeout的灵活性。方法。
但是,无法检索消息的当前可见性超时以执行所需的操作(Math.pow(2 * visibilityTimeout));
ChangeMessageVisibility方法调用:
sqsClient.ChangeMessageVisibility(myEndpoint, myMessage.getReceiptHandle(), 60);
上面的代码为消息的超时超时添加了60秒的visibilityTimeout。
(即)如果消息的默认队列级别visibilityTimeout还剩30秒,则上面的代码会增加60秒,并将其他消费者的消息不可用性提高到90秒。