Ich versuche, Probe Retry-Mechanismus für RabbitMQ mit Spring StatefulRetryOperationsInterceptor zu implementieren.Wie benutze MessageKeyGenerator in StatefulRetryOperationsInterceptor
Wie in der Dokumentation angegeben, muss ich den Nachrichtenschlüsselgenerator einrichten, da die Nachrichten-ID nicht vorhanden ist. Was ich nicht verstehe, ist die tatsächliche Verwendung einer eindeutigen ID, die pro Nachricht generiert wird. das heißt, wenn ich unten Implementierung verwenden ich hatte kein Problem mit Wiederholungs:
StatefulRetryOperationsInterceptor interceptor =
RetryInterceptorBuilder.stateful()
.maxAttempts(3)
.backOffOptions(2000, 1, 2000)
.messageKeyGenerator(
new MessageKeyGenerator() {
@Override
public Object getKey(Message message) {
return 1;
}
);
container.setAdviceChain(new Advice[] {interceptor});
Hallo Gary, Danke für deine Antwort. Ich kann eindeutige ID pro Nachricht mit MessageKeyGenerator generieren. Aber ich wollte testen, ob die Wiederholung funktioniert, wenn die gleiche ID für alle Nachrichten verwendet wird, und ich habe festgestellt, dass die Wiederholung für alle Nachrichten funktioniert. Also, ich verstehe immer noch nicht Notwendigkeit für eine eindeutige ID. Können Sie bitte helfen? Danke noch einmal. –
Sie werden kein Problem haben, wenn die Container-Parallelität "== 1" ist, da jede Zustellung im selben Thread stattfindet und die Wiederholungen für eine Nachricht erschöpft sind, bevor die nächste verarbeitet wird. Sobald Sie die Parallelität erhöhen, werden mehrere Nachrichten an verschiedene Threads übermittelt. Wenn sie alle den gleichen Nachrichtenschlüssel haben, funktioniert die Wiederholung nicht ordnungsgemäß. Bei einer erfolgreichen Zustellung wird der Status zurückgesetzt, sodass eine ungültige Nachricht häufiger als erwartet wiederholt wird. –
Danke Gary, hab es jetzt :) Prost. –