2016-06-02 10 views
1

Ich verwende direkten Austausch, um Nachrichten zu bestimmten Warteschlangen mit Routing-Schlüssel zu veröffentlichen, alle in Kaninchen-Server-Code nicht konfiguriert, ich nehme Nachrichten mit Feder Micro-Service dann einige Fehler innerhalb der Empfangsmethode passiert, dann die Nachricht re -wurde verursacht Schleife, so würde ich gerne eine Richtlinie mit Kaninchen-Server hinzufügen, um diese Art von Neueinreihen zu verhindern, könnte es als ein Argument hinzugefügt werden, während Bindung Warteschlange mit Austausch mit bestimmten Routing-Schlüssel, oder es sollte eine Richtlinie sein ?Wie kann man verhindern, dass die Nachricht innerhalb des rabbitmq-Servers neu ansteht?

Antwort

0

Bei jeder Ausnahme standardmäßig Spring senden nack mit requeue "true". Wenn Sie in Ihrer Frühlingsbenutzeranwendung requeue false senden möchten, dann werfen Sie die Ausnahme "AmqpRejectAndDontRequeueException". So sollte Ihr Verbraucher Code so etwas wie dieses loook:

`void onMessage(){ 
    try{ 
    // Your Code Here 
    } catch(Exception e){ 
    throw new AmqpRejectAndDontRequeueException(); 
    } 
}` 
+0

Dank für die Antwort, es nicht helfen, viel in meinem Fall, weil der try-Block wurde mit Feder JPA die empfangene Nachricht speichern dann SqlExceptionHelper (eindeutige Einschränkung verletzt) passiert irgendwo anders nicht in meinem Block gefangen, also kann ich das im Kaninchen-Server stattdessen behandeln? –

+0

Wenn eine Nachricht verbraucht wird, wird sie entweder erfolgreich verarbeitet oder sie wird nicht verarbeitet. Und wenn es dann nicht verarbeitet wurde, sollte es entweder manuell behandelt werden oder abgelehnt werden. In Ihrem Fall kann es nicht verarbeitet werden und die Ausnahme wird an SQLExceptionHelper übergeben. Also warum wirfst du es nicht von dem Ort weg, wo du diese Ausnahme behandelst. – Manmay

+0

Da nun derselbe Consumer-Thread die Ausnahme auslöst, ist es wichtig, die Exception in diesem Thread zu kontrollieren und in den Weg zu werfen. – Manmay