diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsOutboundGateway.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsOutboundGateway.java
index d1be29d3d7..63e711dacf 100644
--- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsOutboundGateway.java
+++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/JmsOutboundGateway.java
@@ -370,15 +370,19 @@ public class JmsOutboundGateway extends AbstractReplyProducingMessageHandler {
jmsRequest.setJMSReplyTo(replyTo);
connection.start();
+ Integer priority = requestMessage.getHeaders().getPriority();
+ if (priority == null) {
+ priority = this.priority;
+ }
javax.jms.Message replyMessage = null;
if (this.correlationKey != null) {
- replyMessage = this.doSendAndReceiveWithGeneratedCorrelationId(jmsRequest, replyTo, session);
+ replyMessage = this.doSendAndReceiveWithGeneratedCorrelationId(jmsRequest, replyTo, session, priority);
}
else if (replyTo instanceof TemporaryQueue || replyTo instanceof TemporaryTopic) {
- replyMessage = this.doSendAndReceiveWithTemporaryReplyToDestination(jmsRequest, replyTo, session);
+ replyMessage = this.doSendAndReceiveWithTemporaryReplyToDestination(jmsRequest, replyTo, session, priority);
}
else {
- replyMessage = this.doSendAndReceiveWithMessageIdCorrelation(jmsRequest, replyTo, session);
+ replyMessage = this.doSendAndReceiveWithMessageIdCorrelation(jmsRequest, replyTo, session, priority);
}
return replyMessage;
}
@@ -392,7 +396,7 @@ public class JmsOutboundGateway extends AbstractReplyProducingMessageHandler {
/**
* Creates the MessageConsumer before sending the request Message since we are generating our own correlationId value for the MessageSelector.
*/
- private javax.jms.Message doSendAndReceiveWithGeneratedCorrelationId(javax.jms.Message jmsRequest, Destination replyTo, Session session) throws JMSException {
+ private javax.jms.Message doSendAndReceiveWithGeneratedCorrelationId(javax.jms.Message jmsRequest, Destination replyTo, Session session, int priority) throws JMSException {
MessageProducer messageProducer = null;
MessageConsumer messageConsumer = null;
try {
@@ -409,7 +413,7 @@ public class JmsOutboundGateway extends AbstractReplyProducingMessageHandler {
messageSelector = this.correlationKey + " = '" + correlationId + "'";
}
messageConsumer = session.createConsumer(replyTo, messageSelector);
- this.sendRequestMessage(jmsRequest, messageProducer);
+ this.sendRequestMessage(jmsRequest, messageProducer, priority);
return this.receiveReplyMessage(messageConsumer);
}
finally {
@@ -421,13 +425,13 @@ public class JmsOutboundGateway extends AbstractReplyProducingMessageHandler {
/**
* Creates the MessageConsumer before sending the request Message since we do not need any correlation.
*/
- private javax.jms.Message doSendAndReceiveWithTemporaryReplyToDestination(javax.jms.Message jmsRequest, Destination replyTo, Session session) throws JMSException {
+ private javax.jms.Message doSendAndReceiveWithTemporaryReplyToDestination(javax.jms.Message jmsRequest, Destination replyTo, Session session, int priority) throws JMSException {
MessageProducer messageProducer = null;
MessageConsumer messageConsumer = null;
try {
messageProducer = session.createProducer(this.getRequestDestination(session));
messageConsumer = session.createConsumer(replyTo);
- this.sendRequestMessage(jmsRequest, messageProducer);
+ this.sendRequestMessage(jmsRequest, messageProducer, priority);
return this.receiveReplyMessage(messageConsumer);
}
finally {
@@ -439,7 +443,7 @@ public class JmsOutboundGateway extends AbstractReplyProducingMessageHandler {
/**
* Creates the MessageConsumer after sending the request Message since we need the MessageID for correlation with a MessageSelector.
*/
- private javax.jms.Message doSendAndReceiveWithMessageIdCorrelation(javax.jms.Message jmsRequest, Destination replyTo, Session session) throws JMSException {
+ private javax.jms.Message doSendAndReceiveWithMessageIdCorrelation(javax.jms.Message jmsRequest, Destination replyTo, Session session, int priority) throws JMSException {
if (replyTo instanceof Topic && logger.isWarnEnabled()) {
logger.warn("Relying on the MessageID for correlation is not recommended when using a Topic as the replyTo Destination " +
"because that ID can only be provided to a MessageSelector after the reuqest Message has been sent thereby " +
@@ -451,7 +455,7 @@ public class JmsOutboundGateway extends AbstractReplyProducingMessageHandler {
MessageConsumer messageConsumer = null;
try {
messageProducer = session.createProducer(this.getRequestDestination(session));
- this.sendRequestMessage(jmsRequest, messageProducer);
+ this.sendRequestMessage(jmsRequest, messageProducer, priority);
String messageId = jmsRequest.getJMSMessageID().replaceAll("'", "''");
String messageSelector = "JMSCorrelationID = '" + messageId + "'";
messageConsumer = session.createConsumer(replyTo, messageSelector);
@@ -463,9 +467,9 @@ public class JmsOutboundGateway extends AbstractReplyProducingMessageHandler {
}
}
- private void sendRequestMessage(javax.jms.Message jmsRequest, MessageProducer messageProducer) throws JMSException {
+ private void sendRequestMessage(javax.jms.Message jmsRequest, MessageProducer messageProducer, int priority) throws JMSException {
if (this.explicitQosEnabled) {
- messageProducer.send(jmsRequest, this.deliveryMode, this.priority, this.timeToLive);
+ messageProducer.send(jmsRequest, this.deliveryMode, priority, this.timeToLive);
}
else {
messageProducer.send(jmsRequest);
diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsPriorityTests-context.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsPriorityTests-context.xml
index e035d241ac..e994a01ea1 100644
--- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsPriorityTests-context.xml
+++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsPriorityTests-context.xml
@@ -1,17 +1,23 @@
-
+
-
-
-
+
+
+
+
+
+
+
@@ -25,4 +31,10 @@
+
+
+
+
+
+
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 0af1f4ffc9..ab453efe94 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
@@ -20,6 +20,11 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import javax.jms.JMSException;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -27,8 +32,10 @@ import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.Message;
import org.springframework.integration.MessageChannel;
+import org.springframework.integration.channel.QueueChannel;
import org.springframework.integration.core.PollableChannel;
import org.springframework.integration.support.MessageBuilder;
+import org.springframework.jms.listener.SessionAwareMessageListener;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@@ -41,10 +48,14 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
public class JmsPriorityTests {
@Autowired
- private MessageChannel outbound;
+ private MessageChannel channelAdapterChannel;
@Autowired
- private PollableChannel results;
+ private PollableChannel channelAdapterResults;
+
+ @Autowired
+ private MessageChannel gatewayChannel;
+
@Before
public void prepareActiveMq() {
@@ -52,10 +63,10 @@ public class JmsPriorityTests {
}
@Test
- public void verifyPrioritySettingOnAdapterUsedAsJmsPriorityIfNoHeader() throws Exception {
+ public void verifyPrioritySettingOnChannelAdapterUsedAsJmsPriorityIfNoHeader() throws Exception {
Message> message = MessageBuilder.withPayload("test").build();
- outbound.send(message);
- Message> result = results.receive(5000);
+ channelAdapterChannel.send(message);
+ Message> result = channelAdapterResults.receive(5000);
assertNotNull(result);
assertTrue(result.getPayload() instanceof javax.jms.Message);
javax.jms.Message jmsMessage = (javax.jms.Message) result.getPayload();
@@ -63,14 +74,45 @@ public class JmsPriorityTests {
}
@Test
- public void verifyPriorityHeaderUsedAsJmsPriority() throws Exception {
+ public void verifyPriorityHeaderUsedAsJmsPriorityWithChannelAdapter() throws Exception {
Message> message = MessageBuilder.withPayload("test").setPriority(7).build();
- outbound.send(message);
- Message> result = results.receive(5000);
+ channelAdapterChannel.send(message);
+ Message> result = channelAdapterResults.receive(5000);
assertNotNull(result);
assertTrue(result.getPayload() instanceof javax.jms.Message);
javax.jms.Message jmsMessage = (javax.jms.Message) result.getPayload();
assertEquals(7, jmsMessage.getJMSPriority());
}
+ @Test
+ public void verifyPrioritySettingOnGatewayUsedAsJmsPriorityIfNoHeader() throws Exception {
+ QueueChannel replyChannel = new QueueChannel();
+ Message> message = MessageBuilder.withPayload("test").setReplyChannel(replyChannel).build();
+ gatewayChannel.send(message);
+ Message> result = replyChannel.receive(5000);
+ assertNotNull(result);
+ assertEquals("priority=2", result.getPayload());
+ }
+
+ @Test
+ public void verifyPriorityHeaderUsedAsJmsPriorityWithGateway() throws Exception {
+ QueueChannel replyChannel = new QueueChannel();
+ Message> message = MessageBuilder.withPayload("test").setPriority(8).setReplyChannel(replyChannel).build();
+ gatewayChannel.send(message);
+ Message> result = replyChannel.receive(5000);
+ assertNotNull(result);
+ assertEquals("priority=8", result.getPayload());
+ }
+
+
+ public static class PriorityReader implements SessionAwareMessageListener {
+
+ public void onMessage(javax.jms.Message request, Session session) throws JMSException {
+ String text = "priority=" + request.getJMSPriority();
+ TextMessage reply = session.createTextMessage(text);
+ MessageProducer producer = session.createProducer(request.getJMSReplyTo());
+ producer.send(reply);
+ }
+ }
+
}