You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2021/03/10 13:51:22 UTC

[activemq-artemis] branch master updated: ARTEMIS-3141 - respect the browse page limit on all queue controll/jmx operations that use a queue browser

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 20007ad  ARTEMIS-3141 - respect the browse page limit on all queue controll/jmx operations that use a queue browser
     new 4f5821d  This closes #3484
20007ad is described below

commit 20007ad485bf8f7174db84e9c317b055b28d9756
Author: gtully <ga...@gmail.com>
AuthorDate: Wed Mar 10 12:35:10 2021 +0000

    ARTEMIS-3141 - respect the browse page limit on all queue controll/jmx operations that use a queue browser
---
 .../core/management/impl/QueueControlImpl.java     | 12 +++++---
 docs/user-manual/en/address-model.md               |  4 +--
 .../integration/management/QueueControlTest.java   | 34 ++++++++++++++++++++++
 3 files changed, 44 insertions(+), 6 deletions(-)

diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java
index 5fb5a7d..4e56212 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java
@@ -847,9 +847,11 @@ public class QueueControlImpl extends AbstractControl implements QueueControl {
          Filter filter = FilterImpl.createFilter(filterStr);
          List<Map<String, Object>> messages = new ArrayList<>();
          queue.flushExecutor();
+         final int limit = addressSettingsRepository.getMatch(queue.getAddress().toString()).getManagementBrowsePageSize();
+         int count = 0;
          try (LinkedListIterator<MessageReference> iterator = queue.browserIterator()) {
             try {
-               while (iterator.hasNext()) {
+               while (iterator.hasNext() && count++ < limit) {
                   MessageReference ref = iterator.next();
                   if (filter == null || filter.match(ref.getMessage())) {
                      Message message = ref.getMessage();
@@ -983,9 +985,11 @@ public class QueueControlImpl extends AbstractControl implements QueueControl {
          if (filter == null && groupByProperty == null) {
             result.put(null, getMessageCount());
          } else {
+            final int limit = addressSettingsRepository.getMatch(queue.getAddress().toString()).getManagementBrowsePageSize();
+            int count = 0;
             try (LinkedListIterator<MessageReference> iterator = queue.browserIterator()) {
                try {
-                  while (iterator.hasNext()) {
+                  while (iterator.hasNext() && count++ < limit) {
                      Message message = iterator.next().getMessage();
                      internalComputeMessage(result, filter, groupByProperty, message);
                   }
@@ -1593,14 +1597,14 @@ public class QueueControlImpl extends AbstractControl implements QueueControl {
 
       clearIO();
       try {
-         int pageSize = addressSettingsRepository.getMatch(queue.getName().toString()).getManagementBrowsePageSize();
+         int limit = addressSettingsRepository.getMatch(queue.getAddress().toString()).getManagementBrowsePageSize();
          int currentPageSize = 0;
          ArrayList<CompositeData> c = new ArrayList<>();
          Filter thefilter = FilterImpl.createFilter(filter);
          queue.flushExecutor();
          try (LinkedListIterator<MessageReference> iterator = queue.browserIterator()) {
             try {
-               while (iterator.hasNext() && currentPageSize++ < pageSize) {
+               while (iterator.hasNext() && currentPageSize++ < limit) {
                   MessageReference ref = iterator.next();
                   if (thefilter == null || thefilter.match(ref.getMessage())) {
                      c.add(OpenTypeSupport.convert(ref));
diff --git a/docs/user-manual/en/address-model.md b/docs/user-manual/en/address-model.md
index df45624..f58033c 100644
--- a/docs/user-manual/en/address-model.md
+++ b/docs/user-manual/en/address-model.md
@@ -922,8 +922,8 @@ config reload, by delete policy: `OFF` or `FORCE`. Default is `OFF`. Read more
 about [configuration reload](config-reload.md).
 
 `management-browse-page-size` is the number of messages a management resource
-can browse. This is relevant for the "browse" management method exposed on the
-queue control. Default is `200`.
+can browse. This is relevant for the `browse, list and count-with-filter` management
+methods exposed on the queue control. Default is `200`.
 
 `default-purge-on-no-consumers` defines a queue's default
 `purge-on-no-consumers` setting if none is provided on the queue itself.
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/QueueControlTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/QueueControlTest.java
index 3fbe5e9..b04b845 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/QueueControlTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/QueueControlTest.java
@@ -3332,6 +3332,40 @@ public class QueueControlTest extends ManagementTestBase {
    }
 
    @Test
+   public void testBrowseLimitOnListBrowseAndFilteredCount() throws Exception {
+      SimpleString address = RandomUtil.randomSimpleString();
+      SimpleString queue = RandomUtil.randomSimpleString();
+
+      AddressSettings addressSettings = new AddressSettings().setManagementBrowsePageSize(5);
+      server.getAddressSettingsRepository().addMatch(address.toString(), addressSettings);
+
+      session.createQueue(new QueueConfiguration(queue).setAddress(address).setDurable(durable));
+
+      ClientProducer producer = session.createProducer(address);
+      for (int i = 0; i < 10; i++) {
+         producer.send(session.createMessage(true));
+      }
+      producer.close();
+
+      QueueControl queueControl = createManagementControl(address, queue);
+
+
+      // no filter, delegates to count metric
+      Wait.assertEquals(10, queueControl::getMessageCount);
+
+      assertEquals(5, queueControl.browse().length);
+      assertEquals(5, queueControl.listMessages("").length);
+
+      JsonArray array = JsonUtil.readJsonArray(queueControl.listMessagesAsJSON(""));
+      assertEquals(5, array.size());
+
+      // filer could match all
+      assertEquals(5, queueControl.countMessages("AMQSize > 0"));
+
+      session.deleteQueue(queue);
+   }
+
+   @Test
    public void testResetGroups() throws Exception {
       SimpleString address = RandomUtil.randomSimpleString();
       SimpleString queue = RandomUtil.randomSimpleString();