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();