Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/*
* 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.core.config;

import java.io.Serializable;
import java.util.Map;
import java.util.Objects;

public class BrokerPluginConfiguration implements Serializable {

private static final long serialVersionUID = 1L;

private String className;

private Map<String, String> properties;

public BrokerPluginConfiguration() {
}

public BrokerPluginConfiguration(String className, Map<String, String> properties) {
this.className = className;
this.properties = properties;
}

public String getClassName() {
return className;
}

public BrokerPluginConfiguration setClassName(String className) {
this.className = className;
return this;
}

public Map<String, String> getProperties() {
return properties;
}

public BrokerPluginConfiguration setProperties(Map<String, String> properties) {
this.properties = properties;
return this;
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof BrokerPluginConfiguration other)) {
return false;
}

return Objects.equals(getClassName(), other.getClassName()) && Objects.equals(getProperties(), other.getProperties());
}

@Override
public int hashCode() {
return Objects.hash(getClassName(), getProperties());
}

@Override
public String toString() {
return "BrokerPluginConfiguration[className=" + className + ", properties=" + properties + "]";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1381,6 +1381,13 @@ default boolean isJDBC() {

void unRegisterBrokerPlugin(ActiveMQServerBasePlugin plugin);

/**
* {@return the broker plugin configurations parsed from broker.xml}
*/
List<BrokerPluginConfiguration> getBrokerPluginConfigurations();

Configuration setBrokerPluginConfigurations(List<BrokerPluginConfiguration> configs);

Collection<LockCoordinatorConfiguration> getLockCoordinatorConfigurations();

void addLockCoordinatorConfiguration(LockCoordinatorConfiguration configuration);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.core.config.BridgeConfiguration;
import org.apache.activemq.artemis.core.config.BrokerPluginConfiguration;
import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration;
import org.apache.activemq.artemis.core.config.Configuration;
import org.apache.activemq.artemis.core.config.ConfigurationUtils;
Expand Down Expand Up @@ -374,6 +375,7 @@ public class ConfigurationImpl extends javax.security.auth.login.Configuration i
private MetricsConfiguration metricsConfiguration = null;

