Fehlermeldung "unbekannter Lieferzeit-tag" tritt auf, wenn ich versuche ack-Nachrichten zu RabbitMQ mit pika (python)
Möchte ich die Verarbeitung von Nachrichten in paar threads aber ich bin immer ein Fehler während der Ausführung dieses Codes:
from __future__ import with_statement
import pika
import sys
from pika.adapters.blocking_connection import BlockingConnection
from pika import connection, credentials
import time
import threading
import random
from pika.adapters.select_connection import SelectConnection
from pika.connection import Connection
import traceback
def doWork(body, args, channel):
r = random.random()
time.sleep(r * 10)
try:
channel.basic_ack(delivery_tag=args.delivery_tag)
except :
traceback.print_exc()
auth = credentials.PlainCredentials(username="guest", password="guest")
params = connection.ConnectionParameters(host="localhost", credentials=auth)
conn = BlockingConnection(params)
channel = conn.channel()
while True:
time.sleep(0.03)
try:
method_frame, header_frame, body = channel.basic_get(queue="test_queue")
if method_frame.NAME == 'Basic.GetEmpty':
continue
t = threading.Thread(target=doWork, args=[body, method_frame, channel])
t.setDaemon(True)
t.start()
except Exception, e:
traceback.print_exc()
continue
Fehler desctiption:
Traceback (most recent call last): Datei "C:\work\projects\mq\start.py", line 43, in method_frame, header_frame, Körper = Kanal.basic_get(queue="test_queue") Datei "C:\work\projects\mq\libs\pika\adapters\blocking_connection.py" Linie 318, in basic_get selbst.basic_get_(self, self._on_basic_get, Tickets, queue, no_ack) Datei "C:\work\projects\mq\libs\pika\channel.py", line 469, in basic_get no_ack=no_ack)) Datei "C:\work\projects\mq\libs\pika\adapters\blocking_connection.py", line 244, in send_method selbst.- Verbindung.process_data_events() Datei "C:\work\projects\mq\libs\pika\adapters\blocking_connection.py", line 94, in process_data_events selbst._handle_read() Datei "C:\work\projects\mq\libs\pika\adapters\base_connection.py", line 162, in _handle_read selbst._on_data_available(Daten) Datei "C:\work\projects\mq\libs\pika\connection.py", line 589, in _on_data_available frame) # Args Datei "C:\work\projects\mq\libs\pika\callback.py", line 124, in Prozess callback(*args, **keywords) Datei "C:\work\projects\mq\libs\pika\adapters\blocking_connection.py", line 269, in _on_remote_close frame.Methode.reply_text) AMQPChannelError: (406, 'PRECONDITION_FAILED - unbekannt-Lieferung-tag 204')
Versionen: pika 0.9.5, rabbitMQ 2.6.1
InformationsquelleAutor der Frage solo117 | 2012-02-22
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist das problem wahrscheinlich ist, dass Sie sind Einstellung
no_ack=True
wie diese:Und dann die Anerkennung der Nachrichten:
Wählen Sie, wenn Sie möchten, um zu bestätigen oder nicht, und stellen Sie die korrekte verbrauchen parameter.
InformationsquelleAutor der Antwort Maiku Mori
Für mich war es nur sagte, dass ich die queue-ich war nicht dabei, ack, dann habe ich acked.
E. g. FALSCH:
und dann in mein callback:
RECHT:
Bottom line: Wenn Sie manuell ack, set no_ack=False.
Aus der docs:
InformationsquelleAutor der Antwort David Beckwith
Ich habe keine Lösung, aber ich kann diese nur bestätigen, es tritt mit dem BlockingConnection
adapter.
Konsequent tritt auf, wenn die Anerkennung oder Ablehnung einer Nachricht, die übermittelt in der Antwort auf einen Kanal.basic_recover()
pika 0.9.5, rabbitMQ 2.2.0, python 2.7 und Erlang R14B01
Den workaround habe ich in immer angeben deliver_tag=0
Ich vermute, dass dies nur funktioniert, wenn die Nachricht, die Sie durch ACK bestätigt/nacking ist die Letzte, die Sie gelesen haben (in-stream). Die Bibliothek, die ich Schreibe, vermindert die Nachricht in einer Weise, dass jeder kann unabhängig anerkannt, die Pausen mit dieser Lösung.
Kann jemand bestätigen, ob dies behoben wurde oder anerkannt, von jedermann über das pika-team noch ? Oder, könnte es sein das es ein Problem mit RabbitMQ ?
InformationsquelleAutor der Antwort Damion K. Wilson
Es ist ein Fehler mit dem code. Sie teilen sich einen Kanal auf mehrere threads. Dies wird nicht unterstützt von pika (siehe FAQ). Sie haben 2 Optionen:
no_ack=True
fahne inbasic_get(...)
verwenden Sie nicht den Kanal-Objekt im thread die FunktiondoWork(...)
Wenn Sie brauchen, um ACK-Nachricht erst, nachdem Sie Ihre Arbeit beendet haben, dann lassen Sie den Haupt-thread (die
while True:
Schleife) verarbeiten der Nachricht " ack " (und nicht der worker-thread). Unten ist eine modifizierte version des Codes, die das tut.InformationsquelleAutor der Antwort mike
Nachdem ich RabbitMQ - auf eine neue version aktualisiert und bekam eine Menge von "PRECONDITION_FAILED unbekannten Lieferung-tag 1"
Änderte ich meine basic-konsumieren wie folgt Aussehen:
Dies hatte den Effekt, verursacht den beschriebenen Fehler auf der ersten (nicht nachgeliefert) Danksagung bei der Nachrichtenzustellung-tag angegeben wurde. Die Lieferung wurde extrahiert aus der Nachricht, die Lieferung Methode, Struktur.
Mit
unterdrückt die Fehler auch in diesem Fall
Blick auf http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2011-July/013664.html macht es den Anschein, als ob es möglicherweise ein Problem in RabbitMQ.
InformationsquelleAutor der Antwort Damion K. Wilson