This is an automated email from the ASF dual-hosted git repository. coheigea pushed a commit to branch coheigea/jms-binary in repository https://gitbox.apache.org/repos/asf/cxf.git
commit 98d6b42b4715bb0cad277272344b21f496ea45e9 Author: Colm O hEigeartaigh <[email protected]> AuthorDate: Tue Jul 21 15:15:28 2026 +0100 Default to sending binary JMS messages as BytesMessages from now on, make it configurable --- .../apache/cxf/transport/jms/JMSConfiguration.java | 9 +++++++++ .../apache/cxf/transport/jms/JMSMessageUtils.java | 3 ++- .../org/apache/cxf/transport/jms/util/JMSUtil.java | 20 +++++++++++++++++++- .../apache/cxf/transport/jms/util/JMSUtilTest.java | 13 +++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) diff --git a/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConfiguration.java b/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConfiguration.java index fd1817277f2..b72a111885d 100644 --- a/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConfiguration.java +++ b/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSConfiguration.java @@ -87,6 +87,7 @@ public class JMSConfiguration { private volatile Destination replyToDestinationDest; private String messageType = JMSConstants.TEXT_MESSAGE_TYPE; + private boolean useObjectMessageFallback; private boolean pubSubDomain; private boolean replyPubSubDomain; @@ -284,6 +285,14 @@ public class JMSConfiguration { this.messageType = messageType; } + public boolean isUseObjectMessageFallback() { + return useObjectMessageFallback; + } + + public void setUseObjectMessageFallback(boolean useObjectMessageFallback) { + this.useObjectMessageFallback = useObjectMessageFallback; + } + public boolean isPubSubDomain() { return pubSubDomain; } diff --git a/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSMessageUtils.java b/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSMessageUtils.java index b3f75f4c770..5e28ebbad4c 100644 --- a/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSMessageUtils.java +++ b/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/JMSMessageUtils.java @@ -186,7 +186,8 @@ final class JMSMessageUtils { String headerType) throws JMSException { - Message jmsMessage = JMSUtil.createAndSetPayload(payload, session, messageType); + Message jmsMessage = JMSUtil.createAndSetPayload(payload, session, messageType, + jmsConfig.isUseObjectMessageFallback()); JMSMessageHeadersType messageHeaders = getOrCreateHeader(outMessage, headerType); if (!messageHeaders.isSetJMSDeliveryMode()) { messageHeaders.setJMSDeliveryMode(jmsConfig.getDeliveryMode()); diff --git a/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/util/JMSUtil.java b/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/util/JMSUtil.java index 9478732a96d..22b192bc12b 100644 --- a/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/util/JMSUtil.java +++ b/rt/transports/jms/src/main/java/org/apache/cxf/transport/jms/util/JMSUtil.java @@ -106,12 +106,30 @@ public final class JMSUtil { * @param messageType the JMS message type * @return a JMS of the appropriate type populated with the given payload */ + @Deprecated(since = "4.2.3", forRemoval = true) public static Message createAndSetPayload(Object payload, Session session, String messageType) throws JMSException { + return createAndSetPayload(payload, session, messageType, true); + } + + /** + * Create a JMS of the appropriate type populated with the given payload. + * + * @param payload the message payload, expected to be either of type String or byte[] depending on payload + * type + * @param session the JMS session + * @param messageType the JMS message type + * @param useObjectMessageFallback whether non-text payloads should fall back to ObjectMessage + * @return a JMS of the appropriate type populated with the given payload + */ + public static Message createAndSetPayload(Object payload, Session session, String messageType, + boolean useObjectMessageFallback) + throws JMSException { final Message message; if (JMSConstants.TEXT_MESSAGE_TYPE.equals(messageType)) { message = session.createTextMessage((String)payload); - } else if (JMSConstants.BYTE_MESSAGE_TYPE.equals(messageType)) { + } else if (JMSConstants.BYTE_MESSAGE_TYPE.equals(messageType) + || !useObjectMessageFallback) { message = session.createBytesMessage(); ((BytesMessage)message).writeBytes((byte[])payload); } else { diff --git a/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/util/JMSUtilTest.java b/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/util/JMSUtilTest.java index 25143c0b20c..5345b9bf540 100644 --- a/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/util/JMSUtilTest.java +++ b/rt/transports/jms/src/test/java/org/apache/cxf/transport/jms/util/JMSUtilTest.java @@ -27,6 +27,7 @@ import java.util.concurrent.atomic.AtomicLong; import jakarta.jms.BytesMessage; import jakarta.jms.Connection; import jakarta.jms.JMSException; +import jakarta.jms.ObjectMessage; import jakarta.jms.Session; import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory; import org.apache.activemq.artemis.junit.EmbeddedActiveMQResource; @@ -84,6 +85,18 @@ public class JMSUtilTest { jakarta.jms.Message jmsMessage = JMSUtil.createAndSetPayload(testBytes, session, JMSConstants.BYTE_MESSAGE_TYPE); assertTrue("Message should have been of type BytesMessage ", jmsMessage instanceof BytesMessage); + jmsMessage = JMSUtil.createAndSetPayload(testBytes, session, JMSConstants.BINARY_MESSAGE_TYPE); + assertTrue("Binary message fallback should have been of type ObjectMessage ", + jmsMessage instanceof ObjectMessage); + jmsMessage = JMSUtil.createAndSetPayload(testBytes, session, JMSConstants.BINARY_MESSAGE_TYPE, false); + assertTrue("Fallback-disabled binary message should have been of type BytesMessage ", + jmsMessage instanceof BytesMessage); + jmsMessage = JMSUtil.createAndSetPayload(testBytes, session, "application/octet-stream", true); + assertTrue("Non-text message fallback should have been of type ObjectMessage ", + jmsMessage instanceof ObjectMessage); + jmsMessage = JMSUtil.createAndSetPayload(testBytes, session, "application/octet-stream", false); + assertTrue("Fallback-disabled message should have been of type BytesMessage ", + jmsMessage instanceof BytesMessage); } }
