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

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/master by this push:
     new e8aec7e00c [ENHANCEMENT] Apply RabbitMQ classic queue version 2 (#2243)
e8aec7e00c is described below

commit e8aec7e00c20605d46bb3bbe93087869d53b8b5d
Author: Trần Hồng Quân <[email protected]>
AuthorDate: Thu May 16 18:41:54 2024 +0700

    [ENHANCEMENT] Apply RabbitMQ classic queue version 2 (#2243)
    
    * [ENHANCEMENT] Apply classic queue version 2
    
    Claimed to be better than version 1 cf:
    - 
https://www.rabbitmq.com/blog/2023/05/17/rabbitmq-3.12-performance-improvements#classic-queues-massively-improved-classic-queues-v2-cqv2
    - 
https://www.rabbitmq.com/blog/2023/05/17/rabbitmq-3.12-performance-improvements#312-cqv1-vs-cqv2
---
 .../org/apache/james/backends/rabbitmq/QueueArguments.java   |  5 +++++
 .../james/backends/rabbitmq/RabbitMQConfiguration.java       |  9 +++++++++
 upgrade-instructions.md                                      | 12 ++++++++++++
 3 files changed, 26 insertions(+)

diff --git 
a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/QueueArguments.java
 
b/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/QueueArguments.java
index 3a441b7446..576ef41aba 100644
--- 
a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/QueueArguments.java
+++ 
b/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/QueueArguments.java
@@ -70,6 +70,11 @@ public class QueueArguments {
             return this;
         }
 
+        public Builder classicQueueVersion(int version) {
+            arguments.put("x-queue-version", version);
+            return this;
+        }
+
         public Builder put(String key, Object value) {
             arguments.put(key, value);
             return this;
diff --git 
a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQConfiguration.java
 
b/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQConfiguration.java
index 150b7fd838..7c5071a44d 100644
--- 
a/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQConfiguration.java
+++ 
b/backends-common/rabbitmq/src/main/java/org/apache/james/backends/rabbitmq/RabbitMQConfiguration.java
@@ -601,6 +601,7 @@ public class RabbitMQConfiguration {
 
     private static final String URI_PROPERTY_NAME = "uri";
     private static final String MANAGEMENT_URI_PROPERTY_NAME = 
"management.uri";
+    private static final boolean FALLBACK_CLASSIC_QUEUES_VERSION_1 = 
Boolean.parseBoolean(System.getProperty("fallback.classic.queues.v1", "false"));
 
     public static RequireAmqpUri builder() {
         return amqpUri -> managementUri -> managementCredentials -> new 
Builder(amqpUri, managementUri, managementCredentials);
@@ -817,10 +818,18 @@ public class RabbitMQConfiguration {
         if (useQuorumQueues) {
             
builder.quorumQueue().replicationFactor(quorumQueueReplicationFactor);
             quorumQueueDeliveryLimit.ifPresent(builder::deliveryLimit);
+        } else {
+            applyClassicQueueArguments(builder);
         }
         return builder;
     }
 
+    private void applyClassicQueueArguments(QueueArguments.Builder builder) {
+        if (!FALLBACK_CLASSIC_QUEUES_VERSION_1) {
+            builder.classicQueueVersion(2);
+        }
+    }
+
     public boolean isQuorumQueuesUsed() {
         return useQuorumQueues;
     }
diff --git a/upgrade-instructions.md b/upgrade-instructions.md
index 59feaa8c3c..bbfb543f4b 100644
--- a/upgrade-instructions.md
+++ b/upgrade-instructions.md
@@ -30,6 +30,18 @@ Change list:
  - [Java 21](#java-21)
  - [javax -> jakarta](#javax---jakarta)
  - [Make all queues on RabbitMQ quorum queue when 
`quorum.queues.enable=true`](#make-all-queues-on-rabbitmq-quorum-queue-when-quorumqueuesenabletrue)
+ - [Migrate RabbitMQ classic queues to version 
2](#migrate-rabbitmq-classic-queues-to-version-2)
+
+### Migrate RabbitMQ classic queues to version 2
+
+Date: 14/05/2024
+
+It is recommended by RabbitMQ to upgrade the classic queues to version 2 for 
better performance: 
https://www.rabbitmq.com/blog/2023/05/17/rabbitmq-3.12-performance-improvements#classic-queues-massively-improved-classic-queues-v2-cqv2.
+
+Existing version 1 classic queues would need to be deleted and let James 
re-create them as version 2.
+
+Notice that to use classic queues version 2, you need at least RabbitMQ 
3.10.0. If you want to stick with the older RabbitMQ 
+versions and avoid this breaking change, you could set the JVM property 
`fallback.classic.queues.v1` to `true` (defaults to `false`).
 
 ### Change cluster.enabled in redis.properties to redis.topology
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to