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}"); + } + }; + } +}
