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 2022/03/21 22:53:38 UTC

[activemq-artemis] branch main updated (5f22a51 -> 0c651dd)

This is an automated email from the ASF dual-hosted git repository.

clebertsuconic pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git.


    from 5f22a51  ARTEMIS-3720 Improvements on Paging MaxMessages usage
     new 3627ba5  ARTEMIS-3711 support AMQ_SCHEDULED_DELAY for OpenWire clients
     new 0c651dd  ARTEMIS-3720 Exposing global-max-messages on the CLI

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../activemq/artemis/cli/commands/Create.java      |   5 +
 .../cli/commands/etc/global-max-default.txt        |   4 +
 .../cli/commands/etc/global-max-specified.txt      |   9 +-
 .../openwire/OpenWireMessageConverter.java         |   8 +
 .../openwire/OpenWireScheduledDelayTest.java       |  82 +++++++++
 tests/smoke-tests/pom.xml                          |   3 +-
 .../servers/pagingGlobalMaxMessages/broker.xml     | 184 ---------------------
 7 files changed, 108 insertions(+), 187 deletions(-)
 create mode 100644 tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/openwire/OpenWireScheduledDelayTest.java
 delete mode 100644 tests/smoke-tests/src/main/resources/servers/pagingGlobalMaxMessages/broker.xml

[activemq-artemis] 02/02: ARTEMIS-3720 Exposing global-max-messages on the CLI

Posted by cl...@apache.org.
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/activemq-artemis.git

commit 0c651dd17b81f9d4f352142adbdff8ebadc1f0f1
Author: Clebert Suconic <cl...@apache.org>
AuthorDate: Mon Mar 21 18:23:46 2022 -0400

    ARTEMIS-3720 Exposing global-max-messages on the CLI
---
 .../activemq/artemis/cli/commands/Create.java      |   5 +
 .../cli/commands/etc/global-max-default.txt        |   4 +
 .../cli/commands/etc/global-max-specified.txt      |   9 +-
 tests/smoke-tests/pom.xml                          |   3 +-
 .../servers/pagingGlobalMaxMessages/broker.xml     | 184 ---------------------
 5 files changed, 18 insertions(+), 187 deletions(-)

