@@ -83,6 +83,8 @@ public class AutorecoveringConnection implements RecoverableConnection, NetworkC
8383 private final Map <String , RecordedConsumer > consumers = Collections .synchronizedMap (new LinkedHashMap <String , RecordedConsumer >());
8484 private final List <ConsumerRecoveryListener > consumerRecoveryListeners = Collections .synchronizedList (new ArrayList <ConsumerRecoveryListener >());
8585 private final List <QueueRecoveryListener > queueRecoveryListeners = Collections .synchronizedList (new ArrayList <QueueRecoveryListener >());
86+
87+ private final TopologyRecoveryFilter topologyRecoveryFilter ;
8688
8789 // Used to block connection recovery attempts after close() is invoked.
8890 private volatile boolean manuallyClosed = false ;
@@ -108,11 +110,11 @@ public AutorecoveringConnection(ConnectionParams params, FrameHandlerFactory f,
108110 this .connectionRecoveryTriggeringCondition = params .getConnectionRecoveryTriggeringCondition () == null ?
109111 DEFAULT_CONNECTION_RECOVERY_TRIGGERING_CONDITION : params .getConnectionRecoveryTriggeringCondition ();
110112
111- System .out .println (this .connectionRecoveryTriggeringCondition );
112-
113113 setupErrorOnWriteListenerForPotentialRecovery ();
114114
115115 this .channels = new ConcurrentHashMap <>();
116+ this .topologyRecoveryFilter = params .getTopologyRecoveryFilter () == null ?
117+ letAllPassFilter () : params .getTopologyRecoveryFilter ();
116118 }
117119
118120 private void setupErrorOnWriteListenerForPotentialRecovery () {
@@ -140,6 +142,31 @@ public void run() {
140142 });
141143 }
142144
145+ private TopologyRecoveryFilter letAllPassFilter () {
146+ return new TopologyRecoveryFilter () {
147+
148+ @ Override
149+ public boolean filterExchange (RecordedExchange recordedExchange ) {
150+ return true ;
151+ }
152+
153+ @ Override
154+ public boolean filterQueue (RecordedQueue recordedQueue ) {
155+ return true ;
156+ }
157+
158+ @ Override
159+ public boolean filterBinding (RecordedBinding recordedBinding ) {
160+ return true ;
161+ }
162+
163+ @ Override
164+ public boolean filterConsumer (RecordedConsumer recordedConsumer ) {
165+ return true ;
166+ }
167+ };
168+ }
169+
143170 /**
144171 * Private API.
145172 * @throws IOException
@@ -677,8 +704,10 @@ private void recoverTopology(final ExecutorService executor) {
677704 private void recoverExchange (final RecordedExchange x ) {
678705 // recorded exchanges are guaranteed to be non-predefined (we filter out predefined ones in exchangeDeclare). MK.
679706 try {
680- x .recover ();
681- LOGGER .debug ("{} has recovered" , x );
707+ if (topologyRecoveryFilter .filterExchange (x )) {
708+ x .recover ();
709+ LOGGER .debug ("{} has recovered" , x );
710+ }
682711 } catch (Exception cause ) {
683712 final String message = "Caught an exception while recovering exchange " + x .getName () +
684713 ": " + cause .getMessage ();
@@ -688,30 +717,33 @@ private void recoverExchange(final RecordedExchange x) {
688717 }
689718
690719 private void recoverQueue (final String oldName , final RecordedQueue q ) {
691- LOGGER . debug ( "Recovering {}" , q );
720+
692721 try {
693- q .recover ();
694- String newName = q .getName ();
695- if (!oldName .equals (newName )) {
696- // make sure server-named queues are re-added with
697- // their new names. MK.
698- synchronized (this .recordedQueues ) {
699- this .propagateQueueNameChangeToBindings (oldName , newName );
700- this .propagateQueueNameChangeToConsumers (oldName , newName );
701- // bug26552:
702- // remove old name after we've updated the bindings and consumers,
703- // plus only for server-named queues, both to make sure we don't lose
704- // anything to recover. MK.
705- if (q .isServerNamed ()) {
706- deleteRecordedQueue (oldName );
722+ if (topologyRecoveryFilter .filterQueue (q )) {
723+ LOGGER .debug ("Recovering {}" , q );
724+ q .recover ();
725+ String newName = q .getName ();
726+ if (!oldName .equals (newName )) {
727+ // make sure server-named queues are re-added with
728+ // their new names. MK.
729+ synchronized (this .recordedQueues ) {
730+ this .propagateQueueNameChangeToBindings (oldName , newName );
731+ this .propagateQueueNameChangeToConsumers (oldName , newName );
732+ // bug26552:
733+ // remove old name after we've updated the bindings and consumers,
734+ // plus only for server-named queues, both to make sure we don't lose
735+ // anything to recover. MK.
736+ if (q .isServerNamed ()) {
737+ deleteRecordedQueue (oldName );
738+ }
739+ this .recordedQueues .put (newName , q );
707740 }
708- this .recordedQueues .put (newName , q );
709741 }
742+ for (QueueRecoveryListener qrl : Utility .copy (this .queueRecoveryListeners )) {
743+ qrl .queueRecovered (oldName , newName );
744+ }
745+ LOGGER .debug ("{} has recovered" , q );
710746 }
711- for (QueueRecoveryListener qrl : Utility .copy (this .queueRecoveryListeners )) {
712- qrl .queueRecovered (oldName , newName );
713- }
714- LOGGER .debug ("{} has recovered" , q );
715747 } catch (Exception cause ) {
716748 final String message = "Caught an exception while recovering queue " + oldName +
717749 ": " + cause .getMessage ();
@@ -722,8 +754,10 @@ private void recoverQueue(final String oldName, final RecordedQueue q) {
722754
723755 private void recoverBinding (final RecordedBinding b ) {
724756 try {
725- b .recover ();
726- LOGGER .debug ("{} has recovered" , b );
757+ if (this .topologyRecoveryFilter .filterBinding (b )) {
758+ b .recover ();
759+ LOGGER .debug ("{} has recovered" , b );
760+ }
727761 } catch (Exception cause ) {
728762 String message = "Caught an exception while recovering binding between " + b .getSource () +
729763 " and " + b .getDestination () + ": " + cause .getMessage ();
@@ -733,22 +767,24 @@ private void recoverBinding(final RecordedBinding b) {
733767 }
734768
735769 private void recoverConsumer (final String tag , final RecordedConsumer consumer ) {
736- LOGGER .debug ("Recovering {}" , consumer );
737770 try {
738- String newTag = consumer .recover ();
739- // make sure server-generated tags are re-added. MK.
740- if (tag != null && !tag .equals (newTag )) {
741- synchronized (this .consumers ) {
742- this .consumers .remove (tag );
743- this .consumers .put (newTag , consumer );
771+ if (this .topologyRecoveryFilter .filterConsumer (consumer )) {
772+ LOGGER .debug ("Recovering {}" , consumer );
773+ String newTag = consumer .recover ();
774+ // make sure server-generated tags are re-added. MK.
775+ if (tag != null && !tag .equals (newTag )) {
776+ synchronized (this .consumers ) {
777+ this .consumers .remove (tag );
778+ this .consumers .put (newTag , consumer );
779+ }
780+ consumer .getChannel ().updateConsumerTag (tag , newTag );
744781 }
745- consumer .getChannel ().updateConsumerTag (tag , newTag );
746- }
747782
748- for (ConsumerRecoveryListener crl : Utility .copy (this .consumerRecoveryListeners )) {
749- crl .consumerRecovered (tag , newTag );
783+ for (ConsumerRecoveryListener crl : Utility .copy (this .consumerRecoveryListeners )) {
784+ crl .consumerRecovered (tag , newTag );
785+ }
786+ LOGGER .debug ("{} has recovered" , consumer );
750787 }
751- LOGGER .debug ("{} has recovered" , consumer );
752788 } catch (Exception cause ) {
753789 final String message = "Caught an exception while recovering consumer " + tag +
754790 ": " + cause .getMessage ();
0 commit comments