Eine mögliche Lösung ist die Nachricht hash irgendeine Art von Hash-Funktion verwenden Sie definieren, überprüfen dann ein Cache-Objekt für diesen Hash. Wenn es da ist, füge eins bis zum konfigurierbaren Maximum zum Cache hinzu, und wenn es nicht dort ist, setze es auf 1. Hier ist ein schneller und dreckiger Prototyp für dich (beachte, dass das mcache
Objekt im Bereich für alle Abonnenten sein sollte):
var mcache = {}, maxRetries = 3;
q.subscribe({ack: true}, function(data,headers,deliveryInfo,message) {
var messagehash = hash(message);
if(mcache[messagehash] === undefined){
mcache[messagehash] = 0;
}
if(mcache[messagehash] > maxRetries) {
q.shift(true,false); //reject true, requeue false (discard message)
delete mcache[messagehash]; //don't leak memory
} else {
try{
doSomething(data);
q.shift(false); //reject false
delete mcache[messagehash]; //don't leak memory
} catch(e) {
mcache[messagehash]++;
q.shift(true,true); //reject true, requeue true
}
}
}
Wenn die Nachricht eine GUID hat, können Sie diese in der Hash-Funktion einfach zurückgeben.
Mögliche duplizieren http://stackoverflow.com/q/17654475 – pinepain
Wie werden Sie Nachrichten eindeutig identifiziert? Haben Sie eine eigene ID in der Nachrichtennutzlast? –
In meinem Fall (aber ich bin nicht das OP) - ja, Nachrichten können durch ihre UUID identifiziert werden. Leider ist es nicht genug, einen einfachen Zähler im Abonnenten zu haben, da ich mehrere Abonnenten in derselben Warteschlange habe, um die Arbeit auszugleichen, und die Anzahl der Wiederholungen sollte global sein, nicht lokal für jeden Arbeiter. –