You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/04/12 17:04:55 UTC

[camel] branch camel-3.11.x updated: CAMEL-17912: camel-sjms - Add preserveMessageQos code in producer which was missing (copy from camel-jms)

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

davsclaus pushed a commit to branch camel-3.11.x
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/camel-3.11.x by this push:
     new 8e35965f0a5 CAMEL-17912: camel-sjms - Add preserveMessageQos code in producer which was missing (copy from camel-jms)
8e35965f0a5 is described below

commit 8e35965f0a5a4308519350fefc433bfff0fdaaa9
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Apr 12 19:03:46 2022 +0200

    CAMEL-17912: camel-sjms - Add preserveMessageQos code in producer which was missing (copy from camel-jms)
---
 .../apache/camel/component/sjms/SjmsEndpoint.java  |  1 +
 .../apache/camel/component/sjms/SjmsTemplate.java  | 40 +++++++++++++++++++++-
 2 files changed, 40 insertions(+), 1 deletion(-)

diff --git a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsEndpoint.java b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsEndpoint.java
index 693d3725bf2..dd9d265a090 100644
--- a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsEndpoint.java
+++ b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsEndpoint.java
@@ -406,6 +406,7 @@ public class SjmsEndpoint extends DefaultEndpoint
             }
         }
         template.setDestinationCreationStrategy(getDestinationCreationStrategy());
+        template.setPreserveMessageQos(isPreserveMessageQos());
 
         return template;
     }
diff --git a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsTemplate.java b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsTemplate.java
index 701902ca062..4178f25a31a 100644
--- a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsTemplate.java
+++ b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsTemplate.java
@@ -27,6 +27,8 @@ import javax.jms.Session;
 import org.apache.camel.Exchange;
 import org.apache.camel.ExtendedExchange;
 import org.apache.camel.component.sjms.jms.DestinationCreationStrategy;
+import org.apache.camel.component.sjms.jms.JmsConstants;
+import org.apache.camel.component.sjms.jms.JmsMessageHelper;
 import org.apache.camel.component.sjms.jms.MessageCreator;
 import org.apache.camel.util.ObjectHelper;
 
@@ -39,6 +41,7 @@ public class SjmsTemplate {
     private final int acknowledgeMode;
     private DestinationCreationStrategy destinationCreationStrategy;
 
+    private boolean preserveMessageQos;
     private boolean explicitQosEnabled;
     private int deliveryMode = Message.DEFAULT_DELIVERY_MODE;
     private int priority = Message.DEFAULT_PRIORITY;
@@ -79,6 +82,10 @@ public class SjmsTemplate {
         this.explicitQosEnabled = explicitQosEnabled;
     }
 
+    public void setPreserveMessageQos(boolean preserveMessageQos) {
+        this.preserveMessageQos = preserveMessageQos;
+    }
+
     public Object execute(SessionCallback sessionCallback, boolean startConnection) throws Exception {
         Connection con = null;
         Session session = null;
@@ -159,7 +166,38 @@ public class SjmsTemplate {
     }
 
     public void send(MessageProducer producer, Message message) throws Exception {
-        if (explicitQosEnabled) {
+        if (preserveMessageQos) {
+            long ttl = message.getJMSExpiration();
+            if (ttl != 0) {
+                ttl = ttl - System.currentTimeMillis();
+                // Message had expired.. so set the ttl as small as possible
+                if (ttl <= 0) {
+                    ttl = 1;
+                }
+            }
+
+            int priority = message.getJMSPriority();
+            if (priority < 0 || priority > 9) {
+                // use priority from endpoint if not provided on message with a valid range
+                priority = this.priority;
+            }
+
+            // if a delivery mode was set as a JMS header then we have used a temporary
+            // property to store it - CamelJMSDeliveryMode. Otherwise we could not keep
+            // track whether it was set or not as getJMSDeliveryMode() will default return 1 regardless
+            // if it was set or not, so we can never tell if end user provided it in a header
+            int deliveryMode;
+            if (JmsMessageHelper.hasProperty(message, JmsConstants.JMS_DELIVERY_MODE)) {
+                deliveryMode = message.getIntProperty(JmsConstants.JMS_DELIVERY_MODE);
+                // remove the temporary property
+                JmsMessageHelper.removeJmsProperty(message, JmsConstants.JMS_DELIVERY_MODE);
+            } else {
+                // use the existing delivery mode from the message
+                deliveryMode = message.getJMSDeliveryMode();
+            }
+
+            producer.send(message, deliveryMode, priority, ttl);
+        } else if (explicitQosEnabled) {
             producer.send(message, deliveryMode, priority, timeToLive);
         } else {
             producer.send(message);