From c0637b6e99361e6dd7330da225ee7a405b5adc2a Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Wed, 29 Jan 2014 18:18:15 -0500 Subject: [PATCH] INT-3259 Map Inbound JMSPriority to `priority` JIRA: https://jira.springsource.org/browse/INT-3259 Add an option to suppress if needed. INT-3259: Polishing according PR comments --- .../jms/DefaultJmsHeaderMapper.java | 22 ++++++++++++++- .../jms/DefaultJmsHeaderMapperTests.java | 28 +++++++++++++++++-- src/reference/docbook/jms.xml | 6 ++++ src/reference/docbook/whats-new.xml | 8 ++++++ 4 files changed, 61 insertions(+), 3 deletions(-) diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java index 307dc324fe..814eab6009 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java @@ -29,6 +29,7 @@ import javax.jms.JMSException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.integration.IntegrationMessageHeaderAccessor; import org.springframework.messaging.MessageHeaders; import org.springframework.util.StringUtils; @@ -63,6 +64,16 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper { private volatile String outboundPrefix = ""; + private volatile boolean mapInboundPriority = true; + + /** + * Suppress the mapping of inbound priority by using this setter with 'false'. + * + * @param mapInboundPriority 'false' to suppress mapping the inbound priority. + */ + public void setMapInboundPriority(boolean mapInboundPriority) { + this.mapInboundPriority = mapInboundPriority; + } /** * Specify a prefix to be appended to the integration message header name @@ -205,9 +216,18 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper { } try { headers.put(JmsHeaders.TIMESTAMP, jmsMessage.getJMSTimestamp()); - } catch (Exception e) { + } + catch (Exception e) { logger.info("failed to read JMSTimestamp property, skipping", e); } + if (this.mapInboundPriority) { + try { + headers.put(IntegrationMessageHeaderAccessor.PRIORITY, jmsMessage.getJMSPriority()); + } + catch (Exception e) { + logger.info("failed to read JMSPriority property, skipping", e); + } + } Enumeration jmsPropertyNames = jmsMessage.getPropertyNames(); if (jmsPropertyNames != null) { while (jmsPropertyNames.hasMoreElements()) { diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java b/spring-integration-jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java index 44e8241908..67793d8fc0 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2013 the original author or authors. + * Copyright 2002-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,9 +28,11 @@ import javax.jms.Destination; import javax.jms.JMSException; import org.junit.Test; + +import org.springframework.integration.IntegrationMessageHeaderAccessor; +import org.springframework.integration.support.MessageBuilder; import org.springframework.messaging.Message; import org.springframework.messaging.MessageHeaders; -import org.springframework.integration.support.MessageBuilder; /** * @author Mark Fisher @@ -229,6 +231,28 @@ public class DefaultJmsHeaderMapperTests { assertEquals(timestamp, attrib); } + @Test + public void testJmsPriorityMappedToHeader() throws JMSException { + javax.jms.Message jmsMessage = new StubTextMessage(); + jmsMessage.setJMSPriority(5); + DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper(); + Map headers = mapper.toHeaders(jmsMessage); + Object attrib = headers.get(IntegrationMessageHeaderAccessor.PRIORITY); + assertNotNull(attrib); + assertEquals(5, attrib); + } + + @Test + public void testJmsPriorityNotMappedToHeader() throws JMSException { + javax.jms.Message jmsMessage = new StubTextMessage(); + jmsMessage.setJMSPriority(5); + DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper(); + mapper.setMapInboundPriority(false); + Map headers = mapper.toHeaders(jmsMessage); + Object attrib = headers.get(IntegrationMessageHeaderAccessor.PRIORITY); + assertNull(attrib); + } + @Test public void testContentTypePropertyMappedToHeader() throws JMSException { javax.jms.Message jmsMessage = new StubTextMessage(); diff --git a/src/reference/docbook/jms.xml b/src/reference/docbook/jms.xml index f8b8c5169d..c0e231a1d1 100644 --- a/src/reference/docbook/jms.xml +++ b/src/reference/docbook/jms.xml @@ -521,6 +521,12 @@ standard JMS API Headers as well as primitive/String Message Headers. Custom header mapper could also be provided via header-mapper attribute of inbound and outbound gateways. + + Since version 4.0, the JMSPriority header is mapped to the standard + priority header for inbound messages (previously, the priority header was only used for + outbound messages). To revert to the previous behavior (do not map inbound priority), use the + mapInboundPriority property of DefaultJmsHeaderMapper with argument set to false. + diff --git a/src/reference/docbook/whats-new.xml b/src/reference/docbook/whats-new.xml index d16fc47b1a..52401e7672 100644 --- a/src/reference/docbook/whats-new.xml +++ b/src/reference/docbook/whats-new.xml @@ -50,5 +50,13 @@ For more information see . +
+ JMS Header Mapping + + The DefaultJmsHeaderMapper now maps an incoming JMSPriority header to + the Spring Integration priority header. Previously priority was only + considered for outbound messages. For more information see . + +