This is an automated email from the ASF dual-hosted git repository.
clebertsuconic pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/artemis.git
The following commit(s) were added to refs/heads/main by this push:
new 546b1ac151 ARTEMIS-6043 updating divert w/mngmnt API can persist
invalid config
546b1ac151 is described below
commit 546b1ac1514dd4e038b03d570e5e50cf0cc4f52e
Author: Justin Bertram <[email protected]>
AuthorDate: Thu Apr 30 13:54:25 2026 -0500
ARTEMIS-6043 updating divert w/mngmnt API can persist invalid config
This commit fixes two related issues:
- Ensures the broker can still start if recovering a persisted divert
configuration fails
- Ensures the broker does not persist an invalid divert configuration
---
.../artemis/core/config/DivertConfiguration.java | 17 ++-
.../artemis/core/persistence/StorageManager.java | 3 +
.../journal/AbstractJournalStorageManager.java | 11 ++
.../impl/nullpm/NullStorageManager.java | 6 +
.../artemis/core/server/ActiveMQServerLogger.java | 3 +
.../core/server/impl/ActiveMQServerImpl.java | 66 ++++++---
.../core/transaction/impl/TransactionImplTest.java | 6 +
.../tests/integration/client/SendAckFailTest.java | 6 +
.../management/DivertManagementTest.java | 161 +++++++++++++++++++++
9 files changed, 257 insertions(+), 22 deletions(-)
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/DivertConfiguration.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/DivertConfiguration.java
index fe6c16543e..95d4615710 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/DivertConfiguration.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/DivertConfiguration.java
@@ -66,6 +66,17 @@ public class DivertConfiguration implements Serializable,
EncodingSupport {
public DivertConfiguration() {
}
+ public DivertConfiguration(DivertConfiguration config) {
+ this.name = config.getName();
+ this.routingName = config.getRoutingName();
+ this.address = config.getAddress();
+ this.forwardingAddress = config.getForwardingAddress();
+ this.exclusive = config.isExclusive();
+ this.filterString = config.getFilterString();
+ this.transformerConfiguration = config.getTransformerConfiguration();
+ this.routingType = config.getRoutingType();
+ }
+
/**
* Set the value of a parameter based on its "key" {@code String}. Valid
key names and corresponding {@code static}
* {@code final} are:
@@ -108,7 +119,7 @@ public class DivertConfiguration implements Serializable,
EncodingSupport {
setTransformerConfiguration(transformerConfiguration);
}
} else if (key.equals(ROUTING_TYPE)) {
- setRoutingType(ComponentConfigurationRoutingType.valueOf(value));
+ setRoutingType(value == null ? null :
ComponentConfigurationRoutingType.valueOf(value));
}
}
return this;
@@ -227,7 +238,9 @@ public class DivertConfiguration implements Serializable,
EncodingSupport {
builder.add(TRANSFORMER_CONFIGURATION, tc.createJsonObjectBuilder());
}
- if (getRoutingType() != null) {
+ if (getRoutingType() == null) {
+ builder.add(ROUTING_TYPE, JsonValue.NULL);
+ } else {
builder.add(ROUTING_TYPE, getRoutingType().name());
}
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/StorageManager.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/StorageManager.java
index 9ff3f8ea38..30ef3233f9 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/StorageManager.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/StorageManager.java
@@ -30,6 +30,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.config.DivertConfiguration;
import org.apache.activemq.artemis.core.io.IOCallback;
import org.apache.activemq.artemis.core.io.OperationConsistencyLevel;
import org.apache.activemq.artemis.core.io.SequentialFile;
@@ -391,6 +392,8 @@ public interface StorageManager extends MapStorageManager,
IDGenerator, ActiveMQ
List<PersistedDivertConfiguration> recoverDivertConfigurations();
+ DivertConfiguration getDivertConfiguration(String name);
+
void storeBridgeConfiguration(PersistedBridgeConfiguration
persistedBridgeConfiguration) throws Exception;
void deleteBridgeConfiguration(String bridgeName) throws Exception;
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java
index 1389395b3e..eb6f22717a 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java
@@ -46,6 +46,7 @@ import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper;
import org.apache.activemq.artemis.core.config.Configuration;
+import org.apache.activemq.artemis.core.config.DivertConfiguration;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.io.IOCallback;
import org.apache.activemq.artemis.core.io.IOCriticalErrorListener;
@@ -845,6 +846,16 @@ public abstract class AbstractJournalStorageManager
extends CriticalComponentImp
return new ArrayList<>(mapPersistedDivertConfigurations.values());
}
+ @Override
+ public DivertConfiguration getDivertConfiguration(String name) {
+ PersistedDivertConfiguration persistedDivertConfiguration =
mapPersistedDivertConfigurations.get(name);
+ if (persistedDivertConfiguration != null) {
+ return new
DivertConfiguration(persistedDivertConfiguration.getDivertConfiguration());
+ } else {
+ return null;
+ }
+ }
+
@Override
public void storeBridgeConfiguration(PersistedBridgeConfiguration
persistedBridgeConfiguration) throws Exception {
storeConfiguration(persistedBridgeConfiguration,
mapPersistedBridgeConfigurations);
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/nullpm/NullStorageManager.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/nullpm/NullStorageManager.java
index 47daeae68b..e8d44ea53d 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/nullpm/NullStorageManager.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/nullpm/NullStorageManager.java
@@ -32,6 +32,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.config.DivertConfiguration;
import org.apache.activemq.artemis.core.io.IOCallback;
import org.apache.activemq.artemis.core.io.IOCriticalErrorListener;
import org.apache.activemq.artemis.core.io.OperationConsistencyLevel;
@@ -498,6 +499,11 @@ public class NullStorageManager implements StorageManager {
return null;
}
+ @Override
+ public DivertConfiguration getDivertConfiguration(String name) {
+ return null;
+ }
+
@Override
public void storeBridgeConfiguration(PersistedBridgeConfiguration
persistedBridgeConfiguration) throws Exception {
}
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 0956b37172..93ead521c2 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
@@ -1544,4 +1544,7 @@ public interface ActiveMQServerLogger {
@LogMessage(id = 224163, value = "Failed to clone SHA256 MessageDigest,
falling back to getInstance", level = LogMessage.Level.INFO)
void sha256CloneNotSupported(CloneNotSupportedException cns);
+
+ @LogMessage(id = 224164, value = "Failed to recover stored configuration
for divert named '{}': {}. To repair this record create a new divert with the
same name via the management API.", level = LogMessage.Level.WARN)
+ void failedToRecoverStoredDivertConfiguration(String divertName, String
divert);
}
\ No newline at end of file
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 75e5e0284f..3ae92b1a1b 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
@@ -3069,38 +3069,59 @@ public class ActiveMQServerImpl implements
ActiveMQServer {
return null;
}
- final Divert divert = divertBinding.getDivert();
+ // The divert config may be in defined in the broker config (e.g. XML)
or stored in the journal. If it's in the
+ // journal we want to make sure it's updated propertly otherwise we just
update what's in memory.
+ DivertConfiguration onStorageDivert =
storageManager.getDivertConfiguration(config.getName());
+ final Divert inMemoryDivert = divertBinding.getDivert();
Filter filter = FilterImpl.createFilter(config.getFilterString());
if (filter == null) {
- divert.setFilter(null);
+ inMemoryDivert.setFilter(null);
+ if (onStorageDivert != null) {
+ onStorageDivert.setFilterString(null);
+ }
} else {
- if (!filter.equals(divert.getFilter())) {
- divert.setFilter(filter);
+ if (!filter.equals(inMemoryDivert.getFilter())) {
+ inMemoryDivert.setFilter(filter);
+ if (onStorageDivert != null) {
+ onStorageDivert.setFilterString(config.getFilterString());
+ }
}
}
if (config.getTransformerConfiguration() != null) {
-
getServiceRegistry().removeDivertTransformer(divert.getUniqueName().toString());
+
getServiceRegistry().removeDivertTransformer(inMemoryDivert.getUniqueName().toString());
Transformer transformer = getServiceRegistry().getDivertTransformer(
config.getName(), config.getTransformerConfiguration());
- divert.setTransformer(transformer);
+ inMemoryDivert.setTransformer(transformer);
+ if (onStorageDivert != null) {
+
onStorageDivert.setTransformerConfiguration(config.getTransformerConfiguration());
+ }
}
if (config.getForwardingAddress() != null) {
SimpleString forwardAddress =
SimpleString.of(config.getForwardingAddress());
- if (!forwardAddress.equals(divert.getForwardAddress())) {
- divert.setForwardAddress(forwardAddress);
+ if (!forwardAddress.equals(inMemoryDivert.getForwardAddress())) {
+ inMemoryDivert.setForwardAddress(forwardAddress);
+ if (onStorageDivert != null) {
+
onStorageDivert.setForwardingAddress(config.getForwardingAddress());
+ }
}
}
- if (config.getRoutingType() != null && divert.getRoutingType() !=
config.getRoutingType()) {
- divert.setRoutingType(config.getRoutingType());
+ if (config.getRoutingType() != null && inMemoryDivert.getRoutingType()
!= config.getRoutingType()) {
+ inMemoryDivert.setRoutingType(config.getRoutingType());
+ if (onStorageDivert != null) {
+ onStorageDivert.setRoutingType(config.getRoutingType());
+ }
}
- storageManager.storeDivertConfiguration(new
PersistedDivertConfiguration(config));
+ if (onStorageDivert != null) {
+ // this will replace the existing divert record in the journal using
delete + add
+ storageManager.storeDivertConfiguration(new
PersistedDivertConfiguration(onStorageDivert));
+ }
- return divert;
+ return inMemoryDivert;
}
@Override
@@ -4465,15 +4486,20 @@ public class ActiveMQServerImpl implements
ActiveMQServer {
if (storageManager.recoverDivertConfigurations() != null) {
for (PersistedDivertConfiguration persistedDivertConfiguration :
storageManager.recoverDivertConfigurations()) {
- //has it been removed from config
- boolean deleted =
configuration.getDivertConfigurations().stream().noneMatch(divertConfiguration
->
divertConfiguration.getName().equals(persistedDivertConfiguration.getName()));
- // if it has remove it if configured to do so
- if (deleted) {
- if
(addressSettingsRepository.getMatch(persistedDivertConfiguration.getDivertConfiguration().getAddress()).getConfigDeleteDiverts()
== DeletionPolicy.FORCE) {
-
storageManager.deleteDivertConfiguration(persistedDivertConfiguration.getName());
- } else {
-
deployDivert(persistedDivertConfiguration.getDivertConfiguration());
+ try {
+ //has it been removed from config
+ boolean deleted =
configuration.getDivertConfigurations().stream().noneMatch(divertConfiguration
->
divertConfiguration.getName().equals(persistedDivertConfiguration.getName()));
+ // if it has remove it if configured to do so
+ if (deleted) {
+ if
(addressSettingsRepository.getMatch(persistedDivertConfiguration.getDivertConfiguration().getAddress()).getConfigDeleteDiverts()
== DeletionPolicy.FORCE) {
+
storageManager.deleteDivertConfiguration(persistedDivertConfiguration.getName());
+ } else {
+
deployDivert(persistedDivertConfiguration.getDivertConfiguration());
+ }
}
+ } catch (Exception e) {
+ logger.debug(e.getMessage(), e);
+
ActiveMQServerLogger.LOGGER.failedToRecoverStoredDivertConfiguration(persistedDivertConfiguration.getName(),
String.valueOf(persistedDivertConfiguration.getDivertConfiguration()));
}
}
}
diff --git
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/transaction/impl/TransactionImplTest.java
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/transaction/impl/TransactionImplTest.java
index 524f765628..e99d97897b 100644
---
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/transaction/impl/TransactionImplTest.java
+++
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/transaction/impl/TransactionImplTest.java
@@ -33,6 +33,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.config.DivertConfiguration;
import org.apache.activemq.artemis.core.io.IOCallback;
import org.apache.activemq.artemis.core.io.OperationConsistencyLevel;
import org.apache.activemq.artemis.core.io.SequentialFile;
@@ -746,6 +747,11 @@ public class TransactionImplTest extends ServerTestBase {
return null;
}
+ @Override
+ public DivertConfiguration getDivertConfiguration(String name) {
+ return null;
+ }
+
@Override
public void storeBridgeConfiguration(PersistedBridgeConfiguration
persistedBridgeConfiguration) throws Exception {
}
diff --git
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/SendAckFailTest.java
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/SendAckFailTest.java
index 76e0c02687..3178282368 100644
---
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/SendAckFailTest.java
+++
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/SendAckFailTest.java
@@ -44,6 +44,7 @@ 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.DivertConfiguration;
import org.apache.activemq.artemis.core.config.impl.SecurityConfiguration;
import org.apache.activemq.artemis.core.io.IOCallback;
import org.apache.activemq.artemis.core.io.OperationConsistencyLevel;
@@ -748,6 +749,11 @@ public class SendAckFailTest extends SpawnedTestBase {
return null;
}
+ @Override
+ public DivertConfiguration getDivertConfiguration(String name) {
+ return null;
+ }
+
@Override
public void storeBridgeConfiguration(PersistedBridgeConfiguration
persistedBridgeConfiguration) throws Exception {
}
diff --git
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/DivertManagementTest.java
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/DivertManagementTest.java
new file mode 100644
index 0000000000..d094618ffe
--- /dev/null
+++
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/DivertManagementTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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.management;
+
+import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.api.core.management.ActiveMQServerControl;
+import org.apache.activemq.artemis.core.config.Configuration;
+import org.apache.activemq.artemis.core.config.DivertConfiguration;
+import
org.apache.activemq.artemis.core.persistence.config.PersistedDivertConfiguration;
+import org.apache.activemq.artemis.core.postoffice.Binding;
+import org.apache.activemq.artemis.core.postoffice.impl.DivertBinding;
+import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.core.server.ActiveMQServers;
+import
org.apache.activemq.artemis.core.server.ComponentConfigurationRoutingType;
+import org.apache.activemq.artemis.core.server.Divert;
+import org.apache.activemq.artemis.logs.AssertionLoggerHandler;
+import org.apache.activemq.artemis.utils.RandomUtil;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class DivertManagementTest extends ManagementTestBase {
+
+ private ActiveMQServer server;
+
+ @Override
+ @BeforeEach
+ public void setUp() throws Exception {
+ super.setUp();
+ Configuration conf =
createDefaultNettyConfig().setJMXManagementEnabled(true);
+ server = addServer(ActiveMQServers.newActiveMQServer(conf, mbeanServer));
+ server.start();
+ }
+
+ @Test
+ public void testBadJournalRecord() throws Exception {
+ final String name = RandomUtil.randomUUIDString();
+ String routingName = RandomUtil.randomUUIDString();
+ String address = RandomUtil.randomUUIDString();
+ String forwardingAddress = RandomUtil.randomUUIDString();
+ ComponentConfigurationRoutingType routingType =
ComponentConfigurationRoutingType.getType((byte) RandomUtil.randomMax(3));
+ boolean exclusive = RandomUtil.randomBoolean();
+
+ DivertConfiguration config = new DivertConfiguration()
+ .setName(name);
+
+ // store an invalid divert config (i.e. missing address)
+ server.getStorageManager().storeDivertConfiguration(new
PersistedDivertConfiguration(config));
+
+ server.stop();
+ waitForServerToStop(server);
+
+ // start the broker and verify the invalid divert config failed to load
+ try (AssertionLoggerHandler loggerHandler = new
AssertionLoggerHandler()) {
+ server.start();
+ waitForServerToStart(server);
+ assertTrue(loggerHandler.findText("AMQ224164", name));
+ }
+ assertNull(server.getPostOffice().getBinding(SimpleString.of(name)));
+
+ // create a new divert with the same name
+ ActiveMQServerControl serverControl =
ManagementControlHelper.createActiveMQServerControl(mbeanServer);
+ config.setAddress(address)
+ .setRoutingType(routingType)
+ .setRoutingName(routingName)
+ .setForwardingAddress(forwardingAddress)
+ .setExclusive(exclusive);
+
+ serverControl.createDivert(config.toJSON());
+
+ // verify divert was created
+ assertInstanceOf(DivertBinding.class,
server.getPostOffice().getBinding(SimpleString.of(name)));
+ assertEquals(1,
server.getPostOffice().getBindingsForAddress(SimpleString.of(address)).size());
+
+ server.stop();
+ waitForServerToStop(server);
+
+ // start the broker and verify that the invalid divert config is no
longer there
+ try (AssertionLoggerHandler loggerHandler = new
AssertionLoggerHandler()) {
+ server.start();
+ waitForServerToStart(server);
+ assertFalse(loggerHandler.findText("AMQ224164"));
+ }
+
+ Binding binding =
server.getPostOffice().getBinding(SimpleString.of(name));
+ assertInstanceOf(DivertBinding.class, binding);
+ assertEquals(1,
server.getPostOffice().getBindingsForAddress(SimpleString.of(address)).size());
+
+ Divert divert = ((DivertBinding) binding).getDivert();
+ assertEquals(name, divert.getUniqueName().toString());
+ assertEquals(address, divert.getAddress().toString());
+ assertEquals(routingType, divert.getRoutingType());
+ assertEquals(routingName, divert.getRoutingName().toString());
+ assertEquals(forwardingAddress, divert.getForwardAddress().toString());
+ assertEquals(exclusive, divert.isExclusive());
+ }
+
+ @Test
+ public void testPersistentUpdate() throws Exception {
+ String name = RandomUtil.randomUUIDString();
+ String routingName = RandomUtil.randomUUIDString();
+ String address = RandomUtil.randomUUIDString();
+ String forwardingAddress = RandomUtil.randomUUIDString();
+ ComponentConfigurationRoutingType routingType =
ComponentConfigurationRoutingType.getType((byte) RandomUtil.randomMax(3));
+ boolean exclusive = RandomUtil.randomBoolean();
+
+ ActiveMQServerControl serverControl =
ManagementControlHelper.createActiveMQServerControl(mbeanServer);
+ DivertConfiguration config = new DivertConfiguration()
+ .setName(name)
+ .setAddress(address)
+ .setRoutingType(routingType)
+ .setRoutingName(routingName)
+ .setForwardingAddress(forwardingAddress)
+ .setExclusive(exclusive);
+
+ serverControl.createDivert(config.toJSON());
+
+ String updatedForwardingAddress = RandomUtil.randomUUIDString();
+ serverControl.updateDivert(new DivertConfiguration()
+ .setName(name)
+
.setForwardingAddress(updatedForwardingAddress)
+ .setRoutingType(null) // must set to null
to avoid updating since the default is non-null
+ .toJSON());
+
+ server.stop();
+ waitForServerToStop(server);
+ server.start();
+ waitForServerToStart(server);
+
+ Binding binding =
server.getPostOffice().getBinding(SimpleString.of(name));
+ assertInstanceOf(DivertBinding.class, binding);
+ assertEquals(1,
server.getPostOffice().getBindingsForAddress(SimpleString.of(address)).size());
+
+ Divert divert = ((DivertBinding) binding).getDivert();
+ assertEquals(name, divert.getUniqueName().toString());
+ assertEquals(address, divert.getAddress().toString());
+ assertEquals(routingType, divert.getRoutingType());
+ assertEquals(routingName, divert.getRoutingName().toString());
+ assertEquals(updatedForwardingAddress,
divert.getForwardAddress().toString());
+ assertEquals(exclusive, divert.isExclusive());
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]