@@ -60,6 +60,8 @@ public class AutorecoveringConnection implements Connection, Recoverable, Networ
6060 private final List <RecordedBinding > recordedBindings = new ArrayList <RecordedBinding >();
6161 private Map <String , RecordedExchange > recordedExchanges = new ConcurrentHashMap <String , RecordedExchange >();
6262 private final Map <String , RecordedConsumer > consumers = new ConcurrentHashMap <String , RecordedConsumer >();
63+ private List <ConsumerRecoveryListener > consumerRecoveryListeners = new ArrayList <ConsumerRecoveryListener >();
64+ private List <QueueRecoveryListener > queueRecoveryListeners = new ArrayList <QueueRecoveryListener >();
6365
6466 public AutorecoveringConnection (ConnectionParams params , FrameHandlerFactory f , Address [] addrs ) {
6567 this .cf = new RecoveryAwareAMQConnectionFactory (params , f , addrs );
@@ -355,6 +357,44 @@ public void shutdownCompleted(ShutdownSignalException cause) {
355357 }
356358 }
357359
360+ /**
361+ * Not part of the public API. Mean to be used by JVM RabbitMQ clients that build on
362+ * top of the Java client and need to be notified when server-named queue name changes
363+ * after recovery.
364+ *
365+ * @param listener listener that observes queue name changes after recovery
366+ */
367+ public void addQueueRecoveryListener (QueueRecoveryListener listener ) {
368+ this .queueRecoveryListeners .add (listener );
369+ }
370+
371+ /**
372+ * @see com.rabbitmq.client.impl.recovery.AutorecoveringConnection#addQueueRecoveryListener
373+ * @param listener listener to be removed
374+ */
375+ public void removeQueueRecoveryListener (QueueRecoveryListener listener ) {
376+ this .queueRecoveryListeners .remove (listener );
377+ }
378+
379+ /**
380+ * Not part of the public API. Mean to be used by JVM RabbitMQ clients that build on
381+ * top of the Java client and need to be notified when consumer tag changes
382+ * after recovery.
383+ *
384+ * @param listener listener that observes consumer tag changes after recovery
385+ */
386+ public void addConsumerRecoveryListener (ConsumerRecoveryListener listener ) {
387+ this .consumerRecoveryListeners .add (listener );
388+ }
389+
390+ /**
391+ * @see com.rabbitmq.client.impl.recovery.AutorecoveringConnection#addConsumerRecoveryListener(ConsumerRecoveryListener)
392+ * @param listener listener to be removed
393+ */
394+ public void removeConsumerRecoveryListener (ConsumerRecoveryListener listener ) {
395+ this .consumerRecoveryListeners .remove (listener );
396+ }
397+
358398 synchronized private void beginAutomaticRecovery () throws InterruptedException , IOException , TopologyRecoveryException {
359399 Thread .sleep (this .params .getNetworkRecoveryInterval ());
360400 this .recoverConnection ();
@@ -455,6 +495,9 @@ private void recoverQueues() {
455495 this .propagateQueueNameChangeToBindings (oldName , newName );
456496 this .propagateQueueNameChangeToConsumers (oldName , newName );
457497 }
498+ for (QueueRecoveryListener qrl : this .queueRecoveryListeners ) {
499+ qrl .queueRecovered (oldName , newName );
500+ }
458501 } catch (Exception cause ) {
459502 final String message = "Caught an exception while recovering queue " + oldName +
460503 ": " + cause .getMessage ();
@@ -490,6 +533,9 @@ private void recoverConsumers() {
490533 this .consumers .remove (tag );
491534 this .consumers .put (newTag , consumer );
492535 }
536+ for (ConsumerRecoveryListener crl : this .consumerRecoveryListeners ) {
537+ crl .consumerRecovered (tag , newTag );
538+ }
493539 } catch (Exception cause ) {
494540 final String message = "Caught an exception while recovering consumer " + tag +
495541 ": " + cause .getMessage ();
0 commit comments