diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java index c50f421d59..9c1f56a91c 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java @@ -1033,7 +1033,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding public RoutingStatus route(final Message message, final RoutingContext context, final boolean direct) throws Exception { - return route(message, context, direct, true, null); + return route(message, context, direct, true, null, false); } @Override @@ -1043,6 +1043,21 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding boolean rejectDuplicates, final Binding bindingMove) throws Exception { + return route(message, context, direct, rejectDuplicates, bindingMove, false); + } + + + /** + * The route can call itelf sending to DLA. + * if a DLA still not found, it should then use previous semantics. + * */ + private RoutingStatus route(final Message message, + final RoutingContext context, + final boolean direct, + boolean rejectDuplicates, + final Binding bindingMove, boolean sendToDLA) throws Exception { + + RoutingStatus result; // Sanity check if (message.getRefCount() > 0) { @@ -1102,7 +1117,13 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding AddressSettings addressSettings = addressSettingsRepository.getMatch(address.toString()); - boolean sendToDLA = addressSettings.isSendToDLAOnNoRoute(); + + if (sendToDLA) { + // it's already been through here once, giving up now + sendToDLA = false; + } else { + sendToDLA = addressSettings.isSendToDLAOnNoRoute(); + } if (sendToDLA) { // Send to the DLA for the address @@ -1123,7 +1144,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding message.reencode(); - route(message, context.getTransaction(), false); + route(message, new RoutingContextImpl(context.getTransaction()), false, true, null, sendToDLA); result = RoutingStatus.NO_BINDINGS_DLA; } } else { diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/HierarchicalObjectRepository.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/HierarchicalObjectRepository.java index 0cf9708ab9..3ed69d037c 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/HierarchicalObjectRepository.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/settings/impl/HierarchicalObjectRepository.java @@ -304,7 +304,7 @@ public class HierarchicalObjectRepository implements HierarchicalRepository