/*
* Copyright 2002-2015 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.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.List;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.Topic;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.jms.PollableJmsChannel;
import org.springframework.integration.jms.SubscribableJmsChannel;
import org.springframework.integration.support.MessageBuilderFactory;
import org.springframework.integration.test.util.TestUtils;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.listener.AbstractMessageListenerContainer;
import org.springframework.jms.listener.DefaultMessageListenerContainer;
import org.springframework.jms.listener.SimpleMessageListenerContainer;
import org.springframework.jms.support.destination.DestinationResolver;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.ChannelInterceptor;
import org.springframework.messaging.support.ChannelInterceptorAdapter;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Mark Fisher
* @author Gary Russell
*/
@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@DirtiesContext
public class JmsChannelParserTests {
@Autowired
private MessageChannel queueReferenceChannel;
@Autowired
private MessageChannel queueNameChannel;
@Autowired
private MessageChannel queueNameWithResolverChannel;
@Autowired
private Queue queue;
@Autowired
private MessageChannel topicReferenceChannel;
@Autowired
private MessageChannel topicNameChannel;
@Autowired
private MessageChannel withPlaceholders;
@Autowired
private MessageChannel topicNameWithResolverChannel;
@Autowired
private MessageChannel channelWithConcurrencySettings;
@Autowired
private MessageChannel queueChannelWithInterceptors;
@Autowired
private MessageChannel topicChannelWithInterceptors;
@Autowired
private MessageChannel pollableQueueReferenceChannel;
@Autowired
private MessageChannel pollableQueueNameChannel;
@Autowired
private MessageChannel pollableWithSelectorChannel;
@Autowired
private Topic topic;
@Autowired
private MessageChannel withDefaultContainer;
@Autowired
private MessageChannel withExplicitDefaultContainer;
@Autowired
private MessageChannel withSimpleContainer;
@Autowired
private MessageChannel withContainerClass;
@Autowired
private MessageChannel withContainerClassSpEL;
@Autowired
private MessageBuilderFactory messageBuilderFactory;
@Test
public void queueReferenceChannel() {
assertEquals(SubscribableJmsChannel.class, queueReferenceChannel.getClass());
SubscribableJmsChannel channel = (SubscribableJmsChannel) queueReferenceChannel;
DirectFieldAccessor accessor = new DirectFieldAccessor(channel);
JmsTemplate jmsTemplate = (JmsTemplate) accessor.getPropertyValue("jmsTemplate");
AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) accessor.getPropertyValue("container");
assertEquals(queue, jmsTemplate.getDefaultDestination());
assertEquals(queue, container.getDestination());
assertEquals(true, TestUtils.getPropertyValue(jmsTemplate, "explicitQosEnabled"));
assertEquals(DeliveryMode.PERSISTENT, TestUtils.getPropertyValue(jmsTemplate, "deliveryMode"));
assertEquals(123L, TestUtils.getPropertyValue(jmsTemplate, "timeToLive"));
assertEquals(12, TestUtils.getPropertyValue(jmsTemplate, "priority"));
assertEquals(Integer.MAX_VALUE, TestUtils.getPropertyValue(
TestUtils.getPropertyValue(channel, "dispatcher"), "maxSubscribers", Integer.class).intValue());
}
@Test
public void queueNameChannel() {
assertEquals(SubscribableJmsChannel.class, queueNameChannel.getClass());
SubscribableJmsChannel channel = (SubscribableJmsChannel) queueNameChannel;
DirectFieldAccessor accessor = new DirectFieldAccessor(channel);
JmsTemplate jmsTemplate = (JmsTemplate) accessor.getPropertyValue("jmsTemplate");
AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) accessor.getPropertyValue("container");
assertEquals("test.queue", jmsTemplate.getDefaultDestinationName());
assertEquals("test.queue", container.getDestinationName());
assertEquals(1, TestUtils.getPropertyValue(
TestUtils.getPropertyValue(channel, "dispatcher"), "maxSubscribers", Integer.class).intValue());
}
@Test
public void queueNameWithResolverChannel() {
assertEquals(SubscribableJmsChannel.class, queueNameWithResolverChannel.getClass());
SubscribableJmsChannel channel = (SubscribableJmsChannel) queueNameWithResolverChannel;
DirectFieldAccessor accessor = new DirectFieldAccessor(channel);
JmsTemplate jmsTemplate = (JmsTemplate) accessor.getPropertyValue("jmsTemplate");
AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) accessor.getPropertyValue("container");
assertEquals("foo", jmsTemplate.getDefaultDestinationName());
assertEquals("foo", container.getDestinationName());
}
@Test
public void topicReferenceChannel() {
assertEquals(SubscribableJmsChannel.class, topicReferenceChannel.getClass());
SubscribableJmsChannel channel = (SubscribableJmsChannel) topicReferenceChannel;
DirectFieldAccessor accessor = new DirectFieldAccessor(channel);
JmsTemplate jmsTemplate = (JmsTemplate) accessor.getPropertyValue("jmsTemplate");
AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) accessor.getPropertyValue("container");
assertEquals(topic, jmsTemplate.getDefaultDestination());
assertEquals(topic, container.getDestination());
assertSame(this.messageBuilderFactory,
TestUtils.getPropertyValue(channel, "container.messageListener.messageBuilderFactory"));
}
@Test
public void topicNameChannel() {
assertEquals(SubscribableJmsChannel.class, topicNameChannel.getClass());
SubscribableJmsChannel channel = (SubscribableJmsChannel) topicNameChannel;
DirectFieldAccessor accessor = new DirectFieldAccessor(channel);
JmsTemplate jmsTemplate = (JmsTemplate) accessor.getPropertyValue("jmsTemplate");
AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) accessor.getPropertyValue("container");
assertEquals("test.topic", jmsTemplate.getDefaultDestinationName());
assertEquals("test.topic", container.getDestinationName());
assertTrue(container.isSubscriptionShared());
assertTrue(container.isSubscriptionDurable());
assertEquals("subName", container.getSubscriptionName());
}
@Test
public void topicNameWithResolverChannel() {
assertEquals(SubscribableJmsChannel.class, topicNameWithResolverChannel.getClass());
SubscribableJmsChannel channel = (SubscribableJmsChannel) topicNameWithResolverChannel;
DirectFieldAccessor accessor = new DirectFieldAccessor(channel);
JmsTemplate jmsTemplate = (JmsTemplate) accessor.getPropertyValue("jmsTemplate");
AbstractMessageListenerContainer container = (AbstractMessageListenerContainer) accessor.getPropertyValue("container");
assertEquals("foo", jmsTemplate.getDefaultDestinationName());
assertEquals("foo", container.getDestinationName());
}
@Test
public void channelWithConcurrencySettings() {
assertEquals(SubscribableJmsChannel.class, channelWithConcurrencySettings.getClass());
SubscribableJmsChannel channel = (SubscribableJmsChannel) channelWithConcurrencySettings;
DirectFieldAccessor accessor = new DirectFieldAccessor(channel);
DefaultMessageListenerContainer container = (DefaultMessageListenerContainer) accessor.getPropertyValue("container");
assertEquals(11, container.getConcurrentConsumers());
assertEquals(55, container.getMaxConcurrentConsumers());
}
@Test
@SuppressWarnings("unchecked")
public void queueChannelWithInterceptors() {
assertEquals(SubscribableJmsChannel.class, queueChannelWithInterceptors.getClass());
SubscribableJmsChannel channel = (SubscribableJmsChannel) queueChannelWithInterceptors;
DirectFieldAccessor accessor = new DirectFieldAccessor(channel);
List<ChannelInterceptor> interceptors = (List<ChannelInterceptor>) new DirectFieldAccessor(
accessor.getPropertyValue("interceptors")).getPropertyValue("interceptors");
assertEquals(1, interceptors.size());
assertEquals(TestInterceptor.class, interceptors.get(0).getClass());
}
@Test
@SuppressWarnings("unchecked")
public void topicChannelWithInterceptors() {
assertEquals(SubscribableJmsChannel.class, topicChannelWithInterceptors.getClass());
SubscribableJmsChannel channel = (SubscribableJmsChannel) topicChannelWithInterceptors;
DirectFieldAccessor accessor = new DirectFieldAccessor(channel);
List<ChannelInterceptor> interceptors = (List<ChannelInterceptor>) new DirectFieldAccessor(
accessor.getPropertyValue("interceptors")).getPropertyValue("interceptors");
assertEquals(2, interceptors.size());
assertEquals(TestInterceptor.class, interceptors.get(0).getClass());
assertEquals(TestInterceptor.class, interceptors.get(1).getClass());
}
@Test
public void queueReferencePollableChannel() {
assertEquals(PollableJmsChannel.class, pollableQueueReferenceChannel.getClass());
PollableJmsChannel channel = (PollableJmsChannel) pollableQueueReferenceChannel;
DirectFieldAccessor accessor = new DirectFieldAccessor(channel);
JmsTemplate jmsTemplate = (JmsTemplate) accessor.getPropertyValue("jmsTemplate");
assertEquals(queue, jmsTemplate.getDefaultDestination());
}
@Test
public void queueNamePollableChannel() {
assertEquals(PollableJmsChannel.class, pollableQueueNameChannel.getClass());
PollableJmsChannel channel = (PollableJmsChannel) pollableQueueNameChannel;
DirectFieldAccessor accessor = new DirectFieldAccessor(channel);
JmsTemplate jmsTemplate = (JmsTemplate) accessor.getPropertyValue("jmsTemplate");
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);
assertEquals("queue://test.queue", container.getDestination().toString());
assertEquals(5, container.getConcurrentConsumers());
assertEquals(25, container.getMaxConcurrentConsumers());
}
@Test
public void withDefaultContainer() {
DefaultMessageListenerContainer container = TestUtils.getPropertyValue(
withDefaultContainer, "container",
DefaultMessageListenerContainer.class);
assertEquals("default.container.queue", container.getDestinationName());
}
@Test
public void withExplicitDefaultContainer() {
DefaultMessageListenerContainer container = TestUtils.getPropertyValue(
withExplicitDefaultContainer, "container",
DefaultMessageListenerContainer.class);
assertEquals("explicit.default.container.queue", container.getDestinationName());
}
@Test
public void withSimpleContainer() {
SimpleMessageListenerContainer container = TestUtils.getPropertyValue(
withSimpleContainer, "container",
SimpleMessageListenerContainer.class);
assertEquals("simple.container.queue", container.getDestinationName());
}
@Test
public void withContainerClass() {
CustomTestMessageListenerContainer container = TestUtils.getPropertyValue(
withContainerClass, "container",
CustomTestMessageListenerContainer.class);
assertEquals("custom.container.queue", container.getDestinationName());
}
@Test
public void withContainerClassSpEL() {
CustomTestMessageListenerContainer container = TestUtils.getPropertyValue(
withContainerClassSpEL, "container",
CustomTestMessageListenerContainer.class);
assertEquals("custom.container.queue", container.getDestinationName());
}
static class TestDestinationResolver implements DestinationResolver {
@Autowired
private Queue queue;
@Autowired
private Topic topic;
@Override
public Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain)
throws JMSException {
if (!"foo".equals(destinationName)) {
throw new IllegalStateException("only destination name of 'foo' is supported");
}
return pubSubDomain ? topic : queue;
}
}
static class TestInterceptor extends ChannelInterceptorAdapter {
}
static class CustomTestMessageListenerContainer extends DefaultMessageListenerContainer {
}
}