如果处理时间太长,Apache Camel 是否会跳过删除从队列中读取的消息?
Does Apache Camel skip deleting a message read from a queue if processing takes too long?
我有一个 Apache 消费者从 SQS 标准队列读取消息并处理它。
有些消息的处理时间很短(1-2 分钟),而有些消息需要很长时间(70-80 分钟)。
我没有在 Camel 配置中明确指定可见性超时,因此每条消息读取的可见性超时时间为 30 秒,如队列配置中所指定。
处理时间短的消息工作正常,但对于持续时间长的消息,Apache Camel 在完成处理后不会删除消息。
所以消息在队列中再次可用,Camel 再次读取消息,处理它很长时间,然后重复这个循环。
我知道消息重新出现在队列中是因为可见性超时很低,但我担心的是 -
1.为什么 Camel 不在这些长 运行 作业的处理完成后立即删除消息?
2. 短作业的消息被正确删除(即使是短 运行 作业超过 30 秒的可见性超时)
没有任何错误或异常发生。
我什至做了一个示例 POC 作业,除了等待很长时间(85 分钟)然后打印一条成功消息外什么都不做。我注意到作业已成功完成,但 Camel 并未删除该消息。 为什么?
我使用 Camel 中的配置选项修复了此问题 - 'extendMessageVisibility'。
当我们将此选项设置为 true 时,Camel 会运行一个后台任务,不断延长消息的可见性超时,直到它被消费者处理。
同样,我真正的问题不是消息再次在队列中可见,而是它没有被 Camel 消费者删除。
但是,根据我的观察,我看到应用 extendMessageVisibility 选项导致 Camel 跟踪消息然后正确删除它。
我们可以这样配置队列 URI:
String queueUri = "aws-sqs://" + queueName + "?amazonSQSClient=#client&extendMessageVisibility=true&visibilityTimeout=60";
我有一个 Apache 消费者从 SQS 标准队列读取消息并处理它。
有些消息的处理时间很短(1-2 分钟),而有些消息需要很长时间(70-80 分钟)。
我没有在 Camel 配置中明确指定可见性超时,因此每条消息读取的可见性超时时间为 30 秒,如队列配置中所指定。
处理时间短的消息工作正常,但对于持续时间长的消息,Apache Camel 在完成处理后不会删除消息。 所以消息在队列中再次可用,Camel 再次读取消息,处理它很长时间,然后重复这个循环。
我知道消息重新出现在队列中是因为可见性超时很低,但我担心的是 -
1.为什么 Camel 不在这些长 运行 作业的处理完成后立即删除消息?
2. 短作业的消息被正确删除(即使是短 运行 作业超过 30 秒的可见性超时)
没有任何错误或异常发生。
我什至做了一个示例 POC 作业,除了等待很长时间(85 分钟)然后打印一条成功消息外什么都不做。我注意到作业已成功完成,但 Camel 并未删除该消息。 为什么?
我使用 Camel 中的配置选项修复了此问题 - 'extendMessageVisibility'。 当我们将此选项设置为 true 时,Camel 会运行一个后台任务,不断延长消息的可见性超时,直到它被消费者处理。
同样,我真正的问题不是消息再次在队列中可见,而是它没有被 Camel 消费者删除。
但是,根据我的观察,我看到应用 extendMessageVisibility 选项导致 Camel 跟踪消息然后正确删除它。
我们可以这样配置队列 URI:
String queueUri = "aws-sqs://" + queueName + "?amazonSQSClient=#client&extendMessageVisibility=true&visibilityTimeout=60";