You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@artemis.apache.org by jb...@apache.org on 2026/03/02 15:42:13 UTC

(artemis) branch 2.52.x created (now 521e672e41)

This is an automated email from the ASF dual-hosted git repository.

jbertram pushed a change to branch 2.52.x
in repository https://gitbox.apache.org/repos/asf/artemis.git


      at 521e672e41 Refactor federation downstream packet handling

This branch includes the following new commits:

     new eca467f8c3 NO-JIRA: have releasing instructions to include the announce list
     new eaa04b298c ARTEMIS-5797: include the expanded AMQP federation docs in the PDF
     new 5c8de6e233 ARTEMIS-5843: use a valid Apache Artemis version in the docker instructions
     new 0d9048c223 ARTEMIS-5843 Update image names in docker documentation
     new 0d7bb7078c ARTEMIS-5891 Add links to the AMQP federation configuration glossary
     new 521e672e41 Refactor federation downstream packet handling

The 6 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@artemis.apache.org
For additional commands, e-mail: commits-help@artemis.apache.org


(artemis) 02/06: ARTEMIS-5797: include the expanded AMQP federation docs in the PDF

Posted by jb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jbertram pushed a commit to branch 2.52.x
in repository https://gitbox.apache.org/repos/asf/artemis.git

commit eaa04b298c26d410864ab80b8ca58e741c3549b5
Author: Robbie Gemmell <ro...@apache.org>
AuthorDate: Wed Feb 11 12:14:28 2026 +0000

    ARTEMIS-5797: include the expanded AMQP federation docs in the PDF
---
 docs/user-manual/_book.adoc                                  | 3 +++
 docs/user-manual/amqp-federation-configuration-glossary.adoc | 2 ++
 2 files changed, 5 insertions(+)

diff --git a/docs/user-manual/_book.adoc b/docs/user-manual/_book.adoc
index bf048d4c29..523ca09932 100644
--- a/docs/user-manual/_book.adoc
+++ b/docs/user-manual/_book.adoc
@@ -65,6 +65,9 @@ include::network-isolation.adoc[leveloffset=1]
 include::restart-sequence.adoc[leveloffset=1]
 include::activation-tools.adoc[leveloffset=1]
 include::amqp-broker-connections.adoc[leveloffset=1]
+include::amqp-address-federation.adoc[leveloffset=2]
+include::amqp-queue-federation.adoc[leveloffset=2]
+include::amqp-federation-configuration-glossary.adoc[leveloffset=2]
 include::lock-coordination.adoc[leveloffset=1]
 include::federation.adoc[leveloffset=1]
 include::federation-address.adoc[leveloffset=1]
diff --git a/docs/user-manual/amqp-federation-configuration-glossary.adoc b/docs/user-manual/amqp-federation-configuration-glossary.adoc
index d7b4835044..3a12309981 100644
--- a/docs/user-manual/amqp-federation-configuration-glossary.adoc
+++ b/docs/user-manual/amqp-federation-configuration-glossary.adoc
@@ -256,3 +256,5 @@ Certain value can also be set in the broker connection URI when noted if not set
 | Integer
 | When a federation queue receiver link has been successfully drained after demand was removed from the federated resource, this value controls how long the link can remain in an attached but idle state before it is closed. This can allow for quicker restoration of federated messages if the demand on a queue is removed and re-added quickly as the link is drained of credit but not immediately closed.
 | 60s
+
+|===


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@artemis.apache.org
For additional commands, e-mail: commits-help@artemis.apache.org


(artemis) 01/06: NO-JIRA: have releasing instructions to include the announce list

Posted by jb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jbertram pushed a commit to branch 2.52.x
in repository https://gitbox.apache.org/repos/asf/artemis.git

commit eca467f8c3e17e9acf32b9e2a75502eb024fa0db
Author: Robbie Gemmell <ro...@apache.org>
AuthorDate: Wed Feb 11 17:05:01 2026 +0000

    NO-JIRA: have releasing instructions to include the announce list
---
 RELEASING.adoc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/RELEASING.adoc b/RELEASING.adoc
index 4c1dd32907..8a259824fd 100644
--- a/RELEASING.adoc
+++ b/RELEASING.adoc
@@ -609,7 +609,7 @@ You can easily perform a test run by using your personal account, e.g.:
 
 == Send Announcement Email
 
-Once the website is updated then send an email to `users@artemis.apache.org` & `dev@artemis.apache.org` with a subject like:
+Once the website is updated then send an email to `announce@apache.org`, `users@artemis.apache.org` & `dev@artemis.apache.org` with a subject like:
 
 ----
 [ANNOUNCE] Apache Artemis <version> Released


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@artemis.apache.org
For additional commands, e-mail: commits-help@artemis.apache.org


(artemis) 03/06: ARTEMIS-5843: use a valid Apache Artemis version in the docker instructions

Posted by jb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jbertram pushed a commit to branch 2.52.x
in repository https://gitbox.apache.org/repos/asf/artemis.git

commit 5c8de6e2330d25b131f5cb8faa464b0029091fa5
Author: Robbie Gemmell <ro...@apache.org>
AuthorDate: Wed Feb 11 10:24:20 2026 +0000

    ARTEMIS-5843: use a valid Apache Artemis version in the docker instructions
---
 docs/user-manual/docker.adoc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/docs/user-manual/docker.adoc b/docs/user-manual/docker.adoc
index 14865f9a87..9d3acbea0c 100644
--- a/docs/user-manual/docker.adoc
+++ b/docs/user-manual/docker.adoc
@@ -73,7 +73,7 @@ This will copy all the files necessary to build any of the pre-configured Docker
 Follow these instructions to finish building the image you want based on one of the provided Docker files or even one of your own.
 
 === Using an Official Apache Release
