Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 驼峰AWS-SQS:动态设置visibilityTimeout_Java_Amazon Web Services_Apache Camel_Amazon Sqs - Fatal编程技术网

Java 驼峰AWS-SQS:动态设置visibilityTimeout

Java 驼峰AWS-SQS:动态设置visibilityTimeout,java,amazon-web-services,apache-camel,amazon-sqs,Java,Amazon Web Services,Apache Camel,Amazon Sqs,我的骆驼路线大致定义如下: from("aws-sqs://my-queue") .process(myProcessor) .to(myEndpoint); 但是,myProcessor依赖于上游服务,该服务有时不可用或返回“挂起”响应,因此处理器抛出异常,exchange留在队列中。然后,Camel轮询并连续失败,直到消息被DLQed 我想做的是动态配置visibilityTimeout以实现指数退避,直到上游服务再次可用。因此,不是来自(“aws”)的-sqs://my-queue?vi

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

from("aws-sqs://my-queue")
.process(myProcessor)
.to(myEndpoint);
但是,
myProcessor
依赖于上游服务,该服务有时不可用或返回“挂起”响应,因此处理器抛出异常,exchange留在队列中。然后,Camel轮询并连续失败,直到消息被DLQed

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

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

这可能吗?另外,是否可以为特定消息id配置可见性超时(例如,这样不会影响其他消息的可见性超时)?

是的,可以更改正在处理的消息的可见性超时

发件人:

当您收到队列的消息并开始处理它时 队列的可见性超时可能不足(例如,您 可能需要处理和删除邮件)。你可以缩短或延长 通过使用 ChangeMessageVisibility操作

例如,如果队列的超时时间为60秒,则有15秒 已过,您将通过发送ChangeMessageVisibility调用 VisibilityTimeout设置为10秒,总超时值为 经过的时间(15秒)加上新的超时值(10秒), 总共25秒。在25秒后发送呼叫将导致 一个错误

新的超时时间将从您调用时起生效 ChangeMessageVisibility操作。此外,新的超时 句点仅适用于特定的消息接收。这个 ChangeMessageVisibility操作不影响以后的超时 消息或更高版本队列的接收


AWS SQS提供了通过调用“ChangeMessageVisibility”方法在消息级别(处理消息时)更改visibilityTimeout的灵活性

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

ChangeMessageVisibility方法调用:

sqsClient.ChangeMessageVisibility(myEndpoint, myMessage.getReceiptHandle(), 60);
上面的代码将visibilityTimeout添加到消息的过期超时中60秒


(即)如果消息的默认队列级别可见性超时时间为30秒,则上述代码会增加60秒,并将消息对其他使用者的不可用性增加到90秒。

上述代码不会增加原始可见性时间。事实上,它只将经过的时间+请求的时间相加。示例-初始可见性时间设置为30秒,10秒后,您再次请求延长60秒,然后10+60=70秒。不是90秒。这可以在驼峰路线内完成,或者从上下文中完成,或者需要
SQSClient