private final List<ActiveMQServerBasePlugin> brokerPlugins = new CopyOnWriteArrayList<>();
private List<BrokerPluginConfiguration> brokerPluginConfigurations = new ArrayList<>();
private final List<ActiveMQServerConnectionPlugin> brokerConnectionPlugins = new CopyOnWriteArrayList<>();
private final List<ActiveMQServerSessionPlugin> brokerSessionPlugins = new CopyOnWriteArrayList<>();
private final List<ActiveMQServerConsumerPlugin> brokerConsumerPlugins = new CopyOnWriteArrayList<>();
Expand Down Expand Up @@ -1067,6 +1069,8 @@ private void writeProperties(FileWriter writer) throws Exception {
"status",
// we cannot import a map<string,set<string>> property and this feature is only applied by the xml parser
"securityRoleNameMappings",
// only used for reload matching, cannot be imported as plugins are instantiated via XML
"brokerPluginConfigurations",
// using a deprecated config object
"queueConfigurations",
"queueConfigs",
Expand Down Expand Up @@ -2684,6 +2688,17 @@ public List<ActiveMQServerBasePlugin> getBrokerPlugins() {
return brokerPlugins;
}

@Override
public List<BrokerPluginConfiguration> getBrokerPluginConfigurations() {
return brokerPluginConfigurations;
}

@Override
public ConfigurationImpl setBrokerPluginConfigurations(final List<BrokerPluginConfiguration> configs) {
brokerPluginConfigurations = configs;
return this;
}

// for properties type inference
public void addBrokerPlugin(ActiveMQServerBasePlugin type) {
registerBrokerPlugin(type);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
import org.apache.activemq.artemis.api.core.UDPBroadcastEndpointFactory;
import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
import org.apache.activemq.artemis.core.config.BridgeConfiguration;
import org.apache.activemq.artemis.core.config.BrokerPluginConfiguration;
import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration;
import org.apache.activemq.artemis.core.config.Configuration;
import org.apache.activemq.artemis.core.config.ConfigurationUtils;
Expand Down Expand Up @@ -1044,18 +1045,20 @@ private void parseBrokerPlugins(final Element e, final Configuration config) {
if (brokerPlugins.getLength() != 0) {
Element node = (Element) brokerPlugins.item(0);
NodeList list = node.getElementsByTagName(BROKER_PLUGIN_ELEMENT_NAME);
List<BrokerPluginConfiguration> pluginConfigs = new ArrayList<>();
for (int i = 0; i < list.getLength(); i++) {
ActiveMQServerPlugin plugin = parseActiveMQServerPlugin(list.item(i));
String className = list.item(i).getAttributes().getNamedItem("class-name").getNodeValue();
Map<String, String> properties = getMapOfChildPropertyElements(list.item(i));

ActiveMQServerPlugin plugin = parseActiveMQServerPlugin(className, properties);
config.registerBrokerPlugin(plugin);
pluginConfigs.add(new BrokerPluginConfiguration(className, properties));
}
config.setBrokerPluginConfigurations(pluginConfigs);
}
}

private ActiveMQServerPlugin parseActiveMQServerPlugin(Node item) {
final String clazz = item.getAttributes().getNamedItem("class-name").getNodeValue();

Map<String, String> properties = getMapOfChildPropertyElements(item);

private ActiveMQServerPlugin parseActiveMQServerPlugin(String clazz, Map<String, String> properties) {
ActiveMQServerPlugin serverPlugin = SecurityManagerShim.doPrivileged((PrivilegedAction<ActiveMQServerPlugin>) () -> (ActiveMQServerPlugin) ClassloadingUtil.newInstanceFromClassLoader(FileConfigurationParser.class, clazz, ActiveMQServerPlugin.class));

serverPlugin.init(properties);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
import org.apache.activemq.artemis.api.core.management.ResourceNames;
import org.apache.activemq.artemis.core.client.impl.ClientSessionFactoryImpl;
import org.apache.activemq.artemis.core.config.BridgeConfiguration;
import org.apache.activemq.artemis.core.config.BrokerPluginConfiguration;
import org.apache.activemq.artemis.core.config.Configuration;
import org.apache.activemq.artemis.core.config.ConfigurationUtils;
import org.apache.activemq.artemis.core.config.CoreAddressConfiguration;
Expand Down Expand Up @@ -4766,6 +4767,7 @@ private void updateReloadableConfigurationFrom(Configuration config) {
configuration.setPurgePageFolders(config.isPurgePageFolders());
configuration.setConnectionRouters(config.getConnectionRouters());
configuration.setJaasConfigs(config.getJaasConfigs());
configuration.setBrokerPluginConfigurations(config.getBrokerPluginConfigurations());
}

private static boolean hasReloadableConfig(Configuration configuration) {
Expand All @@ -4779,7 +4781,8 @@ private static boolean hasReloadableConfig(Configuration configuration) {
!configuration.getAcceptorConfigurations().isEmpty() ||
!configuration.getAMQPConnection().isEmpty() ||
!configuration.getConnectionRouters().isEmpty() ||
!configuration.getJaasConfigs().isEmpty();
!configuration.getJaasConfigs().isEmpty() ||
!configuration.getBrokerPluginConfigurations().isEmpty();
}

private void deployReloadableConfigFromConfiguration() throws Exception {
Expand Down Expand Up @@ -4887,6 +4890,19 @@ private void deployReloadableConfigFromConfiguration() throws Exception {

ActiveMQServerLogger.LOGGER.reloadingConfiguration("protocol services");
updateProtocolServices();

ActiveMQServerLogger.LOGGER.reloadingConfiguration("broker plugins");
for (BrokerPluginConfiguration pluginConfig : configuration.getBrokerPluginConfigurations()) {
getBrokerPlugins().stream()
.filter(p -> p.getClass().getName().equals(pluginConfig.getClassName()))
.forEach(p -> {
try {
p.propertiesReloaded(pluginConfig.getProperties());
} catch (Throwable e) {
logger.warn("Error notifying plugin {} of property reload", p, e);
}
});
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,14 @@ default void registered(ActiveMQServer server) {
*/
default void unregistered(ActiveMQServer server) {
}

/**
* The broker configuration has been reloaded. Unlike {@link #init(Map)}, this is
* called only on an already registered and active plugin. Called on every reload
* regardless of whether properties actually changed.
*
* @param properties The new set of properties from the reloaded configuration
*/
default void propertiesReloaded(Map<String, String> properties) {
}
}
Loading