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

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

commit ba22a8d8825ce2ca7a596237670c20fae573193e
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Sep 14 11:41:41 2024 +0200

    CAMEL-21219: camel-jms - Sending request/reply should not include temporary 
CamelJmsDeliveryMode header
---
 .../org/apache/camel/component/jms/JmsBinding.java |  3 +-
 .../camel/component/jms/JmsConfiguration.java      |  2 +-
 .../camel/component/jms/JmsMessageHelper.java      |  8 +-
 ...questReplyCamelDeliveryModeHeaderIssueTest.java | 94 ++++++++++++++++++++++
 4 files changed, 103 insertions(+), 4 deletions(-)

diff --git 
a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
 
b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
index 8dd13a4e8f3..d55776a9ff1 100644
--- 
a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
+++ 
b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsBinding.java
@@ -393,7 +393,8 @@ public class JmsBinding {
             } else if (headerName.equals(JmsConstants.JMS_HEADER_PRIORITY)) {
                 
jmsMessage.setJMSPriority(ExchangeHelper.convertToType(exchange, Integer.class, 
headerValue));
             } else if 
(headerName.equals(JmsConstants.JMS_HEADER_DELIVERY_MODE)) {
-                JmsMessageHelper.setJMSDeliveryMode(exchange, jmsMessage, 
headerValue);
+                boolean qos = endpoint != null && 
endpoint.isPreserveMessageQos();
+                JmsMessageHelper.setJMSDeliveryMode(exchange, jmsMessage, 
headerValue, qos);
             } else if (headerName.equals(JmsConstants.JMS_HEADER_EXPIRATION)) {
                 
jmsMessage.setJMSExpiration(ExchangeHelper.convertToType(exchange, Long.class, 
headerValue));
             } else {
diff --git 
a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
 
b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
index 739382a3569..d56ae4544e4 100644
--- 
a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
+++ 
b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsConfiguration.java
@@ -675,7 +675,7 @@ public class JmsConfiguration implements Cloneable {
 
                 // 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 of whether it was set or not as getJMSDeliveryMode() 
will default return 1 regardless
+                // track of 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)) {
diff --git 
a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java
 
b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java
index ae265618f04..a057323b1ae 100644
--- 
a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java
+++ 
b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessageHelper.java
@@ -413,9 +413,11 @@ public final class JmsMessageHelper {
      * @param  exchange                 the exchange
      * @param  message                  the message
      * @param  deliveryMode             the delivery mode, either as a String 
or integer
+     * @param  preserveMessageQos       whether the option preserveMessageQos 
has been enabled
      * @throws jakarta.jms.JMSException is thrown if error setting the 
delivery mode
      */
-    public static void setJMSDeliveryMode(Exchange exchange, Message message, 
Object deliveryMode) throws JMSException {
+    public static void setJMSDeliveryMode(Exchange exchange, Message message, 
Object deliveryMode, boolean preserveMessageQos)
+            throws JMSException {
         Integer mode = null;
 
         if (deliveryMode instanceof String s) {
@@ -442,7 +444,9 @@ public final class JmsMessageHelper {
 
         if (mode != null) {
             message.setJMSDeliveryMode(mode);
-            message.setIntProperty(JmsConstants.JMS_DELIVERY_MODE, mode);
+            if (preserveMessageQos) {
+                message.setIntProperty(JmsConstants.JMS_DELIVERY_MODE, mode);
+            }
         }
     }
 
diff --git 
a/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/JmsRequestReplyCamelDeliveryModeHeaderIssueTest.java
 
b/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/JmsRequestReplyCamelDeliveryModeHeaderIssueTest.java
new file mode 100644
index 00000000000..7b6b525cc8f
--- /dev/null
+++ 
b/components/camel-jms/src/test/java/org/apache/camel/component/jms/issues/JmsRequestReplyCamelDeliveryModeHeaderIssueTest.java
@@ -0,0 +1,94 @@
+/*
+ * 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.camel.component.jms.issues;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.jms.AbstractJMSTest;
+import org.apache.camel.component.jms.JmsConstants;
+import org.apache.camel.test.infra.core.CamelContextExtension;
+import org.apache.camel.test.infra.core.DefaultCamelContextExtension;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+public class JmsRequestReplyCamelDeliveryModeHeaderIssueTest extends 
AbstractJMSTest {
+
+    @Order(2)
+    @RegisterExtension
+    public static CamelContextExtension camelContextExtension = new 
DefaultCamelContextExtension();
+    protected CamelContext context;
+    protected ProducerTemplate template;
+
+    @Test
+    public void testInOnly() {
+        Exchange out = 
template.request(context.getEndpoint("activemq:cheese"), (e) -> {
+            e.setPattern(ExchangePattern.InOnly);
+            e.getMessage().setBody("Camel");
+        });
+        Assertions.assertNotNull(out);
+        Assertions.assertEquals("Camel", out.getMessage().getBody());
+        Assertions.assertEquals(1, out.getMessage().getHeaders().size());
+        Assertions.assertEquals("cheese", 
out.getMessage().getHeaders().get(JmsConstants.JMS_DESTINATION_NAME_PRODUCED));
+        
Assertions.assertNull(out.getMessage().getHeaders().get(JmsConstants.JMS_DELIVERY_MODE));
+    }
+
+    @Test
+    public void testInOut() {
+        Exchange out = 
template.request(context.getEndpoint("activemq:cheese"), (e) -> {
+            e.setPattern(ExchangePattern.InOut);
+            e.getMessage().setBody("World");
+        });
+        Assertions.assertNotNull(out);
+        Assertions.assertEquals("Hello World", out.getMessage().getBody());
+        Assertions.assertEquals(16, out.getMessage().getHeaders().size());
+        Assertions.assertEquals("cheese", 
out.getMessage().getHeaders().get(JmsConstants.JMS_DESTINATION_NAME_PRODUCED));
+        
Assertions.assertNull(out.getMessage().getHeaders().get(JmsConstants.JMS_DELIVERY_MODE));
+    }
+
+    @Override
+    protected String getComponentName() {
+        return "activemq";
+    }
+
+    @Override
+    public CamelContextExtension getCamelContextExtension() {
+        return camelContextExtension;
+    }
+
+    @BeforeEach
+    void setUpRequirements() {
+        context = camelContextExtension.getContext();
+        template = camelContextExtension.getProducerTemplate();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("activemq:cheese")
+                        .setBody().simple("Hello ${body}");
+            }
+        };
+    }
+}

Reply via email to