-If you would rather use an official Apache release in your image rather than a local release then run the following command from the `artemis-docker` directory where `<version>` is the release version you wish to use (e.g. `2.30.0`):
+To use an official Apache Artemis release in your image, rather than a local build, then run the following command from the `artemis-docker` directory where `<version>` is the release version you wish to use (e.g. `2.51.0`):
 
 [,console]
 ----


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@artemis.apache.org
For additional commands, e-mail: commits-help@artemis.apache.org


(artemis) 05/06: ARTEMIS-5891 Add links to the AMQP federation configuration glossary

Posted by jb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jbertram pushed a commit to branch 2.52.x
in repository https://gitbox.apache.org/repos/asf/artemis.git

commit 0d7bb7078c35b8366cf40fe1ddfc63d3995cb3a4
Author: Timothy Bish <ta...@gmail.com>
AuthorDate: Thu Feb 5 12:34:06 2026 -0500

    ARTEMIS-5891 Add links to the AMQP federation configuration glossary
    
    The AMQP federation pages could use to direct links to the configuration
    glossary to make navigating them easier.
---
 docs/user-manual/amqp-address-federation.adoc | 1 +
 docs/user-manual/amqp-broker-connections.adoc | 2 ++
 docs/user-manual/amqp-queue-federation.adoc   | 1 +
 3 files changed, 4 insertions(+)

diff --git a/docs/user-manual/amqp-address-federation.adoc b/docs/user-manual/amqp-address-federation.adoc
index 0344af2fc9..0526199829 100644
--- a/docs/user-manual/amqp-address-federation.adoc
+++ b/docs/user-manual/amqp-address-federation.adoc
@@ -11,6 +11,7 @@ On the remote peer a queue binding is created on the federated address which wil
 Once a message arrives at the federation address consumer on the initiating broker it is then published into the local address which routes the message into each of the queues bound to that address.
 
 Address federation can be configured to operate in a single direction between peers or can configured to operate in both directions between peers allowing message to flow in both directions delivering messages to consumers on either broker that were sent to the matching address on the opposing broker instance.
+For a more complete reference of the AMQP Address Federation configuration elements refer to the xref:amqp-federation-configuration-glossary.adoc[AMQP Federation Configuration Glossary]
 
 image::images/amqp-federation-address-concept.png[]
 
diff --git a/docs/user-manual/amqp-broker-connections.adoc b/docs/user-manual/amqp-broker-connections.adoc
index cbdbfda4e3..98d197e168 100644
--- a/docs/user-manual/amqp-broker-connections.adoc
+++ b/docs/user-manual/amqp-broker-connections.adoc
@@ -464,6 +464,8 @@ The broker connection federation configuration consists of one or more policies
 </broker-connections>
 ----
 
+For a more complete reference of the AMQP Federation configuration elements refer to the xref:amqp-federation-configuration-glossary.adoc[AMQP Federation Configuration Glossary]
+
 === Address federation
 
 Address federation can be thought of as full multicast over a set of loosely coupled brokers.
diff --git a/docs/user-manual/amqp-queue-federation.adoc b/docs/user-manual/amqp-queue-federation.adoc
index 8a42c5dcbb..8b254575c9 100644
--- a/docs/user-manual/amqp-queue-federation.adoc
+++ b/docs/user-manual/amqp-queue-federation.adoc
@@ -14,6 +14,7 @@ image::images/amqp-federation-queue-concept.png[]
 
 Queue federation can be configured operate in a single direction between peers or can configured to operate in both directions between peers allowing message to flow in both directions delivering messages to consumers on either broker that were sent to the matching queue on the opposing broker instance.
 When configured for dual federation messages can migrate back and forth between brokers depending on capacity and available local consumers, this back and forth message flow can be reduced by ensuring that the federation policy uses a pull when space is available configuration which will only pull a batch of messages from the remote if the local queue does not already have a backlog.
+For a more complete reference of the AMQP Queue Federation configuration elements refer to the xref:amqp-federation-configuration-glossary.adoc[AMQP Federation Configuration Glossary]
 
 == Common Queue Federation Topologies
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@artemis.apache.org
For additional commands, e-mail: commits-help@artemis.apache.org


(artemis) 06/06: Refactor federation downstream packet handling

Posted by jb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jbertram pushed a commit to branch 2.52.x
in repository https://gitbox.apache.org/repos/asf/artemis.git

commit 521e672e4108675806d748158444ce23f9ef76ca
Author: Justin Bertram <jb...@apache.org>
AuthorDate: Thu Feb 19 09:44:57 2026 -0600

    Refactor federation downstream packet handling
    
    This commit includes the following changes:
     - Separate the handling of federation downstream connect packets into
       its own handler
     - Add a new config parameter
     - Disambiguate existing Core federation logging
     - Add new logging for each possible outcome when handling these packets
     - Add tests
     - Add docs
---
 .../artemis/core/config/Configuration.java         |   6 +
 .../core/config/impl/ConfigurationImpl.java        |  18 +++
 .../deployers/impl/FileConfigurationParser.java    |  18 +++
 .../protocol/core/impl/CoreProtocolManager.java    |  65 ++++++--
 .../artemis/core/server/ActiveMQServerLogger.java  |  28 +++-
 .../core/server/federation/FederationManager.java  |  20 ++-
 .../resources/schema/artemis-configuration.xsd     |   1 +
 .../core/config/impl/ConfigurationImplTest.java    |  37 +++++
 .../config/impl/FileConfigurationParserTest.java   |  14 ++
 .../_downstream-authorization-sample.adoc          |   7 +
 docs/user-manual/_downstream-authorization.adoc    |   6 +
 docs/user-manual/federation-address.adoc           |   8 +-
 docs/user-manual/federation-queue.adoc             |   8 +-
 .../federation/FederationDownstreamDirectTest.java | 168 +++++++++++++++++++++
 14 files changed, 377 insertions(+), 27 deletions(-)

diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
index 440abab376..790213343c 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
@@ -1545,4 +1545,10 @@ public interface Configuration {
    }
 
    Map<String, JaasAppConfiguration> getJaasConfigs();
