2016-08-08 36 views
0

Während der Anfrage die Nachricht möchten wir die Nachricht am Anfang/Vorderseite der Warteschlange platziert werden. Dies bedeutet, wenn ich in Warteschlange als "D, C, B, A" und Prozess A und dann in Warteschlange beim Start zurück setzen möchte, sollte meine Warteschlange wie folgt aussehen: - "A, D, C, B" . Also sollte ich in der Lage sein, B zu verarbeiten, und da A am Anfang der Warteschlange verschoben wurde, sollte es am Ende verarbeiten.Wie man eine Nachricht mit Hilfe der Feder ampq requeued

Interessanterweise funktioniert es, wenn es mit der nativen AMQP-Bibliothek von rabbitMQ versucht wird, wie oben erwartet.

Wenn wir es jedoch durch Frühjahr AMQP-Bibliothek tun, bleibt die Nachricht, wo immer es war, geht nicht an den Anfang der Warteschlange. Hier

ist der Code, den ich versuchte:

public void onMessage(Message message, com.rabbitmq.client.Channel channel) throws Exception { 
    if(new String(message.getBody()).equalsIgnoreCase("A")){ 
      System.out.println("Message = =="+new String(message.getBody())); 

      channel.basicReject(message.getMessageProperties().getDeliveryTag(), true); 
     }else{ 
      System.out.println("Message ==="+new String(message.getBody())); 
      channel.basicAck(message.getMessageProperties().getDeliveryTag(), true); 
     } 

} 

Jede Idee, warum es nicht im Frühjahr funktioniert, funktioniert aber in der rabbimq AMQP native Bibliothek?

Frühling AMQP Version: spring-AMQP-1.4.5.RELEASE RabbitMQ AMQP Client-Version: 3.5.1

Antwort

0

RabbitMQ wurde in Version 2.7 geändert Meldungen an der Spitze der Warteschlange requeue. Vorherige Versionen, die am Ende der Warteschlange requediert werden - see here.

Ihre Beobachtung liegt daran, dass Spring AMQP den Vorabruf standardmäßig auf 1 setzt (durch Aufruf von basicQos) - was nur 1 Nachricht auf dem Client ausstehen lässt. Wenn basicQos nicht aufgerufen wird, sendet der Broker alle vier Nachrichten an den Client, sodass angezeigt wird, dass die zurückgewiesene Nachricht an die Rückseite der Warteschlange ging, wenn die Warteschlange aufgrund Prefetch leer ist.

Wenn Sie die prefetchCount auf mindestens 4 setzen, wird das gleiche Verhalten angezeigt.

EDIT

Wenn Sie wirklich am Anfang Schlange stehen möchten, können Sie zusammen mit einem RepublishMessageRecoverer versuchen verwenden.

+0

Siehe auch meine Bearbeitung. –