This is an automated email from the ASF dual-hosted git repository.
clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
The following commit(s) were added to refs/heads/master by this push:
new 9a7620f ARTEMIS-2770 Update diverts using the management API
new 0c3ced6 This closes #3148
9a7620f is described below
commit 9a7620fd71d9d2372605f638bf235ce3562484a4
Author: brusdev <[email protected]>
AuthorDate: Fri May 22 18:46:54 2020 +0200
ARTEMIS-2770 Update diverts using the management API
---
.../core/ActiveMQDivertDoesNotExistException.java | 27 +++---
.../artemis/api/core/ActiveMQExceptionType.java | 6 ++
.../apache/activemq/artemis/logs/AuditLogger.java | 8 ++
.../api/core/management/ActiveMQServerControl.java | 11 +++
.../management/impl/ActiveMQServerControlImpl.java | 33 +++++++
.../core/management/impl/DivertControlImpl.java | 26 ++---
.../core/postoffice/impl/DivertBinding.java | 8 +-
.../artemis/core/server/ActiveMQMessageBundle.java | 4 +
.../artemis/core/server/ActiveMQServer.java | 4 +-
.../activemq/artemis/core/server/Divert.java | 12 +++
.../core/server/impl/ActiveMQServerImpl.java | 52 ++++++++--
.../artemis/core/server/impl/DivertImpl.java | 47 +++++++--
.../core/server/impl/ServiceRegistryImpl.java | 3 +-
.../core/server/management/ManagementService.java | 3 +-
.../management/impl/ManagementServiceImpl.java | 9 +-
.../server/transformer/RegisteredTransformer.java | 51 ++++++++++
.../server/group/impl/ClusteredResetMockTest.java | 3 +-
.../management/ActiveMQServerControlTest.java | 105 +++++++++++++++++++++
.../ActiveMQServerControlUsingCoreTest.java | 10 ++
19 files changed, 366 insertions(+), 56 deletions(-)
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Divert.java
b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQDivertDoesNotExistException.java
similarity index 63%
copy from
artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Divert.java
copy to
artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQDivertDoesNotExistException.java
index f51f4b0..7c4b961 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Divert.java
+++
b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQDivertDoesNotExistException.java
@@ -14,23 +14,18 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.activemq.artemis.core.server;
+package org.apache.activemq.artemis.api.core;
-import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.core.filter.Filter;
-import org.apache.activemq.artemis.core.server.transformer.Transformer;
-
-public interface Divert extends Bindable {
-
- Filter getFilter();
-
- boolean isExclusive();
-
- SimpleString getUniqueName();
-
- SimpleString getRoutingName();
+/**
+ * An operation failed because an address exists on the server.
+ */
+public final class ActiveMQDivertDoesNotExistException extends
ActiveMQException {
- Transformer getTransformer();
+ public ActiveMQDivertDoesNotExistException() {
+ super(ActiveMQExceptionType.DIVERT_DOES_NOT_EXIST);
+ }
- SimpleString getForwardAddress();
+ public ActiveMQDivertDoesNotExistException(String msg) {
+ super(ActiveMQExceptionType.DIVERT_DOES_NOT_EXIST, msg);
+ }
}
diff --git
a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQExceptionType.java
b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQExceptionType.java
index 0314901..8bb51c3 100644
---
a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQExceptionType.java
+++
b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQExceptionType.java
@@ -261,6 +261,12 @@ public enum ActiveMQExceptionType {
public ActiveMQException createException(String msg) {
return new ActiveMQReplicationTimeooutException(msg);
}
+ },
+ DIVERT_DOES_NOT_EXIST(221) {
+ @Override
+ public ActiveMQException createException(String msg) {
+ return new ActiveMQDivertDoesNotExistException(msg);
+ }
};
private static final Map<Integer, ActiveMQExceptionType> TYPE_MAP;
diff --git
a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
b/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
index 94d2a5d..2e97449 100644
---
a/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
+++
b/artemis-commons/src/main/java/org/apache/activemq/artemis/logs/AuditLogger.java
@@ -2662,4 +2662,12 @@ public interface AuditLogger extends BasicLogger {
@LogMessage(level = Logger.Level.INFO)
@Message(id = 601726, value = "User {0} failed to browse messages from
queue {1}", format = Message.Format.MESSAGE_FORMAT)
void browseMessagesFailure(String user, String queueName);
+
+ static void updateDivert(Object source, Object... args) {
+ LOGGER.updateDivert(getCaller(), source, arrayToString(args));
+ }
+
+ @LogMessage(level = Logger.Level.INFO)
+ @Message(id = 601727, value = "User {0} is updating a divert on target
resource: {1} {2}", format = Message.Format.MESSAGE_FORMAT)
+ void updateDivert(String user, Object source, Object... args);
}
diff --git
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
index f01050a..b4e6c3a 100644
---
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
+++
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
@@ -1573,6 +1573,17 @@ public interface ActiveMQServerControl {
@Parameter(name = "transformerPropertiesAsJSON", desc =
"Configuration properties of the divert's transformer in JSON form") String
transformerPropertiesAsJSON,
@Parameter(name = "routingType", desc = "How should the
routing-type on the diverted messages be set?") String routingType) throws
Exception;
+ /**
+ * update a divert
+ */
+ @Operation(desc = "Update a divert", impact = MBeanOperationInfo.ACTION)
+ void updateDivert(@Parameter(name = "name", desc = "Name of the queue")
String name,
+ @Parameter(name = "forwardingAddress", desc = "Address to
divert to") String forwardingAddress,
+ @Parameter(name = "filterString", desc = "Filter of the
divert") String filterString,
+ @Parameter(name = "transformerClassName", desc = "Class
name of the divert's transformer") String transformerClassName,
+ @Parameter(name = "transformerProperties", desc =
"Configuration properties of the divert's transformer") Map<String, String>
transformerProperties,
+ @Parameter(name = "routingType", desc = "How should the
routing-type on the diverted messages be set?") String routingType) throws
Exception;
+
@Operation(desc = "Destroy a Divert", impact = MBeanOperationInfo.ACTION)
void destroyDivert(@Parameter(name = "name", desc = "Name of the divert")
String name) throws Exception;
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
index deb5fe2..d72611c 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
@@ -97,6 +97,7 @@ import
org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.ConnectorServiceFactory;
import org.apache.activemq.artemis.core.server.Consumer;
import
org.apache.activemq.artemis.core.server.ComponentConfigurationRoutingType;
+import org.apache.activemq.artemis.core.server.Divert;
import org.apache.activemq.artemis.core.server.JournalType;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.ServerConsumer;
@@ -3416,6 +3417,38 @@ public class ActiveMQServerControlImpl extends
AbstractControl implements Active
}
@Override
+ public void updateDivert(final String name,
+ final String forwardingAddress,
+ final String filterString,
+ final String transformerClassName,
+ final Map<String, String> transformerProperties,
+ final String routingType) throws Exception {
+ if (AuditLogger.isEnabled()) {
+ AuditLogger.updateDivert(this.server, name, forwardingAddress,
filterString,
+ transformerClassName, transformerProperties,
routingType);
+ }
+ checkStarted();
+
+ clearIO();
+
+ try {
+ TransformerConfiguration transformerConfiguration =
transformerClassName == null ? null :
+ new
TransformerConfiguration(transformerClassName).setProperties(transformerProperties);
+
+ DivertConfiguration config = new
DivertConfiguration().setName(name).setForwardingAddress(forwardingAddress).
+
setFilterString(filterString).setTransformerConfiguration(transformerConfiguration).
+
setRoutingType(ComponentConfigurationRoutingType.valueOf(routingType));
+
+ final Divert divert = server.updateDivert(config);
+ if (divert == null) {
+ throw
ActiveMQMessageBundle.BUNDLE.divertDoesNotExist(config.getName());
+ }
+ } finally {
+ blockOnIO();
+ }
+ }
+
+ @Override
public void destroyDivert(final String name) throws Exception {
if (AuditLogger.isEnabled()) {
AuditLogger.destroyDivert(this.server, name);
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/DivertControlImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/DivertControlImpl.java
index 6252439..5ede913 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/DivertControlImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/DivertControlImpl.java
@@ -19,14 +19,17 @@ package org.apache.activemq.artemis.core.management.impl;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanOperationInfo;
+import java.util.Collections;
import java.util.Map;
import org.apache.activemq.artemis.api.core.JsonUtil;
import org.apache.activemq.artemis.api.core.management.DivertControl;
import org.apache.activemq.artemis.api.core.management.ResourceNames;
-import org.apache.activemq.artemis.core.config.DivertConfiguration;
+import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.core.server.Divert;
+import
org.apache.activemq.artemis.core.server.transformer.RegisteredTransformer;
+import org.apache.activemq.artemis.core.server.transformer.Transformer;
import org.apache.activemq.artemis.logs.AuditLogger;
public class DivertControlImpl extends AbstractControl implements
DivertControl {
@@ -37,8 +40,6 @@ public class DivertControlImpl extends AbstractControl
implements DivertControl
private final Divert divert;
- private final DivertConfiguration configuration;
-
private final String internalNamingPrefix;
// Static --------------------------------------------------------
@@ -49,11 +50,9 @@ public class DivertControlImpl extends AbstractControl
implements DivertControl
public DivertControlImpl(final Divert divert,
final StorageManager storageManager,
- final DivertConfiguration configuration,
final String internalNamingPrefix) throws
Exception {
super(DivertControl.class, storageManager);
this.divert = divert;
- this.configuration = configuration;
this.internalNamingPrefix = internalNamingPrefix;
}
@@ -64,7 +63,7 @@ public class DivertControlImpl extends AbstractControl
implements DivertControl
}
clearIO();
try {
- return configuration.getAddress();
+ return divert.getAddress().toString();
} finally {
blockOnIO();
}
@@ -77,7 +76,8 @@ public class DivertControlImpl extends AbstractControl
implements DivertControl
}
clearIO();
try {
- return configuration.getFilterString();
+ Filter filter = divert.getFilter();
+ return filter != null ? filter.getFilterString().toString() : null;
} finally {
blockOnIO();
}
@@ -90,7 +90,7 @@ public class DivertControlImpl extends AbstractControl
implements DivertControl
}
clearIO();
try {
- return configuration.getForwardingAddress();
+ return divert.getForwardAddress().toString();
} finally {
blockOnIO();
}
@@ -116,7 +116,9 @@ public class DivertControlImpl extends AbstractControl
implements DivertControl
}
clearIO();
try {
- return configuration.getTransformerConfiguration() == null ? null :
configuration.getTransformerConfiguration().getClassName();
+ Transformer transformer = divert.getTransformer();
+ return transformer != null ? (transformer instanceof
RegisteredTransformer ?
+ ((RegisteredTransformer)transformer).getTransformer() :
transformer).getClass().getName() : null;
} finally {
blockOnIO();
}
@@ -137,7 +139,9 @@ public class DivertControlImpl extends AbstractControl
implements DivertControl
}
clearIO();
try {
- return configuration.getTransformerConfiguration() == null ? null :
configuration.getTransformerConfiguration().getProperties();
+ Transformer transformer = divert.getTransformer();
+ return transformer != null && transformer instanceof
RegisteredTransformer ?
+ ((RegisteredTransformer)transformer).getProperties() :
Collections.emptyMap();
} finally {
blockOnIO();
}
@@ -150,7 +154,7 @@ public class DivertControlImpl extends AbstractControl
implements DivertControl
}
clearIO();
try {
- return configuration.getRoutingType().toString();
+ return divert.getRoutingType().toString();
} finally {
blockOnIO();
}
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java
index 8f4ab48..f12d8af 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java
@@ -31,8 +31,6 @@ public class DivertBinding implements Binding {
private final Divert divert;
- private final Filter filter;
-
private final SimpleString uniqueName;
private final SimpleString routingName;
@@ -48,8 +46,6 @@ public class DivertBinding implements Binding {
this.divert = divert;
- filter = divert.getFilter();
-
uniqueName = divert.getUniqueName();
routingName = divert.getRoutingName();
@@ -64,7 +60,7 @@ public class DivertBinding implements Binding {
@Override
public Filter getFilter() {
- return filter;
+ return divert.getFilter();
}
@Override
@@ -129,7 +125,7 @@ public class DivertBinding implements Binding {
", divert=" +
divert +
", filter=" +
- filter +
+ divert.getFilter() +
", uniqueName=" +
uniqueName +
", routingName=" +
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java
index 53bf020..d96eb98 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQMessageBundle.java
@@ -26,6 +26,7 @@ import
org.apache.activemq.artemis.api.core.ActiveMQClusterSecurityException;
import
org.apache.activemq.artemis.api.core.ActiveMQConnectionTimedOutException;
import org.apache.activemq.artemis.api.core.ActiveMQDeleteAddressException;
import org.apache.activemq.artemis.api.core.ActiveMQDisconnectedException;
+import
org.apache.activemq.artemis.api.core.ActiveMQDivertDoesNotExistException;
import org.apache.activemq.artemis.api.core.ActiveMQDuplicateMetaDataException;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQIOErrorException;
@@ -488,4 +489,7 @@ public interface ActiveMQMessageBundle {
@Message(id = 229230, value = "Failed to bind acceptor {0} to {1}", format
= Message.Format.MESSAGE_FORMAT)
IllegalStateException failedToBind(String acceptor, String hostPort, @Cause
Exception e);
+
+ @Message(id = 229231, value = "Divert Does Not Exist: {0}", format =
Message.Format.MESSAGE_FORMAT)
+ ActiveMQDivertDoesNotExistException divertDoesNotExist(String divert);
}
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java
index 52d9a62..5934bc5 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServer.java
@@ -664,7 +664,9 @@ public interface ActiveMQServer extends ServiceComponent {
FederationManager getFederationManager();
- void deployDivert(DivertConfiguration config) throws Exception;
+ Divert deployDivert(DivertConfiguration config) throws Exception;
+
+ Divert updateDivert(DivertConfiguration config) throws Exception;
void destroyDivert(SimpleString name) throws Exception;
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Divert.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Divert.java
index f51f4b0..99767bf 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Divert.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Divert.java
@@ -22,6 +22,8 @@ import
org.apache.activemq.artemis.core.server.transformer.Transformer;
public interface Divert extends Bindable {
+ SimpleString getAddress();
+
Filter getFilter();
boolean isExclusive();
@@ -33,4 +35,14 @@ public interface Divert extends Bindable {
Transformer getTransformer();
SimpleString getForwardAddress();
+
+ ComponentConfigurationRoutingType getRoutingType();
+
+ void setFilter(Filter filter);
+
+ void setTransformer(Transformer transformer);
+
+ void setForwardAddress(SimpleString forwardAddress);
+
+ void setRoutingType(ComponentConfigurationRoutingType routingType);
}
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
index 1f3413b..bf6c48e 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
@@ -2544,7 +2544,7 @@ public class ActiveMQServerImpl implements ActiveMQServer
{
@Override
- public void deployDivert(DivertConfiguration config) throws Exception {
+ public Divert deployDivert(DivertConfiguration config) throws Exception {
if (config.getName() == null) {
throw ActiveMQMessageBundle.BUNDLE.divertWithNoName();
}
@@ -2552,13 +2552,13 @@ public class ActiveMQServerImpl implements
ActiveMQServer {
if (config.getAddress() == null) {
ActiveMQServerLogger.LOGGER.divertWithNoAddress();
- return;
+ return null;
}
if (config.getForwardingAddress() == null) {
ActiveMQServerLogger.LOGGER.divertWithNoForwardingAddress();
- return;
+ return null;
}
SimpleString sName = new SimpleString(config.getName());
@@ -2566,7 +2566,7 @@ public class ActiveMQServerImpl implements ActiveMQServer
{
if (postOffice.getBinding(sName) != null) {
ActiveMQServerLogger.LOGGER.divertBindingAlreadyExists(sName);
- return;
+ return null;
}
SimpleString sAddress = new SimpleString(config.getAddress());
@@ -2575,13 +2575,53 @@ public class ActiveMQServerImpl implements
ActiveMQServer {
Filter filter = FilterImpl.createFilter(config.getFilterString());
- Divert divert = new DivertImpl(new
SimpleString(config.getForwardingAddress()), sName, new
SimpleString(config.getRoutingName()), config.isExclusive(), filter,
transformer, postOffice, storageManager, config.getRoutingType());
+ Divert divert = new DivertImpl(sName, sAddress, new
SimpleString(config.getForwardingAddress()),
+ new
SimpleString(config.getRoutingName()), config.isExclusive(),
+ filter, transformer, postOffice,
storageManager, config.getRoutingType());
Binding binding = new DivertBinding(storageManager.generateID(),
sAddress, divert);
postOffice.addBinding(binding);
- managementService.registerDivert(divert, config);
+ managementService.registerDivert(divert);
+
+ return divert;
+ }
+
+ @Override
+ public Divert updateDivert(DivertConfiguration config) throws Exception {
+ final DivertBinding divertBinding = (DivertBinding)
postOffice.getBinding(SimpleString.toSimpleString(config.getName()));
+ if (divertBinding == null) {
+ return null;
+ }
+
+ final Divert divert = divertBinding.getDivert();
+
+ Filter filter = FilterImpl.createFilter(config.getFilterString());
+ if (filter != null && !filter.equals(divert.getFilter())) {
+ divert.setFilter(filter);
+ }
+
+ if (config.getTransformerConfiguration() != null) {
+
getServiceRegistry().removeDivertTransformer(divert.getUniqueName().toString());
+ Transformer transformer = getServiceRegistry().getDivertTransformer(
+ config.getName(), config.getTransformerConfiguration());
+ divert.setTransformer(transformer);
+ }
+
+ if (config.getForwardingAddress() != null) {
+ SimpleString forwardAddress =
SimpleString.toSimpleString(config.getForwardingAddress());
+
+ if (!forwardAddress.equals(config)) {
+ divert.setForwardAddress(forwardAddress);
+ }
+ }
+
+ if (config.getRoutingType() != null && divert.getRoutingType() !=
config.getRoutingType()) {
+ divert.setRoutingType(config.getRoutingType());
+ }
+
+ return divert;
}
@Override
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/DivertImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/DivertImpl.java
index 1bf6123..6831f17 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/DivertImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/DivertImpl.java
@@ -37,7 +37,9 @@ public class DivertImpl implements Divert {
private final PostOffice postOffice;
- private final SimpleString forwardAddress;
+ private final SimpleString address;
+
+ private volatile SimpleString forwardAddress;
private final SimpleString uniqueName;
@@ -45,16 +47,17 @@ public class DivertImpl implements Divert {
private final boolean exclusive;
- private final Filter filter;
+ private volatile Filter filter;
- private final Transformer transformer;
+ private volatile Transformer transformer;
private final StorageManager storageManager;
- private final ComponentConfigurationRoutingType routingType;
+ private volatile ComponentConfigurationRoutingType routingType;
- public DivertImpl(final SimpleString forwardAddress,
- final SimpleString uniqueName,
+ public DivertImpl(final SimpleString uniqueName,
+ final SimpleString address,
+ final SimpleString forwardAddress,
final SimpleString routingName,
final boolean exclusive,
final Filter filter,
@@ -62,6 +65,8 @@ public class DivertImpl implements Divert {
final PostOffice postOffice,
final StorageManager storageManager,
final ComponentConfigurationRoutingType routingType) {
+ this.address = address;
+
this.forwardAddress = forwardAddress;
this.uniqueName = uniqueName;
@@ -154,6 +159,11 @@ public class DivertImpl implements Divert {
}
@Override
+ public SimpleString getAddress() {
+ return address;
+ }
+
+ @Override
public Filter getFilter() {
return filter;
}
@@ -168,6 +178,31 @@ public class DivertImpl implements Divert {
return forwardAddress;
}
+ @Override
+ public ComponentConfigurationRoutingType getRoutingType() {
+ return routingType;
+ }
+
+ @Override
+ public void setFilter(Filter filter) {
+ this.filter = filter;
+ }
+
+ @Override
+ public void setTransformer(Transformer transformer) {
+ this.transformer = transformer;
+ }
+
+ @Override
+ public void setForwardAddress(SimpleString forwardAddress) {
+ this.forwardAddress = forwardAddress;
+ }
+
+ @Override
+ public void setRoutingType(ComponentConfigurationRoutingType routingType) {
+ this.routingType = routingType;
+ }
+
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServiceRegistryImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServiceRegistryImpl.java
index 601c90c..1597e08 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServiceRegistryImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServiceRegistryImpl.java
@@ -34,6 +34,7 @@ import
org.apache.activemq.artemis.core.config.TransformerConfiguration;
import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle;
import org.apache.activemq.artemis.core.server.ConnectorServiceFactory;
import org.apache.activemq.artemis.core.server.ServiceRegistry;
+import
org.apache.activemq.artemis.core.server.transformer.RegisteredTransformer;
import org.apache.activemq.artemis.core.server.transformer.Transformer;
import org.apache.activemq.artemis.spi.core.remoting.AcceptorFactory;
import org.apache.activemq.artemis.utils.ClassloadingUtil;
@@ -249,7 +250,7 @@ public class ServiceRegistryImpl implements ServiceRegistry
{
if (transformerConfiguration != null &&
transformerConfiguration.getClassName() != null) {
try {
- transformer = loadClass(transformerConfiguration.getClassName());
+ transformer = new
RegisteredTransformer(loadClass(transformerConfiguration.getClassName()));
transformer.init(Collections.unmodifiableMap(transformerConfiguration.getProperties()));
} catch (Exception e) {
throw
ActiveMQMessageBundle.BUNDLE.errorCreatingTransformerClass(e,
transformerConfiguration.getClassName());
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
index 528920f..41eb5c8 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
@@ -30,7 +30,6 @@ import
org.apache.activemq.artemis.api.core.management.ObjectNameBuilder;
import org.apache.activemq.artemis.core.config.BridgeConfiguration;
import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration;
import org.apache.activemq.artemis.core.config.Configuration;
-import org.apache.activemq.artemis.core.config.DivertConfiguration;
import
org.apache.activemq.artemis.core.management.impl.ActiveMQServerControlImpl;
import org.apache.activemq.artemis.core.messagecounter.MessageCounterManager;
import org.apache.activemq.artemis.core.paging.PagingManager;
@@ -104,7 +103,7 @@ public interface ManagementService extends
NotificationService, ActiveMQComponen
void unregisterAcceptors();
- void registerDivert(Divert divert, DivertConfiguration config) throws
Exception;
+ void registerDivert(Divert divert) throws Exception;
void unregisterDivert(SimpleString name, SimpleString address) throws
Exception;
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
index 63467e4..c6b1f67 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
@@ -57,7 +57,6 @@ import
org.apache.activemq.artemis.api.core.management.ResourceNames;
import org.apache.activemq.artemis.core.config.BridgeConfiguration;
import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration;
import org.apache.activemq.artemis.core.config.Configuration;
-import org.apache.activemq.artemis.core.config.DivertConfiguration;
import org.apache.activemq.artemis.core.management.impl.AcceptorControlImpl;
import
org.apache.activemq.artemis.core.management.impl.ActiveMQServerControlImpl;
import org.apache.activemq.artemis.core.management.impl.AddressControlImpl;
@@ -289,11 +288,11 @@ public class ManagementServiceImpl implements
ManagementService {
}
@Override
- public synchronized void registerDivert(final Divert divert, final
DivertConfiguration config) throws Exception {
- ObjectName objectName =
objectNameBuilder.getDivertObjectName(divert.getUniqueName().toString(),
config.getAddress());
- DivertControl divertControl = new DivertControlImpl(divert,
storageManager, config, messagingServer.getInternalNamingPrefix());
+ public synchronized void registerDivert(final Divert divert) throws
Exception {
+ ObjectName objectName =
objectNameBuilder.getDivertObjectName(divert.getUniqueName().toString(),
divert.getAddress().toString());
+ DivertControl divertControl = new DivertControlImpl(divert,
storageManager, messagingServer.getInternalNamingPrefix());
registerInJMX(objectName, divertControl);
- registerInRegistry(ResourceNames.DIVERT + config.getName(),
divertControl);
+ registerInRegistry(ResourceNames.DIVERT + divert.getUniqueName(),
divertControl);
if (logger.isDebugEnabled()) {
logger.debug("registered divert " + objectName);
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/transformer/RegisteredTransformer.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/transformer/RegisteredTransformer.java
new file mode 100644
index 0000000..d2b7d59
--- /dev/null
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/transformer/RegisteredTransformer.java
@@ -0,0 +1,51 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.server.transformer;
+
+import java.util.Map;
+
+import org.apache.activemq.artemis.api.core.Message;
+
+public class RegisteredTransformer implements Transformer {
+
+ private final Transformer transformer;
+
+ private Map<String, String> properties;
+
+ public Transformer getTransformer() {
+ return transformer;
+ }
+ public Map<String, String> getProperties() {
+ return properties;
+ }
+
+ public RegisteredTransformer(Transformer transformer) {
+ this.transformer = transformer;
+ }
+
+ @Override
+ public void init(Map<String, String> properties) {
+ this.properties = properties;
+ this.transformer.init(properties);
+ }
+
+ @Override
+ public Message transform(Message message) {
+ return transformer.transform(message);
+ }
+}
diff --git
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
index 6a2dd15..d464c5e 100644
---
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
+++
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
@@ -33,7 +33,6 @@ import
org.apache.activemq.artemis.api.core.management.ObjectNameBuilder;
import org.apache.activemq.artemis.core.config.BridgeConfiguration;
import org.apache.activemq.artemis.core.config.ClusterConnectionConfiguration;
import org.apache.activemq.artemis.core.config.Configuration;
-import org.apache.activemq.artemis.core.config.DivertConfiguration;
import
org.apache.activemq.artemis.core.management.impl.ActiveMQServerControlImpl;
import org.apache.activemq.artemis.core.messagecounter.MessageCounterManager;
import org.apache.activemq.artemis.core.paging.PagingManager;
@@ -278,7 +277,7 @@ public class ClusteredResetMockTest extends
ActiveMQTestBase {
}
@Override
- public void registerDivert(Divert divert, DivertConfiguration config)
throws Exception {
+ public void registerDivert(Divert divert) throws Exception {
}
diff --git
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
index a94f631..de33d71 100644
---
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
+++
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
@@ -34,6 +34,7 @@ import java.util.List;
import java.util.Set;
import java.util.UUID;
+import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.JsonUtil;
import org.apache.activemq.artemis.api.core.QueueConfiguration;
@@ -1321,6 +1322,110 @@ public class ActiveMQServerControlTest extends
ManagementTestBase {
}
@Test
+ public void testCreateAndUpdateDivert() throws Exception {
+ String address = RandomUtil.randomString();
+ String name = RandomUtil.randomString();
+ String routingName = RandomUtil.randomString();
+ String forwardingAddress = RandomUtil.randomString();
+ String updatedForwardingAddress = RandomUtil.randomString();
+
+ ActiveMQServerControl serverControl = createManagementControl();
+
+ checkNoResource(ObjectNameBuilder.DEFAULT.getDivertObjectName(name,
address));
+ assertEquals(0, serverControl.getDivertNames().length);
+
+ serverControl.createDivert(name.toString(), routingName, address,
forwardingAddress, true, null, null);
+
+ checkResource(ObjectNameBuilder.DEFAULT.getDivertObjectName(name,
address));
+ DivertControl divertControl =
ManagementControlHelper.createDivertControl(name.toString(), address,
mbeanServer);
+ assertEquals(name.toString(), divertControl.getUniqueName());
+ assertEquals(address, divertControl.getAddress());
+ assertEquals(forwardingAddress, divertControl.getForwardingAddress());
+ assertEquals(routingName, divertControl.getRoutingName());
+ assertTrue(divertControl.isExclusive());
+ assertNull(divertControl.getFilter());
+ assertNull(divertControl.getTransformerClassName());
+ String[] divertNames = serverControl.getDivertNames();
+ assertEquals(1, divertNames.length);
+ assertEquals(name, divertNames[0]);
+
+ // check that a message sent to the address is diverted exclusively
+ ServerLocator locator = createInVMNonHALocator();
+
+ ClientSessionFactory csf = createSessionFactory(locator);
+ ClientSession session = csf.createSession();
+
+ String updatedDivertQueue = RandomUtil.randomString();
+ String divertQueue = RandomUtil.randomString();
+ String queue = RandomUtil.randomString();
+ if (legacyCreateQueue) {
+ session.createQueue(updatedForwardingAddress, RoutingType.ANYCAST,
updatedDivertQueue);
+ session.createQueue(forwardingAddress, RoutingType.ANYCAST,
divertQueue);
+ session.createQueue(address, RoutingType.ANYCAST, queue);
+ } else {
+ session.createQueue(new
QueueConfiguration(updatedDivertQueue).setAddress(updatedForwardingAddress).setRoutingType(RoutingType.ANYCAST).setDurable(false));
+ session.createQueue(new
QueueConfiguration(divertQueue).setAddress(forwardingAddress).setRoutingType(RoutingType.ANYCAST).setDurable(false));
+ session.createQueue(new
QueueConfiguration(queue).setAddress(address).setRoutingType(RoutingType.ANYCAST).setDurable(false));
+ }
+
+ ClientProducer producer = session.createProducer(address);
+ ClientMessage message = session.createMessage(false);
+ String text = RandomUtil.randomString();
+ message.putStringProperty("prop", text);
+ producer.send(message);
+
+ ClientConsumer consumer = session.createConsumer(queue);
+ ClientConsumer divertedConsumer = session.createConsumer(divertQueue);
+ ClientConsumer updatedDivertedConsumer =
session.createConsumer(updatedDivertQueue);
+
+ session.start();
+
+ assertNull(consumer.receiveImmediate());
+ message = divertedConsumer.receive(5000);
+ assertNotNull(message);
+ assertEquals(text, message.getStringProperty("prop"));
+ assertNull(updatedDivertedConsumer.receiveImmediate());
+
+ serverControl.updateDivert(name.toString(), updatedForwardingAddress,
null, null, null, ActiveMQDefaultConfiguration.getDefaultDivertRoutingType());
+
+ checkResource(ObjectNameBuilder.DEFAULT.getDivertObjectName(name,
address));
+ divertControl =
ManagementControlHelper.createDivertControl(name.toString(), address,
mbeanServer);
+ assertEquals(name.toString(), divertControl.getUniqueName());
+ assertEquals(address, divertControl.getAddress());
+ assertEquals(updatedForwardingAddress,
divertControl.getForwardingAddress());
+ assertEquals(routingName, divertControl.getRoutingName());
+ assertTrue(divertControl.isExclusive());
+ assertNull(divertControl.getFilter());
+ assertNull(divertControl.getTransformerClassName());
+ divertNames = serverControl.getDivertNames();
+ assertEquals(1, divertNames.length);
+ assertEquals(name, divertNames[0]);
+
+ // check that a message is no longer exclusively diverted
+ message = session.createMessage(false);
+ String text2 = RandomUtil.randomString();
+ message.putStringProperty("prop", text2);
+ producer.send(message);
+
+ assertNull(consumer.receiveImmediate());
+ assertNull(divertedConsumer.receiveImmediate());
+ message = updatedDivertedConsumer.receive(5000);
+ assertNotNull(message);
+ assertEquals(text2, message.getStringProperty("prop"));
+
+ consumer.close();
+ divertedConsumer.close();
+ updatedDivertedConsumer.close();
+ session.deleteQueue(queue);
+ session.deleteQueue(divertQueue);
+ session.deleteQueue(updatedDivertQueue);
+ session.close();
+
+ locator.close();
+
+ }
+
+ @Test
public void testCreateAndDestroyBridge() throws Exception {
String name = RandomUtil.randomString();
String sourceAddress = RandomUtil.randomString();
diff --git
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
index 1903978..0b4c674 100644
---
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
+++
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
@@ -1239,6 +1239,16 @@ public class ActiveMQServerControlUsingCoreTest extends
ActiveMQServerControlTes
}
@Override
+ public void updateDivert(String name,
+ String forwardingAddress,
+ String filterString,
+ String transformerClassName,
+ Map<String, String> transformerProperties,
+ String routingType) throws Exception {
+ proxy.invokeOperation("updateDivert", name, forwardingAddress,
filterString, transformerClassName, transformerProperties, routingType);
+ }
+
+ @Override
public void destroyDivert(String name) throws Exception {
proxy.invokeOperation("destroyDivert", name);
}