+
+   List<String> getFederationDownstreamAuthorization();
+
+   void setFederationDownstreamAuthorization(List<String> roles);
+
+   Configuration addFederationDownstreamAuthorization(String role);
 }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
index 85e21296e9..2997ef85ff 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
@@ -250,6 +250,8 @@ public class ConfigurationImpl extends javax.security.auth.login.Configuration i
 
    protected List<FederationConfiguration> federationConfigurations = new ArrayList<>();
 
+   protected List<String> downstreamAuthorization = new ArrayList<>();
+
    @Deprecated
    // this can eventually be replaced with List<QueueConfiguration>, but to keep existing semantics it must stay as is for now
    private List<CoreQueueConfiguration> coreQueueConfigurations = new ArrayList<>();
@@ -3522,6 +3524,22 @@ public class ConfigurationImpl extends javax.security.auth.login.Configuration i
       lockCoordinatorConfigurations.add(configuration);
    }
 
+   @Override
+   public List<String> getFederationDownstreamAuthorization() {
+      return downstreamAuthorization;
+   }
+
+   @Override
+   public void setFederationDownstreamAuthorization(List<String> roles) {
+      this.downstreamAuthorization = roles;
+   }
+
+   @Override
+   public Configuration addFederationDownstreamAuthorization(String role) {
+      downstreamAuthorization.add(role);
+      return this;
+   }
+
    // extend property utils with ability to auto-fill and locate from collections
    // collection entries are identified by the name() property
    private static class CollectionAutoFillPropertiesUtil extends PropertyUtilsBean {
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
index 82e01806d0..30e64d6ae4 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
@@ -29,6 +29,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Stream;
 
 import org.apache.activemq.artemis.ArtemisConstants;
 import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration;
@@ -670,6 +671,13 @@ public final class FileConfigurationParser extends XMLConfigurationUtil {
          }
       }
 
+      NodeList federations = e.getElementsByTagName("federations");
+
+      for (int i = 0; i < federations.getLength(); i++) {
+         Element fedNode = (Element) federations.item(i);
+         parseFederationsConfiguration(fedNode, config);
+      }
+
       NodeList fedNodes = e.getElementsByTagName("federation");
 
       for (int i = 0; i < fedNodes.getLength(); i++) {
@@ -2760,6 +2768,16 @@ public final class FileConfigurationParser extends XMLConfigurationUtil {
       mainConfig.getBridgeConfigurations().add(config);
    }
 
+   private void parseFederationsConfiguration(final Element fedNode, final Configuration mainConfig) throws Exception {
+      String roles = fedNode.getAttribute("downstream-authorization");
+      if (!roles.isEmpty()) {
+         Stream.of(roles.split(","))
+            .map(String::trim)
+            .filter(s -> !s.isEmpty())
+            .forEach(mainConfig::addFederationDownstreamAuthorization);
+      }
+   }
+
    private void parseFederationConfiguration(final Element fedNode, final Configuration mainConfig) throws Exception {
       FederationConfiguration config = new FederationConfiguration();
 
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManager.java
index e8a285557c..c8a17b09a5 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManager.java
@@ -65,12 +65,15 @@ import org.apache.activemq.artemis.core.remoting.impl.invm.InVMConnection;
 import org.apache.activemq.artemis.core.remoting.impl.netty.ActiveMQFrameDecoder2;
 import org.apache.activemq.artemis.core.remoting.impl.netty.NettyServerConnection;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
 import org.apache.activemq.artemis.spi.core.protocol.ConnectionEntry;
 import org.apache.activemq.artemis.spi.core.protocol.ProtocolManager;
 import org.apache.activemq.artemis.spi.core.protocol.ProtocolManagerFactory;
 import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
 import org.apache.activemq.artemis.spi.core.remoting.Acceptor;
 import org.apache.activemq.artemis.spi.core.remoting.Connection;
+import org.apache.activemq.artemis.spi.core.security.jaas.UserPrincipal;
+import org.apache.activemq.artemis.utils.SecurityManagerUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import java.lang.invoke.MethodHandles;
@@ -163,8 +166,7 @@ public class CoreProtocolManager implements ProtocolManager<Interceptor, ActiveM
          .addClusterChannelHandler(rc.getChannel(CHANNEL_ID.CLUSTER.id, -1), acceptorUsed, rc,
                                    server.getActivation());
 
-      final Channel federationChannel =  rc.getChannel(CHANNEL_ID.FEDERATION.id, -1);
-      federationChannel.setHandler(new LocalChannelHandler(config, entry, channel0, acceptorUsed, rc));
+      rc.getChannel(CHANNEL_ID.FEDERATION.id, -1).setHandler(new FederationChannelHandler(acceptorUsed, rc));
 
       return entry;
    }
@@ -397,7 +399,44 @@ public class CoreProtocolManager implements ProtocolManager<Interceptor, ActiveM
                   }
                });
             }
