From 281c985da958df52a83de95d567e6e1e52cea47b Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Fri, 7 Sep 2012 14:09:33 -0400 Subject: [PATCH] INT-2740 MessageSelector w/ Pollable JMS Channel Previously, the 'selector' attribute was ignored when a JMS Channel was pollable rather than message-driven. Add support for MessageSelector to PollableJmsChannel. --- .../integration/jms/PollableJmsChannel.java | 18 +++++++-- .../jms/config/JmsChannelFactoryBean.java | 6 ++- .../jms/PollableJmsChannelTests.java | 40 +++++++++++++++++++ .../config/JmsChannelParserTests-context.xml | 3 ++ .../jms/config/JmsChannelParserTests.java | 13 ++++++ 5 files changed, 76 insertions(+), 4 deletions(-) diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/PollableJmsChannel.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/PollableJmsChannel.java index 4eb8917233..e59ac489e8 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/PollableJmsChannel.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/PollableJmsChannel.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2011 the original author or authors. + * Copyright 2002-2012 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. @@ -24,21 +24,33 @@ import org.springframework.jms.core.JmsTemplate; /** * @author Mark Fisher * @author Oleg Zhurakousky + * @author Gary Russell * @since 2.0 */ public class PollableJmsChannel extends AbstractJmsChannel implements PollableChannel { + private volatile String messageSelector; + public PollableJmsChannel(JmsTemplate jmsTemplate) { super(jmsTemplate); } + public void setMessageSelector(String messageSelector) { + this.messageSelector = messageSelector; + } public Message receive() { if (!this.getInterceptors().preReceive(this)) { return null; } - Object object = this.getJmsTemplate().receiveAndConvert(); - + Object object; + if (this.messageSelector == null) { + object = this.getJmsTemplate().receiveAndConvert(); + } + else { + object = this.getJmsTemplate().receiveSelectedAndConvert(this.messageSelector); + } + if (object == null) { return null; } diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsChannelFactoryBean.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsChannelFactoryBean.java index d5cd3dcd40..059501a02b 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsChannelFactoryBean.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/config/JmsChannelFactoryBean.java @@ -341,7 +341,11 @@ public class JmsChannelFactoryBean extends AbstractFactoryBean("foo")); + assertTrue(sent1); + Message result1 = channel.receive(100); + assertNull(result1); + + JmsTemplate jmsTemplate = new JmsTemplate(this.connectionFactory); + jmsTemplate.setDefaultDestinationName("pollableJmsChannelSelectorTestQueue"); + jmsTemplate.send(new MessageCreator() { + + public javax.jms.Message createMessage(Session session) throws JMSException { + TextMessage message = session.createTextMessage("bar"); + message.setStringProperty("baz", "qux"); + return message; + } + }); + + Message result2 = channel.receive(1000); + assertNotNull(result2); + assertEquals("bar", result2.getPayload()); + } + public static class SampleInterceptor implements ChannelInterceptor { private final boolean preReceiveFlag; public SampleInterceptor(boolean preReceiveFlag){ diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests-context.xml b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests-context.xml index 63834fd9b7..5e56755304 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests-context.xml +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests-context.xml @@ -47,6 +47,9 @@ + + diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests.java b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests.java index 46ea321ab2..b155278190 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests.java +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/config/JmsChannelParserTests.java @@ -94,6 +94,9 @@ public class JmsChannelParserTests { @Autowired private MessageChannel pollableQueueNameChannel; + @Autowired + private MessageChannel pollableWithSelectorChannel; + @Autowired private Topic topic; @@ -245,6 +248,16 @@ public class JmsChannelParserTests { assertEquals("foo", jmsTemplate.getDefaultDestinationName()); } + @Test + public void selectorPollableChannel() { + assertEquals(PollableJmsChannel.class, pollableWithSelectorChannel.getClass()); + PollableJmsChannel channel = (PollableJmsChannel) pollableWithSelectorChannel; + DirectFieldAccessor accessor = new DirectFieldAccessor(channel); + JmsTemplate jmsTemplate = (JmsTemplate) accessor.getPropertyValue("jmsTemplate"); + assertEquals(queue, jmsTemplate.getDefaultDestination()); + assertEquals("foo='bar'", accessor.getPropertyValue("messageSelector")); + } + @Test public void withPlaceholders() { DefaultMessageListenerContainer container = TestUtils.getPropertyValue(withPlaceholders, "container", DefaultMessageListenerContainer.class);