2017-08-19 2 views
0

J'ai un SQS Listener avec un nombre maximal de messages de 10. Lorsque mon client reçoit un lot de 10 messages, ils sont tous traités mais parfois (selon le message) le processus prendra 5-6 heures et certains avec peu de comme 5 minutes. J'ai 3 consommateurs (3 JVM différentes) interroger de la file d'attente avec un maxMessageCount de 10. Voici mon problème:Spring SqsListener attend-il que le dernier message soit traité (ou complété) à partir du sondage en cours avant le prochain sondage des messages?

Si l'un de ces 10 messages prend 5 heures à traiter, il semble que l'auditeur attend pour faire le prochain sondage de 10 messages jusqu'à ce que tous les messages précédents soient complets à 100%. Y at-il un moyen de lui permettre d'interroger un nouveau lot de messages même si un autre est encore en cours de traitement?

Je suppose qu'il me manque quelque chose ici. Comment j'utilise la bibliothèque Spring Cloud et l'annotation SqsListener. Est-ce que quelqu'un a déjà traversé ça?

Aussi je ne pense pas que cela devrait importer mais la file d'attente est AWS SQS et là JVM s'exécutent sur un cluster ECS.

Répondre

0

Si vous exécutez la tâche sur le thread d'interrogation, l'interrogation suivante n'aura pas lieu tant que l'interrogation en cours ne sera pas terminée.

Vous pouvez utiliser un ExecutorChannel ou QueueChannel pour transférer le travail à un autre thread (ou threads), mais vous risquez de perdre des messages si vous le faites.

Votre situation est plutôt inhabituelle; 5 heures, c'est long pour traiter un message.

Vous devriez peut-être envisager de modifier votre application afin de conserver ces requêtes "longues" dans une base de données ou similaire, au lieu de les traiter directement à partir du message. Ou, peut-être les mettre dans une file d'attente différente afin qu'ils n'affectent pas les tâches plus courtes.