2017-09-05 4 views
1

Je développe un client RabbitMQ avec pika 0.10.0 et une version python 2.7. Dans mon client consommateur, j'ai un processus qui s'exécute pendant un certain temps en fonction du message d'entrée. Cela peut varier de 3 à 40 minutes. Je ne veux pas désactiver le rythme cardiaque. Au lieu de cela je cherche un mécanisme de recollement qui peut maintenir la connexion jusqu'à ce que delivery_tag soit renvoyé. Est-ce possible?Gardez pika BlockingConnection vivant sans désactiver le battement de coeur

Peu de liens que j'ai, tous suggèrent de désactiver le rythme cardiaque comme solution de contournement. Mais je ne veux pas le désactiver.

Ref:

Socket Error: 104 consuming messages with task that take a long time #753

BlockingConnection gets closed unexpectedly #734

Aussi, s'il vous plaît laissez-moi savoir si toute information supplémentaire est nécessaire. Merci d'avance.

Répondre

2

La seule solution consiste à envoyer des trames de rythme cardiaque périodiquement.

Lorsque vous utilisez un BlockingConnection, vous devez appeler la fonction process_data_events assez souvent (un time_limit est ok de zéro). Lorsque vous utilisez un SelectConnection ou d'autres cartes asynchrones, vous devez vous assurer qu'aucun de vos processus ne bloque, afin que les trames puissent être envoyées.

Si votre tâche est longue et que vous ne pouvez pas interrompre ou diviser facilement le processus pour une raison quelconque, vous pouvez exécuter la tâche dans un autre processus/thread, tout en ayant des trames envoyées par le thread principal. Gardez juste à l'esprit que vous devriez éviter d'utiliser les connexions pika à travers les threads (pika n'est pas thread-safe pour le moment).