如果处理时间过长,apache camel是否会跳过删除从队列读取的消息?

zpf6vheq  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(419)

我有一个apache使用者,它从sqs标准队列读取消息并对其进行处理。
有些消息处理时间很短(1-2分钟),而有些消息处理时间很长(70-80分钟)。
我没有在camel配置中明确指定可见性超时,因此每个读取的消息都有30秒的可见性超时,如队列配置中所指定的。
处理时间短的消息工作正常,但对于持续时间长的消息,ApacheCamel不会在完成处理后删除消息。因此,消息再次在队列中可用,camel再次读取消息,处理它很长时间,并且这个循环重复。
我知道消息会重新出现在队列中,因为可见性超时很低,但我担心的是-
1.为什么不在这些长时间运行的作业处理完成后立即删除消息?
2.正在正确删除短作业的消息(即使短运行作业超过30秒的可见性超时)
任何地方都不会发生错误或异常。
我甚至做了一个示例poc作业,它除了等待很长时间(85分钟)之外,什么也不做,然后打印一条成功消息。我注意到作业已成功完成,但camel没有删除消息。为什么?

v1l68za4

v1l68za41#

我使用camel中的配置选项--“extendmessagevisibility”修复了这个问题。当我们将此选项设置为true时,camel将运行一个后台任务,该任务将持续延长消息的可见性超时,直到消费者处理该消息为止。
同样,我真正的问题不是消息再次在队列上可见,而是 Camel 消费者没有删除它。
然而,根据我的观察,我发现应用extendmessagevisibility选项会导致camel跟踪消息,然后正确地删除它。
我们可以如下配置队列uri:

String queueUri = "aws-sqs://" + queueName + "?amazonSQSClient=#client&extendMessageVisibility=true&visibilityTimeout=60";

相关问题