-         } else if (packet.getType() == PacketImpl.FEDERATION_DOWNSTREAM_CONNECT) {
+         }
+      }
+
+      private Pair<TransportConfiguration, TransportConfiguration> getPair(
+         TransportConfiguration conn,
+         boolean isBackup) {
+         if (isBackup) {
+            return new Pair<>(null, conn);
+         }
+         return new Pair<>(conn, null);
+      }
+   }
+
+   private class FederationChannelHandler implements ChannelHandler {
+
+      private final Acceptor acceptorUsed;
+      private final CoreRemotingConnection rc;
+
+      private FederationChannelHandler(final Acceptor acceptorUsed, final CoreRemotingConnection rc) {
+         this.acceptorUsed = acceptorUsed;
+         this.rc = rc;
+      }
+
+      @Override
+      public void handlePacket(final Packet packet) {
+         if (packet.getType() == PacketImpl.FEDERATION_DOWNSTREAM_CONNECT) {
+            if (server.getSecurityStore().isSecurityEnabled()) {
+               if (rc.getSubject() == null) {
+                  ActiveMQServerLogger.LOGGER.federationDownstreamUnauthenticated(rc.getRemoteAddress());
+                  rc.close();
+                  return;
+               }
+               if (!server.getFederationManager().authorizeDownstreamDeployment(rc.getSubject())) {
+                  ActiveMQServerLogger.LOGGER.federationDownstreamUnauthorized(rc.getRemoteAddress(), SecurityManagerUtil.getUserFromSubject(rc.getSubject(), UserPrincipal.class));
+                  rc.close();
+                  return;
+               }
+            }
             //If we receive this packet then a remote broker is requesting us to create federated upstream connection
             //back to it which simulates a downstream connection
             final FederationDownstreamConnectMessage message = (FederationDownstreamConnectMessage) packet;
@@ -477,37 +516,35 @@ public class CoreProtocolManager implements ProtocolManager<Interceptor, ActiveM
             //Register close and failure listeners, if the initial downstream connection goes down then we
             //want to terminate the upstream connection
             rc.addCloseListener(() -> {
-               server.getFederationManager().undeploy(config.getName());
+               handleClose(config.getName(), rc.getRemoteAddress());
             });
 
             rc.addFailureListener(new FailureListener() {
                @Override
                public void connectionFailed(ActiveMQException exception, boolean failedOver) {
-                  server.getFederationManager().undeploy(config.getName());
+                  handleClose(config.getName(), rc.getRemoteAddress());
                }
 
                @Override
-               public void connectionFailed(ActiveMQException exception, boolean failedOver,
-                                            String scaleDownTargetNodeID) {
-                  server.getFederationManager().undeploy(config.getName());
+               public void connectionFailed(ActiveMQException exception, boolean failedOver, String scaleDownTargetNodeID) {
+                  handleClose(config.getName(), rc.getRemoteAddress());
                }
             });
 
             try {
                server.getFederationManager().deploy(config);
+               String user = rc.getSubject() != null ? SecurityManagerUtil.getUserFromSubject(rc.getSubject(), UserPrincipal.class) : "anonymous";
+               ActiveMQServerLogger.LOGGER.federationDownstreamDeployedFromRemoteUser(config.getName(), user, rc.getRemoteAddress());
             } catch (Exception e) {
                logger.error("Error deploying federation", e);
             }
          }
       }
 
-      private Pair<TransportConfiguration, TransportConfiguration> getPair(
-         TransportConfiguration conn,
-         boolean isBackup) {
-         if (isBackup) {
-            return new Pair<>(null, conn);
+      private void handleClose(String configName, String remoteAddress) {
+         if (server.getFederationManager().undeploy(configName)) {
+            ActiveMQServerLogger.LOGGER.federationDownstreamConnectionClosed(remoteAddress, configName);
          }
-         return new Pair<>(conn, null);
       }
    }
 }
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java
index 1443522541..32ff67035f 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java
@@ -1003,28 +1003,28 @@ public interface ActiveMQServerLogger {
    @LogMessage(id = 222278, value = "Unable to extract GroupSequence from message", level = LogMessage.Level.WARN)
    void unableToExtractGroupSequence(Throwable e);
 
-   @LogMessage(id = 222279, value = "Federation upstream {} policy ref {} could not be resolved in federation configuration", level = LogMessage.Level.WARN)
+   @LogMessage(id = 222279, value = "Core federation upstream {} policy ref {} could not be resolved in configuration", level = LogMessage.Level.WARN)
    void federationCantFindPolicyRef(String upstreamName, String policyRef);
 
-   @LogMessage(id = 222280, value = "Federation upstream {} policy ref {} is of unknown type in federation configuration", level = LogMessage.Level.WARN)
+   @LogMessage(id = 222280, value = "Core federation upstream {} policy ref {} is of unknown type in configuration", level = LogMessage.Level.WARN)
    void federationUnknownPolicyType(String upstreamName, String policyRef);
 
-   @LogMessage(id = 222281, value = "Federation upstream {} policy ref {} are too self referential, avoiding stack overflow , ", level = LogMessage.Level.WARN)
+   @LogMessage(id = 222281, value = "Core federation upstream {} policy ref {} are too self referential, avoiding stack overflow", level = LogMessage.Level.WARN)
    void federationAvoidStackOverflowPolicyRef(String upstreamName, String policyRef);
 
-   @LogMessage(id = 222282, value = "Federation downstream {} upstream transport configuration ref {} could not be resolved in federation configuration", level = LogMessage.Level.WARN)
+   @LogMessage(id = 222282, value = "Core federation downstream {} upstream transport configuration ref {} could not be resolved in configuration", level = LogMessage.Level.WARN)
    void federationCantFindUpstreamConnector(String downstreamName, String upstreamRef);
 
-   @LogMessage(id = 222283, value = "Federation downstream {} has been deployed", level = LogMessage.Level.INFO)
+   @LogMessage(id = 222283, value = "Core federation downstream {} has been deployed", level = LogMessage.Level.INFO)
    void federationDownstreamDeployed(String downstreamName);
 
-   @LogMessage(id = 222284, value = "Federation downstream {} has been undeployed", level = LogMessage.Level.INFO)
+   @LogMessage(id = 222284, value = "Core federation downstream {} has been undeployed", level = LogMessage.Level.INFO)
    void federationDownstreamUnDeployed(String downstreamName);
 
    @LogMessage(id = 222285, value = "File {} at {} is empty. Delete the empty file to stop this message.", level = LogMessage.Level.WARN)
    void emptyAddressFile(String addressFile, String directory);
 
-   @LogMessage(id = 222286, value = "Error executing {} federation plugin method.", level = LogMessage.Level.WARN)
+   @LogMessage(id = 222286, value = "Error executing {} Core federation plugin method.", level = LogMessage.Level.WARN)
    void federationPluginExecutionError(String pluginMethod, Throwable e);
 
    @LogMessage(id = 222287, value = "Error looking up bindings for address {}.", level = LogMessage.Level.WARN)
@@ -1077,7 +1077,7 @@ public interface ActiveMQServerLogger {
    @LogMessage(id = 222304, value = "Unable to load message from journal", level = LogMessage.Level.WARN)
    void unableToLoadMessageFromJournal(Throwable t);
 
-   @LogMessage(id = 222305, value = "Error federating message {}.", level = LogMessage.Level.WARN)
+   @LogMessage(id = 222305, value = "Error during Core federation of message: {}.", level = LogMessage.Level.WARN)
    void federationDispatchError(String message, Throwable e);
 
    @LogMessage(id = 222306, value = "Failed to load prepared TX and it will be rolled back: {}", level = LogMessage.Level.WARN)
@@ -1530,4 +1530,16 @@ public interface ActiveMQServerLogger {
 
    @LogMessage(id = 224157, value = "At least one of the components failed to start under the lockCoordinator {}. A retry will be executed", level = LogMessage.Level.INFO)
    void retryLockCoordinator(String name);
+
+   @LogMessage(id = 224158, value = "Unable to process Core federation downstream request from {}. User is not authenticated. Closing connection.", level = LogMessage.Level.WARN)
+   void federationDownstreamUnauthenticated(String remoteAddress);
+
+   @LogMessage(id = 224159, value = "Unable to process Core federation downstream request from {}. User {} is not authorized. Closing connection.", level = LogMessage.Level.WARN)
+   void federationDownstreamUnauthorized(String remoteAddress, String user);
+
+   @LogMessage(id = 224160, value = "Core federation downstream {} has been deployed. Request sent by user {} from {}.", level = LogMessage.Level.INFO)
+   void federationDownstreamDeployedFromRemoteUser(String name, String userFromSubject, String remoteAddress);
+
+   @LogMessage(id = 224161, value = "Connection from {} closed. Undeployed Core federation {}.", level = LogMessage.Level.INFO)
+   void federationDownstreamConnectionClosed(String remoteAddress, String name);
 }
\ No newline at end of file
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/federation/FederationManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/federation/FederationManager.java
index ee3534d400..ec731eea77 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/federation/FederationManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/federation/FederationManager.java
@@ -16,13 +16,16 @@
  */
 package org.apache.activemq.artemis.core.server.federation;
 
+import javax.security.auth.Subject;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import org.apache.activemq.artemis.api.core.ActiveMQException;
 import org.apache.activemq.artemis.core.server.ActiveMQComponent;
 import org.apache.activemq.artemis.core.server.ActiveMQServer;
 import org.apache.activemq.artemis.core.config.FederationConfiguration;
+import org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal;
 
 public class FederationManager implements ActiveMQComponent {
 
@@ -30,6 +33,7 @@ public class FederationManager implements ActiveMQComponent {
 
    private Map<String, Federation> federations = new HashMap<>();
    private State state;
+   private List<String> downstreamAuthorization;
 
    enum State {
       STOPPED,
@@ -47,6 +51,7 @@ public class FederationManager implements ActiveMQComponent {
 
    public FederationManager(final ActiveMQServer server) {
       this.server = server;
+      this.downstreamAuthorization = server.getConfiguration().getFederationDownstreamAuthorization();
    }
 
    @Override
@@ -90,8 +95,9 @@ public class FederationManager implements ActiveMQComponent {
       Federation federation = federations.remove(name);
       if (federation != null) {
          federation.stop();
+         return true;
       }
-      return true;
+      return false;
    }
 
 
@@ -129,4 +135,16 @@ public class FederationManager implements ActiveMQComponent {
       server.unRegisterBrokerPlugin(federatedAbstract);
    }
 
+   public boolean authorizeDownstreamDeployment(Subject subject) {
+      if (!server.getSecurityStore().isSecurityEnabled()) {
+         return true;
+      }
+      for (RolePrincipal role : subject.getPrincipals(RolePrincipal.class)) {
+         if (downstreamAuthorization.contains(role.getName())) {
+            return true;
+         }
+      }
+      return false;
+   }
+
 }
diff --git a/artemis-server/src/main/resources/schema/artemis-configuration.xsd b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
index 5c12855f29..7354d8dc09 100644
--- a/artemis-server/src/main/resources/schema/artemis-configuration.xsd
+++ b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
@@ -1646,6 +1646,7 @@
          <xsd:sequence>
             <xsd:element name="federation" type="federationType" maxOccurs="unbounded" minOccurs="0"/>
          </xsd:sequence>
+         <xsd:attribute name="downstream-authorization" type="xsd:string" use="optional" />
          <xsd:attributeGroup ref="xml:specialAttrs"/>
       </xsd:complexType>
    </xsd:element>
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
index 94b0d234ad..7c6332da7a 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
@@ -1299,6 +1299,43 @@ public class ConfigurationImplTest extends AbstractConfigurationTestBase {
       assertEquals("secureexample", configuration.getFederationConfigurations().get(0).getCredentials().getPassword());
    }
 
+   @Test
+   public void testParseDownstreamAuthorization() throws Exception {
+      Properties properties = new Properties();
+      properties.put("federationDownstreamAuthorization", "a,b,c,d,e");
+      ConfigurationImpl configuration = new ConfigurationImpl();
+      configuration.parsePrefixedProperties(properties, null);
+      assertEquals(5, configuration.getFederationDownstreamAuthorization().size());
+      assertEquals(List.of("a", "b", "c", "d", "e"), configuration.getFederationDownstreamAuthorization());
+   }
+
+   @Test
+   public void testDownstreamExportImport() throws Exception {
+      ConfigurationImpl configuration = new ConfigurationImpl();
+      configuration.getFederationDownstreamAuthorization().add("a");
+      configuration.getFederationDownstreamAuthorization().add("b");
+      configuration.getFederationDownstreamAuthorization().add("c");
+      configuration.getFederationDownstreamAuthorization().add("d");
+      configuration.getFederationDownstreamAuthorization().add("e");
+      assertEquals(List.of("a", "b", "c", "d", "e"), configuration.getFederationDownstreamAuthorization());
+
+      File outputProperty = new File(getTestDirfile(), "broker.properties");
+      configuration.exportAsProperties(outputProperty);
+
+      ConfigurationImpl outputConfig = new ConfigurationImpl();
+
+      Properties brokerProperties = new Properties();
+      try (FileInputStream is = new FileInputStream(outputProperty)) {
+         BufferedInputStream bis = new BufferedInputStream(is);
+         brokerProperties.load(bis);
+      }
+
+      assertEquals("a,b,c,d,e", brokerProperties.get("federationDownstreamAuthorization"));
+
+      outputConfig.parsePrefixedProperties(brokerProperties, null);
+      assertEquals(List.of("a", "b", "c", "d", "e"), outputConfig.getFederationDownstreamAuthorization());
+   }
+
    @Test
    public void testExportWithNonPasswordEnc() throws Exception {
       ConfigurationImpl configuration = new ConfigurationImpl();
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java
index fdca23ef83..b820fd83b7 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationParserTest.java
@@ -1114,6 +1114,20 @@ public class FileConfigurationParserTest extends ServerTestBase {
       assertEquals("myQueue", match.getQueueMatch());
    }
 
+   @Test
+   public void testParseFederationDownstreamAuthorization() throws Exception {
+      String middlePart = "<federations downstream-authorization=\"a, b,c\"/>";
+      String configStr = FIRST_PART + middlePart + LAST_PART;
+
+      final FileConfigurationParser parser = new FileConfigurationParser();
+      final ByteArrayInputStream input = new ByteArrayInputStream(configStr.getBytes(StandardCharsets.UTF_8));
+
+      final Configuration configuration = parser.parseMainConfig(input);
+      assertTrue(configuration.getFederationDownstreamAuthorization().contains("a"));
+      assertTrue(configuration.getFederationDownstreamAuthorization().contains("b"));
+      assertTrue(configuration.getFederationDownstreamAuthorization().contains("c"));
+   }
+
    @Test
    public void testParsingDiskFullPolicy() throws Exception {
       String configStr = """
diff --git a/docs/user-manual/_downstream-authorization-sample.adoc b/docs/user-manual/_downstream-authorization-sample.adoc
new file mode 100644
index 0000000000..4a94c2e33e
--- /dev/null
+++ b/docs/user-manual/_downstream-authorization-sample.adoc
@@ -0,0 +1,7 @@
+Sample Downstream Federation setup on the downstream broker:
+
+[,xml]
+----
+<!-- the "federation_username" configured on the upstream broker must be in this role -->
+<federations downstream-authorization="federation_role" />
+----
\ No newline at end of file
diff --git a/docs/user-manual/_downstream-authorization.adoc b/docs/user-manual/_downstream-authorization.adoc
new file mode 100644
index 0000000000..3d345efdc1
--- /dev/null
+++ b/docs/user-manual/_downstream-authorization.adoc
@@ -0,0 +1,6 @@
+downstream-authorization::
+This is an attribute on the `federations` element that is set on the _downstream_ broker so that it can properly authorize incoming federation requests.
+It is a comma-delimited list of roles which are authorized to deploy federation on this broker.
+The broker sending the federation command must use credentials for a user that is in one of the roles listed here.
++
+If this is not defined then the broker will not process incoming federation commands.
\ No newline at end of file
diff --git a/docs/user-manual/federation-address.adoc b/docs/user-manual/federation-address.adoc
index ce87b91ff2..43def75854 100644
--- a/docs/user-manual/federation-address.adoc
+++ b/docs/user-manual/federation-address.adoc
@@ -265,7 +265,7 @@ Similarly to `upstream` configuration, a downstream configuration can be configu
 This works by sending a command to the `downstream` broker to have it create an `upstream` connection back to the downstream broker.
 The benefit of this is being able to configure everything for federation on one broker in some cases to make it easier, such as a hub and spoke topology
 
-All the same configuration options apply to `downstream` as does `upstream` with the exception of one extra configuration flag that needs to be set:
+All the same configuration options apply to `downstream` as does `upstream` with two exceptions:
 
 upstream-connector-ref::
 Is an element pointing to a `connector` elements defined elsewhere.
@@ -274,7 +274,9 @@ This reference is used to tell the downstream broker what connector to use to cr
 A _connector_ encapsulates knowledge of what transport to use (TCP, SSL, HTTP etc.) as well as the server connection parameters (host, port etc).
 For more information about what connectors are and how to configure them, see xref:configuring-transports.adoc#configuring-the-transport[Configuring the Transport].
 
-Sample Downstream Address Federation setup:
+include::_downstream-authorization.adoc[]
+
+Sample Downstream Address Federation setup on the upstream broker:
 
 [,xml]
 ----
@@ -325,3 +327,5 @@ Sample Downstream Address Federation setup:
    </federation>
 </federations>
 ----
+
+include::_downstream-authorization-sample.adoc[]
\ No newline at end of file
diff --git a/docs/user-manual/federation-queue.adoc b/docs/user-manual/federation-queue.adoc
index 3d345795df..4e593b40aa 100644
--- a/docs/user-manual/federation-queue.adoc
+++ b/docs/user-manual/federation-queue.adoc
@@ -230,7 +230,7 @@ Similarly to `upstream` configuration, a downstream configuration can be configu
 This works by sending a command to the `downstream` broker to have it create an `upstream` connection back to the downstream broker.
 The benefit of this is being able to configure everything for federation on one broker in some cases to make it easier, such as a hub and spoke topology.
 
-All the same configuration options apply to `downstream` as does `upstream` with the exception of one extra configuration flag that needs to be set:
+All the same configuration options apply to `downstream` as does `upstream` with two exceptions:
 
 upstream-connector-ref::
 Is an element pointing to a `connector` elements defined elsewhere.
@@ -239,7 +239,9 @@ This reference is used to tell the downstream broker what connector to use to cr
 A _connector_ encapsulates knowledge of what transport to use (TCP, SSL, HTTP etc.) as well as the server connection parameters (host, port etc).
 For more information about what connectors are and how to configure them, see xref:configuring-transports.adoc#configuring-the-transport[Configuring the Transport].
 
-Sample Downstream Address Federation setup:
+include::_downstream-authorization.adoc[]
+
+Sample Downstream Address Federation setup on the upstream broker:
 
 [,xml]
 ----
@@ -291,3 +293,5 @@ Sample Downstream Address Federation setup:
    </federation>
 </federations>
 ----
+
+include::_downstream-authorization-sample.adoc[]
\ No newline at end of file
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/federation/FederationDownstreamDirectTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/federation/FederationDownstreamDirectTest.java
new file mode 100644
index 0000000000..32c1cb47a4
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/federation/FederationDownstreamDirectTest.java
@@ -0,0 +1,168 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.tests.integration.federation;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.activemq.artemis.api.core.TransportConfiguration;
+import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
+import org.apache.activemq.artemis.api.core.client.ClientSession;
+import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
+import org.apache.activemq.artemis.api.core.client.ServerLocator;
+import org.apache.activemq.artemis.core.config.Configuration;
+import org.apache.activemq.artemis.core.config.federation.FederationDownstreamConfiguration;
+import org.apache.activemq.artemis.core.config.federation.FederationPolicy;
+import org.apache.activemq.artemis.core.config.federation.FederationPolicySet;
+import org.apache.activemq.artemis.core.config.federation.FederationQueuePolicyConfiguration;
+import org.apache.activemq.artemis.core.protocol.core.Channel;
+import org.apache.activemq.artemis.core.protocol.core.CoreRemotingConnection;
+import org.apache.activemq.artemis.core.protocol.core.impl.ChannelImpl;
+import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.FederationDownstreamConnectMessage;
+import org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory;
+import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.logs.AssertionLoggerHandler;
+import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager;
+import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
+import org.apache.activemq.artemis.utils.Wait;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
+
+import static org.apache.activemq.artemis.core.protocol.core.impl.wireformat.FederationDownstreamConnectMessage.UPSTREAM_SUFFIX;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class FederationDownstreamDirectTest extends ActiveMQTestBase {
+
+   protected ActiveMQServer server;
+
+   private static final String noAuth = "noAuth";
+
+   private static final String authorizedUser = "authorizedUser";
+   private static final String authorizedPass = "authorizedPass";
+   private static final String authorizedRole = "authorizedRole";
+
+   private static final String unauthorizedUser = "unauthorizedUser";
+   private static final String unauthorizedPass = "unauthorizedPass";
+   private static final String unauthorizedRole = "unauthorizedRole";
+
+   @BeforeEach
+   public void setUp(TestInfo testInfo) throws Exception {
+      super.setUp();
+      Configuration config = createDefaultNettyConfig().setSecurityEnabled(true);
+      if (!testInfo.getTags().contains(noAuth)) {
+         config.addFederationDownstreamAuthorization(authorizedRole);
+      }
+      server = createServer(false, config);
+      server.start();
+
+      ActiveMQJAASSecurityManager securityManager = (ActiveMQJAASSecurityManager) server.getSecurityManager();
+
+      securityManager.getConfiguration().addUser(authorizedUser, authorizedPass);
+      securityManager.getConfiguration().addRole(authorizedUser, authorizedRole);
+
+      securityManager.getConfiguration().addUser(unauthorizedUser, unauthorizedPass);
+      securityManager.getConfiguration().addRole(unauthorizedUser, unauthorizedRole);
+   }
+
+   @Test
+   @Tag(noAuth)
+   public void testNoAuthConfigured() throws Exception {
+      try (AssertionLoggerHandler loggerHandler = new AssertionLoggerHandler()) {
+         sendFederationDownstreamConnectMessage(authorizedUser, authorizedPass, false);
+         assertFalse(loggerHandler.findText("AMQ224158"));
+         assertTrue(loggerHandler.findText("AMQ224159"));
+         assertFalse(loggerHandler.findText("AMQ224160"));
+      }
+   }
+
+   @Test
+   public void testUnauthenticatedDeployment() throws Exception {
+      // send the federation message without authenticating with a session first
+      try (AssertionLoggerHandler loggerHandler = new AssertionLoggerHandler()) {
+         sendFederationDownstreamConnectMessage(null, null, false);
+         assertTrue(loggerHandler.findText("AMQ224158"));
+         assertFalse(loggerHandler.findText("AMQ224159"));
+         assertFalse(loggerHandler.findText("AMQ224160"));
+      }
+   }
+
+   @Test
+   public void testUnauthorizedDeployment() throws Exception {
+      // send the federation message after authenticating with a user who isn't authorized for downstream deployment
+      try (AssertionLoggerHandler loggerHandler = new AssertionLoggerHandler()) {
+         sendFederationDownstreamConnectMessage(unauthorizedUser, unauthorizedPass, false);
+         assertFalse(loggerHandler.findText("AMQ224158"));
+         assertTrue(loggerHandler.findText("AMQ224159"));
+         assertFalse(loggerHandler.findText("AMQ224160"));
+      }
+   }
+
+   @Test
+   public void testSuccessfulDeployment() throws Exception {
+      // send the federation message after authenticating with a user who is authorized for downstream deployment
+      try (AssertionLoggerHandler loggerHandler = new AssertionLoggerHandler()) {
+         sendFederationDownstreamConnectMessage(authorizedUser, authorizedPass, true);
+         assertFalse(loggerHandler.findText("AMQ224158"));
+         assertFalse(loggerHandler.findText("AMQ224159"));
+         assertTrue(loggerHandler.findText("AMQ224160"));
+         Wait.assertTrue(() -> loggerHandler.findText("AMQ224161"));
+      }
+   }
+
+   private void sendFederationDownstreamConnectMessage(String user, String password, boolean succeed) throws Exception {
+      try (ServerLocator locator = ActiveMQClient.createServerLocator("tcp://localhost:61616")) {
+         ClientSessionFactory factory = locator.createSessionFactory();
+         ClientSession session;
+         if (user != null) {
+            session = factory.createSession(user, password, true, true, true, true, -1);
+         }
+         CoreRemotingConnection coreConn = (CoreRemotingConnection) factory.getConnection();
+         Wait.assertEquals(1, server.getActiveMQServerControl()::getConnectionCount);
+         Channel federationChannel = coreConn.getChannel(ChannelImpl.CHANNEL_ID.FEDERATION.id, -1);
+         federationChannel.send(getFederationDownstreamConnectMessage(getName()));
+         if (succeed) {
+            Wait.assertNotNull(() -> server.getFederationManager().get(getName() + UPSTREAM_SUFFIX), 1000, 20);
+         } else {
+            assertFalse(Wait.waitFor(() -> server.getFederationManager().get(getName() + UPSTREAM_SUFFIX) != null, 1000, 20));
+            assertEquals(0, server.getActiveMQServerControl().getConnectionCount());
+         }
+      }
+   }
+
+   private FederationDownstreamConnectMessage getFederationDownstreamConnectMessage(String name) {
+      final String policySetName = "fake-policy-set";
+      final String policyConfigName = "fake-policy-config";
+      FederationDownstreamConnectMessage msg = new FederationDownstreamConnectMessage();
+      msg.setName(name);
+
+      Map<String, FederationPolicy> policyMap = new HashMap<>();
+      policyMap.put(policyConfigName, new FederationQueuePolicyConfiguration().setName(policyConfigName).addInclude(new FederationQueuePolicyConfiguration.Matcher().setQueueMatch("#").setAddressMatch("#")));
+      policyMap.put(policySetName, new FederationPolicySet().setName(policySetName).addPolicyRef(policyConfigName));
+      msg.setFederationPolicyMap(policyMap);
+
+      FederationDownstreamConfiguration downstreamConfig = new FederationDownstreamConfiguration()
+         .setName("fake")
+         .addPolicyRef(policySetName);
+      downstreamConfig.setUpstreamConfiguration(new TransportConfiguration(NettyConnectorFactory.class.getName(), new HashMap<>(), "fake"));
+      msg.setStreamConfiguration(downstreamConfig);
+      return msg;
+   }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@artemis.apache.org
For additional commands, e-mail: commits-help@artemis.apache.org


(artemis) 04/06: ARTEMIS-5843 Update image names in docker documentation

Posted by jb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jbertram pushed a commit to branch 2.52.x
in repository https://gitbox.apache.org/repos/asf/artemis.git

commit 0d9048c22312bc2baaf9ef70cb15855f886556c3
Author: Tristan Stenner <ts...@ppi.de>
AuthorDate: Wed Feb 11 09:16:40 2026 +0100

    ARTEMIS-5843 Update image names in docker documentation
---
 docs/user-manual/docker.adoc | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/docs/user-manual/docker.adoc b/docs/user-manual/docker.adoc
index 9d3acbea0c..9a75bfb4a5 100644
--- a/docs/user-manual/docker.adoc
+++ b/docs/user-manual/docker.adoc
@@ -7,13 +7,13 @@ One of the simplest ways to get started is by using one of our Docker images.
 
 == Official Images
 
-Official https://www.docker.com/[Docker] images are https://hub.docker.com/r/apache/activemq-artemis/tags[available on dockerhub].
+Official https://www.docker.com/[Docker] images are https://hub.docker.com/r/apache/artemis/tags[available on dockerhub].
 Images are pushed along with all the other distribution artifacts for every release.
 The fastest, simplest way to get started is with this command which will create and start a detached container named `mycontainer`, expose the main messaging port (i.e. `61616`) and HTTP port (i.e. `8161`), and remove it when it terminates:
 
 [,console]
 ----
-$ docker run --detach --name mycontainer -p 61616:61616 -p 8161:8161 --rm apache/activemq-artemis:latest-alpine
+$ docker run --detach --name mycontainer -p 61616:61616 -p 8161:8161 --rm apache/artemis:latest-alpine
 ----
 
 Once the broker starts you can open the xref:management-console.adoc[web management console] at http://localhost:8161 and log in with the default username & password `artemis`.
@@ -115,7 +115,7 @@ Note: `LOGIN_OPTION` is either `--allow-anonymous` or `--require-login` dependin
 These variables can be set in the relevant Dockerfile or, for example, on the command-line, e.g.:
 [,console]
 ----
-$ docker run -e ARTEMIS_USER=myUser -e ARTEMIS_PASSWORD=myPass --name mycontainer -it -p 61616:61616 -p 8161:8161 apache/activemq-artemis:latest-alpine
+$ docker run -e ARTEMIS_USER=myUser -e ARTEMIS_PASSWORD=myPass --name mycontainer -it -p 61616:61616 -p 8161:8161 apache/artemis:latest-alpine
 ----
 
 ==== Mapping point
@@ -124,7 +124,7 @@ The image will use the directory `/var/lib/artemis-instance` to hold the configu
 You can map this to a folder on the host for when you want the configuration and data persisted *outside* of a container, e.g.:
 [,console]
 ----
-docker run -it -p 61616:61616 -p 8161:8161 -v <broker folder on host>:/var/lib/artemis-instance apache/activemq-artemis:latest-alpine
+docker run -it -p 61616:61616 -p 8161:8161 -v <broker folder on host>:/var/lib/artemis-instance apache/artemis:latest-alpine
 ----
 In this case the value `<broker folder on host>` is a directory where the broker instance is supposed to
 be saved and reused on each run.


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@artemis.apache.org
For additional commands, e-mail: commits-help@artemis.apache.org