diff --git a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/Create.java b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/Create.java
index cb0863c..ea9e741 100644
--- a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/Create.java
+++ b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/Create.java
@@ -287,6 +287,9 @@ public class Create extends InputAbstract {
    @Option(name = "--global-max-size", description = "Maximum amount of memory which message data may consume (Default: Undefined, half of the system's memory)")
    private String globalMaxSize;
 
+   @Option(name = "--global-max-messages", description = "Maximum number of messages that will be accepted in memory before using address full policy mode.(Default: Undefined)")
+   private long globalMaxMessages = -1;
+
    @Option(name = "--jdbc", description = "It will activate jdbc")
    boolean jdbc;
 
@@ -669,6 +672,8 @@ public class Create extends InputAbstract {
       filters.put("${encoded.role}", role.replaceAll(" ", "\\\\ "));
 
 
+      filters.put("${global-max-messages}", Long.toString(globalMaxMessages));
+
       if (globalMaxSize == null || globalMaxSize.trim().equals("")) {
          filters.put("${global-max-section}", readTextFile(ETC_GLOBAL_MAX_DEFAULT_TXT, filters));
       } else {
diff --git a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/global-max-default.txt b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/global-max-default.txt
index 7b29efe..49bc773 100644
--- a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/global-max-default.txt
+++ b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/global-max-default.txt
@@ -4,3 +4,7 @@
       You may specify a different value here if you need to customize it to your needs.
 
       <global-max-size>100Mb</global-max-size> -->
+
+      <!-- the maximum number of messages accepted before entering full address mode.
+           if global-max-size is specified the full address mode will be specified by whatever hits it first. -->
+      <global-max-messages>${global-max-messages}</global-max-messages>
diff --git a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/global-max-specified.txt b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/global-max-specified.txt
index 4d617b2..7012496 100644
--- a/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/global-max-specified.txt
+++ b/artemis-cli/src/main/resources/org/apache/activemq/artemis/cli/commands/etc/global-max-specified.txt
@@ -1,3 +1,8 @@
-      <!-- the system will enter into page mode once you hit this limit.
-           This is an estimate in bytes of how much the messages are using in memory -->
+<!--
+      the system will enter into page mode once you hit this limit.
+          This is an estimate in bytes of how much the messages are using in memory -->
       <global-max-size>${global-max-size}</global-max-size>
+
+      <!-- the maximum number of messages accepted before entering full address mode.
+            if global-max-size is specified the full address mode will be specified by whatever hits it first. -->
+      <global-max-messages>${global-max-messages}</global-max-messages>
diff --git a/tests/smoke-tests/pom.xml b/tests/smoke-tests/pom.xml
index 6edcf88..d9f1d01 100644
--- a/tests/smoke-tests/pom.xml
+++ b/tests/smoke-tests/pom.xml
@@ -909,7 +909,6 @@
                   </goals>
                   <configuration>
                      <!-- this makes it easier in certain envs -->
-                     <configuration>${basedir}/target/classes/servers/pagingGlobalMaxMessages</configuration>
                      <allowAnonymous>true</allowAnonymous>
                      <user>admin</user>
                      <password>admin</password>
@@ -918,6 +917,8 @@
                         <!-- this is needed to run the server remotely -->
                         <arg>--java-options</arg>
                         <arg>-Djava.rmi.server.hostname=localhost</arg>
+                        <arg>--global-max-messages</arg>
+                        <arg>1000</arg>
                      </args>
                   </configuration>
                </execution>
diff --git a/tests/smoke-tests/src/main/resources/servers/pagingGlobalMaxMessages/broker.xml b/tests/smoke-tests/src/main/resources/servers/pagingGlobalMaxMessages/broker.xml
deleted file mode 100644
index 4a369b4..0000000
--- a/tests/smoke-tests/src/main/resources/servers/pagingGlobalMaxMessages/broker.xml
+++ /dev/null
@@ -1,184 +0,0 @@
-<?xml version='1.0'?>
-<!--
-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.
--->
-
-<configuration xmlns="urn:activemq"
-               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-               xsi:schemaLocation="urn:activemq /schema/artemis-configuration.xsd">
-
-   <core xmlns="urn:activemq:core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="urn:activemq:core ">
-
-      <name>0.0.0.0</name>
-
-      <persistence-enabled>true</persistence-enabled>
-
-      <!-- this could be ASYNCIO or NIO
-       -->
-      <journal-type>NIO</journal-type>
-
-      <paging-directory>./data/paging</paging-directory>
-
-      <bindings-directory>./data/bindings</bindings-directory>
-
-      <journal-directory>./data/journal</journal-directory>
-
-      <large-messages-directory>./data/large-messages</large-messages-directory>
-
-      <journal-datasync>true</journal-datasync>
-
-      <journal-min-files>2</journal-min-files>
-
-      <journal-pool-files>-1</journal-pool-files>
-
-      <message-expiry-scan-period>1000</message-expiry-scan-period>
-
-      <!--
-        You can verify the network health of a particular NIC by specifying the <network-check-NIC> element.
- 	<network-check-NIC>theNicName</network-check-NIC>
-        -->
-
-      <!--
-        Use this to use an HTTP server to validate the network
-         <network-check-URL-list>http://www.apache.org</network-check-URL-list> -->
-
-      <!-- <network-check-period>10000</network-check-period> -->
-      <!-- <network-check-timeout>1000</network-check-timeout> -->
-
-      <!-- this is a comma separated list, no spaces, just DNS or IPs
-           it should accept IPV6
-
-           Warning: Make sure you understand your network topology as this is meant to validate if your network is valid.
-                    Using IPs that could eventually disappear or be partially visible may defeat the purpose.
-                    You can use a list of multiple IPs, and if any successful ping will make the server OK to continue running -->
-      <!-- <network-check-list>10.0.0.1</network-check-list> -->
-
-      <!-- use this to customize the ping used for ipv4 addresses -->
-      <!-- <network-check-ping-command>ping -c 1 -t %d %s</network-check-ping-command> -->
-
-      <!-- use this to customize the ping used for ipv6 addresses -->
-      <!-- <network-check-ping6-command>ping6 -c 1 %2$s</network-check-ping6-command> -->
-
-
-
-
-      <!-- how often we are looking for how many bytes are being used on the disk in ms -->
-      <disk-scan-period>5000</disk-scan-period>
-
-      <!-- once the disk hits this limit the system will block, or close the connection in certain protocols
-           that won't support flow control. -->
-      <max-disk-usage>90</max-disk-usage>
-
-      <global-max-messages>1000</global-max-messages>
-
-      <!-- the system will enter into page mode once you hit this limit.
-           This is an estimate in bytes of how much the messages are using in memory
-
-            The system will use half of the available memory (-Xmx) by default for the global-max-size.
-            You may specify a different value here if you need to customize it to your needs.
-
-            <global-max-size>100Mb</global-max-size>
-
-      -->
-
-      <acceptors>
-
-         <!-- useEpoll means: it will use Netty epoll if you are on a system (Linux) that supports it -->
-         <!-- useKQueue means: it will use Netty kqueue if you are on a system (MacOS) that supports it -->
-         <!-- amqpCredits: The number of credits sent to AMQP producers -->
-         <!-- amqpLowCredits: The server will send the # credits specified at amqpCredits at this low mark -->
-
-         <!-- Acceptor for every supported protocol -->
-         <acceptor name="artemis">tcp://0.0.0.0:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;useKQueue;amqpCredits=1000;amqpLowCredits=300;actorThresholdBytes=10000</acceptor>
-
-         <!-- AMQP Acceptor.  Listens on default AMQP port for AMQP traffic.-->
-         <acceptor name="amqp">tcp://0.0.0.0:5672?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=AMQP;useEpoll=true;useKQueue=true;amqpCredits=1000;amqpLowCredits=300</acceptor>
-
-         <!-- STOMP Acceptor. -->
-         <acceptor name="stomp">tcp://0.0.0.0:61613?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=STOMP;useEpoll=true;useKQueue=true</acceptor>
-
-         <!-- HornetQ Compatibility Acceptor.  Enables HornetQ Core and STOMP for legacy HornetQ clients. -->
-         <acceptor name="hornetq">tcp://0.0.0.0:5445?protocols=HORNETQ,STOMP;useEpoll=true;useKQueue=true</acceptor>
-
-         <!-- MQTT Acceptor -->
-         <acceptor name="mqtt">tcp://0.0.0.0:1883?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=MQTT;useEpoll=true;useKQueue=true</acceptor>
-
-      </acceptors>
-
-
-      <security-settings>
-         <security-setting match="#">
-            <permission type="createNonDurableQueue" roles="guest"/>
-            <permission type="deleteNonDurableQueue" roles="guest"/>
-            <permission type="createDurableQueue" roles="guest"/>
-            <permission type="deleteDurableQueue" roles="guest"/>
-            <permission type="createAddress" roles="guest"/>
-            <permission type="deleteAddress" roles="guest"/>
-            <permission type="consume" roles="guest"/>
-            <permission type="browse" roles="guest"/>
-            <permission type="send" roles="guest"/>
-            <!-- we need this otherwise ./artemis data imp wouldn't work -->
-            <permission type="manage" roles="guest"/>
-         </security-setting>
-      </security-settings>
-
-      <address-settings>
-         <!-- if you define auto-create on certain queues, management has to be auto-create -->
-         <address-setting match="activemq.management#">
-            <dead-letter-address>DLQ</dead-letter-address>
-            <expiry-address>ExpiryQueue</expiry-address>
-            <redelivery-delay>0</redelivery-delay>
-            <!-- with -1 only the global-max-size is in use for limiting -->
-            <max-size-bytes>-1</max-size-bytes>
-            <message-counter-history-day-limit>10</message-counter-history-day-limit>
-            <address-full-policy>PAGE</address-full-policy>
-            <auto-create-queues>true</auto-create-queues>
-            <auto-create-addresses>true</auto-create-addresses>
-         </address-setting>
-         <!--default for catch all-->
-         <address-setting match="#">
-            <dead-letter-address>DLQ</dead-letter-address>
-            <expiry-address>ExpiryQueue</expiry-address>
-            <redelivery-delay>0</redelivery-delay>
-            <!-- with -1 only the global-max-size is in use for limiting -->
-            <max-size-bytes>-1</max-size-bytes>
-            <page-size-bytes>10000</page-size-bytes>
-            <message-counter-history-day-limit>10</message-counter-history-day-limit>
-            <address-full-policy>PAGE</address-full-policy>
-            <auto-create-queues>true</auto-create-queues>
-            <auto-create-addresses>true</auto-create-addresses>
-         </address-setting>
-      </address-settings>
-
-      <addresses>
-         <address name="DLQ">
-            <anycast>
-               <queue name="DLQ" />
-            </anycast>
-         </address>
-         <address name="ExpiryQueue">
-            <anycast>
-               <queue name="ExpiryQueue" />
-            </anycast>
-         </address>
-
-      </addresses>
-
-   </core>
-</configuration>

[activemq-artemis] 01/02: ARTEMIS-3711 support AMQ_SCHEDULED_DELAY for OpenWire clients

Posted by cl...@apache.org.
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/activemq-artemis.git

commit 3627ba57c9c48cc41d2036c913eb2c3c904a7743
Author: Justin Bertram <jb...@apache.org>
AuthorDate: Tue Mar 8 11:06:00 2022 -0600

    ARTEMIS-3711 support AMQ_SCHEDULED_DELAY for OpenWire clients
---
 .../openwire/OpenWireMessageConverter.java         |  8 +++
 .../openwire/OpenWireScheduledDelayTest.java       | 82 ++++++++++++++++++++++
 2 files changed, 90 insertions(+)

diff --git a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireMessageConverter.java b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireMessageConverter.java
index da74a43..e203b3a 100644
--- a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireMessageConverter.java
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireMessageConverter.java
@@ -38,6 +38,7 @@ import java.util.zip.InflaterInputStream;
 import java.util.zip.InflaterOutputStream;
 
 import com.google.common.io.BaseEncoding;
+import org.apache.activemq.ScheduledMessage;
 import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
 import org.apache.activemq.artemis.api.core.ActiveMQPropertyConversionException;
 import org.apache.activemq.artemis.api.core.ICoreMessage;
@@ -224,6 +225,13 @@ public final class OpenWireMessageConverter {
          coreMessage.putStringProperty(AMQ_MSG_ORIG_DESTINATION, origDest.getQualifiedName());
       }
 
+      final Object scheduledDelay = messageSend.getProperties().get(ScheduledMessage.AMQ_SCHEDULED_DELAY);
+      if (scheduledDelay instanceof Long) {
+         coreMessage.putLongProperty(org.apache.activemq.artemis.api.core.Message.HDR_SCHEDULED_DELIVERY_TIME, System.currentTimeMillis() + ((Long) scheduledDelay));
+         // this property may have already been copied, but we don't need it anymore
+         coreMessage.removeProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY);
+      }
+
       return coreMessage;
    }
 
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/openwire/OpenWireScheduledDelayTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/openwire/OpenWireScheduledDelayTest.java
new file mode 100644
index 0000000..b45c9b8
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/openwire/OpenWireScheduledDelayTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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.openwire;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import java.util.Map;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.activemq.ScheduledMessage;
+import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
+import org.apache.activemq.artemis.tests.util.RandomUtil;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class OpenWireScheduledDelayTest extends OpenWireTestBase {
+
+   @Override
+   protected void configureAddressSettings(Map<String, AddressSettings> addressSettingsMap) {
+      addressSettingsMap.put("#", new AddressSettings().setDeadLetterAddress(new SimpleString("ActiveMQ.DLQ")));
+   }
+
+   @Test
+   public void testScheduledDelay() throws Exception {
+      final String QUEUE_NAME = RandomUtil.randomString();
+      final long DELAY = 2000;
+      final String PROP_NAME = RandomUtil.randomString();
+      final String FIRST = RandomUtil.randomString();
+      final String SECOND = RandomUtil.randomString();
+
+      ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
+      Connection connection = connectionFactory.createConnection();
+      connection.start();
+      Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+      Destination destination = session.createQueue(QUEUE_NAME);
+      MessageProducer producer = session.createProducer(destination);
+      Message firstMessage = session.createMessage();
+      firstMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, DELAY);
+      firstMessage.setStringProperty(PROP_NAME, FIRST);
+      final long ETA = System.currentTimeMillis() + DELAY;
+      producer.send(firstMessage);
+      Message secondMessage = session.createMessage();
+      secondMessage.setStringProperty(PROP_NAME, SECOND);
+      producer.send(secondMessage);
+      producer.close();
+
+      MessageConsumer consumer = session.createConsumer(destination);
+
+      Message received = consumer.receive(250);
+      assertNotNull(received);
+      assertEquals(SECOND, received.getStringProperty(PROP_NAME));
+
+      received = consumer.receive(DELAY + 250);
+      assertNotNull(received);
+      assertEquals(FIRST, received.getStringProperty(PROP_NAME));
+      Assert.assertTrue(System.currentTimeMillis() >= ETA);
+
+      connection.close();
+   }
+}
+
+