2016-04-12 5 views
0

Wir verwenden die Version 1.3.1 mit RabbitMQ 3.5.7 als Nachrichtenbus.Nachrichtenpriorisierung mit Spring-XD

Für einen Stream, der Nachrichten über eine Eingabewarteschlange empfängt, möchte ich die Nachrichtenpriorität festlegen können. Ich habe bestätigt, dass dies über die amqp-Vorlage und den MessagePostProcessor möglich ist. Das ist, wenn ich die Warteschlange (ohne Verbraucher) untersuche, sehe ich den priority header richtig eingestellt. Wenn ich jedoch den Stream (mit nur einem Consumer) bereitstelle, verbraucht er in der Reihenfolge, in der die Nachrichten empfangen wurden. Basierend auf meinem Lesen sollte die Nachricht der Priorität von 7 vor einer Nachricht mit Priorität 5 zum Beispiel verbraucht werden - ich hoffe, das ist richtig?

Meine Frage ist, muss ich etwas auf der Seite Spring-XD-Setup tun, um die Nachrichtenpriorisierung zu aktivieren?

Danke, Mark

Hallo Gary - ich glaube, die Nachricht Bus gut ist. Das Problem ist auf dem Produzenten, den ich über erschaffe:

<rabbit:queue name="foo"> 
    <rabbit:queue-arguments> 
     <entry key="x-max-priority" value="10"/> 
    </rabbit:queue-arguments> 
</rabbit:queue> 

Diese Warteschlange erstellen wird/instanziiert auf einem feder Batch-Job uns. Ich schaute in den Fehlerprotokollen für rabbitmq: Es Diese Nachricht hatte:

= ERROR REPORT ==== 13-Apr-2016 :: 11: 01: 35 === Kanalfehler auf Verbindung < 0,15708. 1> (127.0.0.1:40887 -> 127.0.0.1:5672, vhost: '/', Benutzer: 'Gast'), Kanal 1: {amqp_error, precondition_failed, "nicht äquivalent arg 'x-max-priority' für Warteschlange 'xdbus.queue: CPSFileCopyWorker_ws0' in vHost '/': 'aufgenommen 10' aber Strom ist '10',“ 'queue.declare'}

Dies scheint die Warteschlangendefinition zu ermöglichen fo r eine bereits erstellte Warteschlange wir die Priorität arg Satz:

<rabbit:queue name="foo" auto-declare="false"> 
    <rabbit:queue-arguments> 
     <entry key="x-max-priority" value="10"/> 
    </rabbit:queue-arguments> 
</rabbit:queue> 
+0

Ich glaube, ich einen Weg, um mein Problem gefunden - ich auf die das Auto-declare = false Attribut hinzufügen hatte Queue-Definition –

Antwort

0

Ich nehme an, Sie einen Strom bedeuten rabbit | ... statt reden über die interne Warteschlangen von XD verwendet, wenn ein Kaninchen Verkehrsmitteln.

Wenn ja, ist auf der XD-Seite nichts besonderes erforderlich, aber Sie müssen configure the queue to support priority.

EDIT

Hier ist der Code aus dem Message Bus ...

private void declareQueueIfNotPresent(Queue queue) { 
    if (this.rabbitAdmin.getQueueProperties(queue.getName()) == null) { 
     this.rabbitAdmin.declareQueue(queue); 
    } 
} 
+0

Hallo Gary - ja für Kaninchen_Input_queue> .... danke ich werde diese Anweisungen auschecken. –

+0

sieht wie folgt aus sollte mich dort: \t \t \t

+0

Ja; sieht richtig aus; Beachten Sie, dass dies RabbitMQ 3.5 oder höher erfordert und Sie können es nicht ändern, wenn die Warteschlange bereits existiert (die Warteschlange muss zuerst gelöscht werden). –