From 0277c6498ee848ab5a4cb0f3bd4fbcbe4f410785 Mon Sep 17 00:00:00 2001 From: Justin Bertram Date: Tue, 9 Jul 2024 10:33:53 -0500 Subject: [PATCH] ARTEMIS-4914 clarify docs on core + client ID This commit also adds a couple of tests to verify the documented behavior works. --- .../predicate/ActiveMQFilterPredicate.java | 2 +- docs/user-manual/core.adoc | 15 ++- .../management/ActiveMQServerControlTest.java | 103 ++++++++++++++++-- 3 files changed, 99 insertions(+), 21 deletions(-) diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java index 3b1bcfae3e..80a373fb44 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/view/predicate/ActiveMQFilterPredicate.java @@ -22,7 +22,7 @@ import java.util.function.Predicate; public class ActiveMQFilterPredicate implements Predicate { - enum Operation { + public enum Operation { CONTAINS, NOT_CONTAINS, EQUALS, GREATER_THAN, LESS_THAN; } diff --git a/docs/user-manual/core.adoc b/docs/user-manual/core.adoc index b0ff048e14..598b29819c 100644 --- a/docs/user-manual/core.adoc +++ b/docs/user-manual/core.adoc @@ -74,21 +74,20 @@ Blocking on each messages sent is costly since it requires a network round trip By not blocking and receiving send acknowledgements asynchronously you can create true end to end asynchronous systems which is not possible using the standard JMS API. For more information on this advanced feature please see the section xref:send-guarantees.adoc#guarantees-of-sends-and-commits[Guarantees of sends and commits]. -==== Identifying your session for management and debugging +==== Identifying your client application for management and debugging -Assigning IDs to your core sessions can help you with monitoring and debugging the cluster using the xref:management-console.adoc#management-console[management console]. +Assigning IDs to your core session can help you with monitoring and debugging using the xref:management-console.adoc#management-console[management console], e.g.: [,java] ---- - ClientSession session; - // ... - session.addMetaData(ClientSession.JMS_SESSION_IDENTIFIER_PROPERTY, "jms-client-id"); - session.addMetaData("jms-client-id", "my-session"); +ServerLocator locator = ... +ClientSessionFactory csf = createSessionFactory(locator); +ClientSession session = csf.createSession(null, null, false, true, true, locator.isPreAcknowledge(), locator.getAckBatchSize(), "my-client-id"); ---- -Such ID will then appear in the *Client ID* column under the *Connections*, *Consumers* and *Producers* tabs. +The value `my-client-id` will then appear in the *Client ID* column under the *Connections*, *Consumers*, and *Producers* tabs. -If you are using the JMS API, the `setClientID` would give you the same effect. +If you are using the JMS API then `setClientID` would give you the same effect. === ClientConsumer 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 a37e613335..62b6e67a19 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 @@ -16,16 +16,6 @@ */ package org.apache.activemq.artemis.tests.integration.management; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; -import static org.junit.jupiter.api.Assumptions.assumeFalse; - import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.MessageConsumer; @@ -36,6 +26,7 @@ import javax.jms.Topic; import javax.jms.TopicSubscriber; import javax.transaction.xa.XAResource; import javax.transaction.xa.Xid; +import java.lang.invoke.MethodHandles; import java.lang.reflect.Field; import java.nio.ByteBuffer; import java.text.SimpleDateFormat; @@ -95,6 +86,7 @@ import org.apache.activemq.artemis.core.management.impl.view.ConnectionField; import org.apache.activemq.artemis.core.management.impl.view.ConsumerField; import org.apache.activemq.artemis.core.management.impl.view.ProducerField; import org.apache.activemq.artemis.core.management.impl.view.SessionField; +import org.apache.activemq.artemis.core.management.impl.view.predicate.ActiveMQFilterPredicate; import org.apache.activemq.artemis.core.messagecounter.impl.MessageCounterManagerImpl; import org.apache.activemq.artemis.core.persistence.OperationContext; import org.apache.activemq.artemis.core.persistence.config.PersistedDivertConfiguration; @@ -144,7 +136,16 @@ import org.junit.jupiter.api.TestTemplate; import org.junit.jupiter.api.extension.ExtendWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.lang.invoke.MethodHandles; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assumptions.assumeFalse; @ExtendWith(ParameterizedTestExtension.class) public class ActiveMQServerControlTest extends ManagementTestBase { @@ -4541,6 +4542,84 @@ public class ActiveMQServerControlTest extends ManagementTestBase { } } + @TestTemplate + public void testListConnectionsCoreClientID() throws Exception { + final String clientId = RandomUtil.randomString(); + SimpleString queueName1 = SimpleString.of("my_queue_one"); + SimpleString addressName1 = SimpleString.of("my_address_one"); + + ActiveMQServerControl serverControl = createManagementControl(); + + server.addAddressInfo(new AddressInfo(addressName1, RoutingType.ANYCAST)); + if (legacyCreateQueue) { + server.createQueue(addressName1, RoutingType.ANYCAST, queueName1, null, false, false); + } else { + server.createQueue(QueueConfiguration.of(queueName1).setAddress(addressName1).setRoutingType(RoutingType.ANYCAST).setDurable(false)); + } + + ClientSessionFactoryImpl csf = null; + + try (ServerLocator locator = createInVMNonHALocator()) { + csf = (ClientSessionFactoryImpl) createSessionFactory(locator); + csf.createSession(null, null, false, true, true, locator.isPreAcknowledge(), locator.getAckBatchSize(), clientId); + + String filterString = createJsonFilter(ConnectionField.CLIENT_ID.getName(), ActiveMQFilterPredicate.Operation.EQUALS.toString(), clientId); + + String connectionsAsJsonString = serverControl.listConnections(filterString, 1, 50); + JsonObject connectionsAsJsonObject = JsonUtil.readJsonObject(connectionsAsJsonString); + JsonArray array = (JsonArray) connectionsAsJsonObject.get("data"); + + assertEquals(1, array.size(), "number of connections returned from query"); + JsonObject jsonConnection = array.getJsonObject(0); + + assertEquals(clientId, jsonConnection.getString(ConnectionField.CLIENT_ID.getName())); + } finally { + if (csf != null) { + csf.close(); + } + } + } + + @TestTemplate + public void testListConnectionsCoreClientIDLegacy() throws Exception { + final String clientId = RandomUtil.randomString(); + SimpleString queueName1 = SimpleString.of("my_queue_one"); + SimpleString addressName1 = SimpleString.of("my_address_one"); + + ActiveMQServerControl serverControl = createManagementControl(); + + server.addAddressInfo(new AddressInfo(addressName1, RoutingType.ANYCAST)); + if (legacyCreateQueue) { + server.createQueue(addressName1, RoutingType.ANYCAST, queueName1, null, false, false); + } else { + server.createQueue(QueueConfiguration.of(queueName1).setAddress(addressName1).setRoutingType(RoutingType.ANYCAST).setDurable(false)); + } + + ClientSessionFactoryImpl csf = null; + + try (ServerLocator locator = createInVMNonHALocator()) { + csf = (ClientSessionFactoryImpl) createSessionFactory(locator); + ClientSession session = csf.createSession(); + session.addUniqueMetaData(ClientSession.JMS_SESSION_IDENTIFIER_PROPERTY, ""); + session.addUniqueMetaData(ClientSession.JMS_SESSION_CLIENT_ID_PROPERTY, clientId); + + String filterString = createJsonFilter(ConnectionField.CLIENT_ID.getName(), ActiveMQFilterPredicate.Operation.EQUALS.toString(), clientId); + + String connectionsAsJsonString = serverControl.listConnections(filterString, 1, 50); + JsonObject connectionsAsJsonObject = JsonUtil.readJsonObject(connectionsAsJsonString); + JsonArray array = (JsonArray) connectionsAsJsonObject.get("data"); + + assertEquals(1, array.size(), "number of connections returned from query"); + JsonObject jsonConnection = array.getJsonObject(0); + + assertEquals(clientId, jsonConnection.getString(ConnectionField.CLIENT_ID.getName())); + } finally { + if (csf != null) { + csf.close(); + } + } + } + @TestTemplate public void testListConnectionsJmsClientID() throws Exception { final String clientId = RandomUtil.randomString(); @@ -4550,7 +4629,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase { ConnectionFactory cf = new ActiveMQConnectionFactory("vm://0"); try (Connection c = cf.createConnection()) { c.setClientID(clientId); - String filterString = createJsonFilter(ConnectionField.CLIENT_ID.getName(), "EQUALS", clientId); + String filterString = createJsonFilter(ConnectionField.CLIENT_ID.getName(), ActiveMQFilterPredicate.Operation.EQUALS.toString(), clientId); String connectionsAsJsonString = serverControl.listConnections(filterString, 1, 50); JsonObject connectionsAsJsonObject = JsonUtil.readJsonObject(connectionsAsJsonString);