diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/DynamicJmsTemplate.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/DynamicJmsTemplate.java new file mode 100644 index 0000000000..25fde9075d --- /dev/null +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/DynamicJmsTemplate.java @@ -0,0 +1,44 @@ +/* + * Copyright 2002-2011 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. + * 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.springframework.integration.jms; + +import org.springframework.jms.core.JmsTemplate; +import org.springframework.util.Assert; + +/** + * @author Mark Fisher + * @since 2.0.2 + */ +public class DynamicJmsTemplate extends JmsTemplate { + + @Override + public int getPriority() { + Integer priority = DynamicJmsTemplateProperties.getPriority(); + if (priority == null) { + return super.getPriority(); + } + Assert.isTrue(priority >=0 && priority <= 9, "JMS priority must be in the range of 0-9"); + return priority.intValue(); + } + + @Override + public long getReceiveTimeout() { + Long receiveTimeout = DynamicJmsTemplateProperties.getReceiveTimeout(); + return (receiveTimeout != null) ? receiveTimeout.longValue() : super.getReceiveTimeout(); + } + +} diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/DynamicJmsTemplateProperties.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/DynamicJmsTemplateProperties.java new file mode 100644 index 0000000000..c656047112 --- /dev/null +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/DynamicJmsTemplateProperties.java @@ -0,0 +1,54 @@ +/* + * Copyright 2002-2011 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. + * 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.springframework.integration.jms; + +/** + * @author Mark Fisher + * @since 2.0.2 + */ +abstract class DynamicJmsTemplateProperties { + + private static final ThreadLocal priorityHolder = new ThreadLocal(); + + private static final ThreadLocal receiveTimeoutHolder = new ThreadLocal(); + + + public static Integer getPriority() { + return priorityHolder.get(); + } + + public static void setPriority(Integer priority) { + priorityHolder.set(priority); + } + + public static void clearPriority() { + priorityHolder.remove(); + } + + public static Long getReceiveTimeout() { + return receiveTimeoutHolder.get(); + } + + public static void setReceiveTimeout(Long receiveTimeout) { + receiveTimeoutHolder.set(receiveTimeout); + } + + public static void clearReceiveTimeout() { + receiveTimeoutHolder.remove(); + } + +} diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsSendingMessageHandler.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsSendingMessageHandler.java index 3c1fe617a5..d7bed290f1 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsSendingMessageHandler.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsSendingMessageHandler.java @@ -85,6 +85,16 @@ public class JmsSendingMessageHandler extends AbstractMessageHandler { } Object objectToSend = (this.extractPayload) ? message.getPayload() : message; MessagePostProcessor messagePostProcessor = new HeaderMappingMessagePostProcessor(message, this.headerMapper); + try { + DynamicJmsTemplateProperties.setPriority(message.getHeaders().getPriority()); + this.send(objectToSend, messagePostProcessor); + } + finally { + DynamicJmsTemplateProperties.clearPriority(); + } + } + + private void send(Object objectToSend, MessagePostProcessor messagePostProcessor) { if (this.destination != null) { this.jmsTemplate.convertAndSend(this.destination, objectToSend, messagePostProcessor); } diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsAdapterParserUtils.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsAdapterParserUtils.java index e2f466ca42..6f3d819df6 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsAdapterParserUtils.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsAdapterParserUtils.java @@ -113,7 +113,7 @@ abstract class JmsAdapterParserUtils { static BeanDefinition parseJmsTemplateBeanDefinition(Element element, ParserContext parserContext) { BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition( - "org.springframework.jms.core.JmsTemplate"); + "org.springframework.integration.jms.DynamicJmsTemplate"); builder.addPropertyReference(JmsAdapterParserUtils.CONNECTION_FACTORY_PROPERTY, JmsAdapterParserUtils.determineConnectionFactoryBeanName(element, parserContext)); IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converter"); diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsPriorityTests.java b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsPriorityTests.java index a5618f8e3e..0af1f4ffc9 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsPriorityTests.java +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsPriorityTests.java @@ -21,7 +21,6 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -64,7 +63,6 @@ public class JmsPriorityTests { } @Test - @Ignore public void verifyPriorityHeaderUsedAsJmsPriority() throws Exception { Message message = MessageBuilder.withPayload("test").setPriority(7).build(); outbound.send(message);