考えられる解決策の 1 つは、定義した何らかのハッシュ関数を使用してメッセージをハッシュし、キャッシュ オブジェクトでそのハッシュをチェックすることです。存在する場合は、構成可能な最大値までキャッシュに 1 つ追加し、存在しない場合は 1 に設定します。簡単で汚いプロトタイプを次に示します (mcache
オブジェクトはすべてのサブスクライバーのスコープ内にある必要があることに注意してください)。
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
}
}
}
メッセージに GUID がある場合は、ハッシュ関数でそれを返すだけです。