@@ -80,6 +80,8 @@ public class AutorecoveringConnection implements RecoverableConnection, NetworkC
8080 private final Map <String , RecordedConsumer > consumers = Collections .synchronizedMap (new LinkedHashMap <String , RecordedConsumer >());
8181 private final List <ConsumerRecoveryListener > consumerRecoveryListeners = Collections .synchronizedList (new ArrayList <ConsumerRecoveryListener >());
8282 private final List <QueueRecoveryListener > queueRecoveryListeners = Collections .synchronizedList (new ArrayList <QueueRecoveryListener >());
83+
84+ private final TopologyRecoveryFilter topologyRecoveryFilter ;
8385
8486 // Used to block connection recovery attempts after close() is invoked.
8587 private volatile boolean manuallyClosed = false ;
@@ -103,6 +105,10 @@ public AutorecoveringConnection(ConnectionParams params, FrameHandlerFactory f,
103105 setupErrorOnWriteListenerForPotentialRecovery ();
104106
105107 this .channels = new ConcurrentHashMap <Integer , AutorecoveringChannel >();
108+
109+
110+ this .topologyRecoveryFilter = params .getTopologyRecoveryFilter () == null ?
111+ letAllPassFilter () : params .getTopologyRecoveryFilter ();
106112 }
107113
108114 private void setupErrorOnWriteListenerForPotentialRecovery () {
@@ -133,6 +139,31 @@ public void run() {
133139 });
134140 }
135141
142+ private TopologyRecoveryFilter letAllPassFilter () {
143+ return new TopologyRecoveryFilter () {
144+
145+ @ Override
146+ public boolean filterExchange (RecordedExchange recordedExchange ) {
147+ return true ;
148+ }
149+
150+ @ Override
151+ public boolean filterQueue (RecordedQueue recordedQueue ) {
152+ return true ;
153+ }
154+
155+ @ Override
156+ public boolean filterBinding (RecordedBinding recordedBinding ) {
157+ return true ;
158+ }
159+
160+ @ Override
161+ public boolean filterConsumer (RecordedConsumer recordedConsumer ) {
162+ return true ;
163+ }
164+ };
165+ }
166+
136167 /**
137168 * Private API.
138169 * @throws IOException
@@ -655,8 +686,10 @@ private void recoverTopology(final ExecutorService executor) {
655686 private void recoverExchange (final RecordedExchange x ) {
656687 // recorded exchanges are guaranteed to be non-predefined (we filter out predefined ones in exchangeDeclare). MK.
657688 try {
658- x .recover ();
659- LOGGER .debug ("{} has recovered" , x );
689+ if (topologyRecoveryFilter .filterExchange (x )) {
690+ x .recover ();
691+ LOGGER .debug ("{} has recovered" , x );
692+ }
660693 } catch (Exception cause ) {
661694 final String message = "Caught an exception while recovering exchange " + x .getName () +
662695 ": " + cause .getMessage ();
@@ -666,30 +699,33 @@ private void recoverExchange(final RecordedExchange x) {
666699 }
667700
668701 private void recoverQueue (final String oldName , final RecordedQueue q ) {
669- LOGGER . debug ( "Recovering {}" , q );
702+
670703 try {
671- q .recover ();
672- String newName = q .getName ();
673- if (!oldName .equals (newName )) {
674- // make sure server-named queues are re-added with
675- // their new names. MK.
676- synchronized (this .recordedQueues ) {
677- this .propagateQueueNameChangeToBindings (oldName , newName );
678- this .propagateQueueNameChangeToConsumers (oldName , newName );
679- // bug26552:
680- // remove old name after we've updated the bindings and consumers,
681- // plus only for server-named queues, both to make sure we don't lose
682- // anything to recover. MK.
683- if (q .isServerNamed ()) {
684- deleteRecordedQueue (oldName );
704+ if (topologyRecoveryFilter .filterQueue (q )) {
705+ LOGGER .debug ("Recovering {}" , q );
706+ q .recover ();
707+ String newName = q .getName ();
708+ if (!oldName .equals (newName )) {
709+ // make sure server-named queues are re-added with
710+ // their new names. MK.
711+ synchronized (this .recordedQueues ) {
712+ this .propagateQueueNameChangeToBindings (oldName , newName );
713+ this .propagateQueueNameChangeToConsumers (oldName , newName );
714+ // bug26552:
715+ // remove old name after we've updated the bindings and consumers,
716+ // plus only for server-named queues, both to make sure we don't lose
717+ // anything to recover. MK.
718+ if (q .isServerNamed ()) {
719+ deleteRecordedQueue (oldName );
720+ }
721+ this .recordedQueues .put (newName , q );
685722 }
686- this .recordedQueues .put (newName , q );
687723 }
724+ for (QueueRecoveryListener qrl : Utility .copy (this .queueRecoveryListeners )) {
725+ qrl .queueRecovered (oldName , newName );
726+ }
727+ LOGGER .debug ("{} has recovered" , q );
688728 }
689- for (QueueRecoveryListener qrl : Utility .copy (this .queueRecoveryListeners )) {
690- qrl .queueRecovered (oldName , newName );
691- }
692- LOGGER .debug ("{} has recovered" , q );
693729 } catch (Exception cause ) {
694730 final String message = "Caught an exception while recovering queue " + oldName +
695731 ": " + cause .getMessage ();
@@ -700,8 +736,10 @@ private void recoverQueue(final String oldName, final RecordedQueue q) {
700736
701737 private void recoverBinding (final RecordedBinding b ) {
702738 try {
703- b .recover ();
704- LOGGER .debug ("{} has recovered" , b );
739+ if (this .topologyRecoveryFilter .filterBinding (b )) {
740+ b .recover ();
741+ LOGGER .debug ("{} has recovered" , b );
742+ }
705743 } catch (Exception cause ) {
706744 String message = "Caught an exception while recovering binding between " + b .getSource () +
707745 " and " + b .getDestination () + ": " + cause .getMessage ();
@@ -711,22 +749,24 @@ private void recoverBinding(final RecordedBinding b) {
711749 }
712750
713751 private void recoverConsumer (final String tag , final RecordedConsumer consumer ) {
714- LOGGER .debug ("Recovering {}" , consumer );
715752 try {
716- String newTag = consumer .recover ();
717- // make sure server-generated tags are re-added. MK.
718- if (tag != null && !tag .equals (newTag )) {
719- synchronized (this .consumers ) {
720- this .consumers .remove (tag );
721- this .consumers .put (newTag , consumer );
753+ if (this .topologyRecoveryFilter .filterConsumer (consumer )) {
754+ LOGGER .debug ("Recovering {}" , consumer );
755+ String newTag = consumer .recover ();
756+ // make sure server-generated tags are re-added. MK.
757+ if (tag != null && !tag .equals (newTag )) {
758+ synchronized (this .consumers ) {
759+ this .consumers .remove (tag );
760+ this .consumers .put (newTag , consumer );
761+ }
762+ consumer .getChannel ().updateConsumerTag (tag , newTag );
722763 }
723- consumer .getChannel ().updateConsumerTag (tag , newTag );
724- }
725764
726- for (ConsumerRecoveryListener crl : Utility .copy (this .consumerRecoveryListeners )) {
727- crl .consumerRecovered (tag , newTag );
765+ for (ConsumerRecoveryListener crl : Utility .copy (this .consumerRecoveryListeners )) {
766+ crl .consumerRecovered (tag , newTag );
767+ }
768+ LOGGER .debug ("{} has recovered" , consumer );
728769 }
729- LOGGER .debug ("{} has recovered" , consumer );
730770 } catch (Exception cause ) {
731771 final String message = "Caught an exception while recovering consumer " + tag +
732772 ": " + cause .getMessage ();
0 commit comments