INT-1494 first step: scheduled-producer now creates an instance of SourcePollingChannelAdapter

This commit is contained in:
Mark Fisher
2010-10-17 10:35:30 -04:00
parent 4db40c79b1
commit bf9c8a15f0
10 changed files with 294 additions and 227 deletions

View File

@@ -19,18 +19,27 @@
<queue/>
</channel>
<scheduled-producer id="fixedDelayProducer" fixed-delay="1234" payload-expression="'fixedDelayTest'" channel="fixedDelayChannel" auto-startup="false"/>
<scheduled-producer id="fixedDelayProducer" payload-expression="'fixedDelayTest'" channel="fixedDelayChannel" auto-startup="false">
<poller fixed-delay="1234"/>
</scheduled-producer>
<scheduled-producer id="fixedRateProducer" fixed-rate="5678" payload-expression="'fixedRateTest'" channel="fixedRateChannel" auto-startup="false"/>
<scheduled-producer id="fixedRateProducer" payload-expression="'fixedRateTest'" channel="fixedRateChannel" auto-startup="false">
<poller fixed-rate="5678"/>
</scheduled-producer>
<scheduled-producer id="cronProducer" cron="7 6 5 4 3 ?" payload-expression="'cronTest'" channel="cronChannel" auto-startup="false"/>
<scheduled-producer id="cronProducer" payload-expression="'cronTest'" channel="cronChannel" auto-startup="false">
<poller cron="7 6 5 4 3 ?"/>
</scheduled-producer>
<scheduled-producer id="headerExpressionsProducer" fixed-delay="99" payload-expression="'headerExpressionsTest'" channel="headerExpressionsChannel" auto-startup="false">
<scheduled-producer id="headerExpressionsProducer" payload-expression="'headerExpressionsTest'" channel="headerExpressionsChannel" auto-startup="false">
<poller fixed-delay="99"/>
<header name="foo" expression="6 * 7"/>
<header name="bar" value="x"/>
</scheduled-producer>
<scheduled-producer id="triggerRefProducer" trigger="customTrigger" payload-expression="'triggerRefTest'" channel="triggerRefChannel"/>
<scheduled-producer id="triggerRefProducer" payload-expression="'triggerRefTest'" channel="triggerRefChannel">
<poller trigger="customTrigger"/>
</scheduled-producer>
<beans:bean id="customTrigger" class="org.springframework.scheduling.support.PeriodicTrigger">
<beans:constructor-arg value="9999"/>

View File

@@ -24,12 +24,12 @@ import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.DirectFieldAccessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.expression.Expression;
import org.springframework.integration.endpoint.ScheduledMessageProducer;
import org.springframework.integration.endpoint.SourcePollingChannelAdapter;
import org.springframework.integration.test.util.TestUtils;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.scheduling.support.PeriodicTrigger;
@@ -50,71 +50,66 @@ public class ScheduledProducerParserTests {
@Test
public void fixedDelay() {
ScheduledMessageProducer producer = context.getBean("fixedDelayProducer", ScheduledMessageProducer.class);
assertFalse(producer.isAutoStartup());
DirectFieldAccessor producerAccessor = new DirectFieldAccessor(producer);
Trigger trigger = (Trigger) producerAccessor.getPropertyValue("trigger");
SourcePollingChannelAdapter adapter = context.getBean("fixedDelayProducer", SourcePollingChannelAdapter.class);
assertFalse(adapter.isAutoStartup());
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
Trigger trigger = TestUtils.getPropertyValue(adapter, "pollerMetadata.trigger", Trigger.class);
assertEquals(PeriodicTrigger.class, trigger.getClass());
DirectFieldAccessor triggerAccessor = new DirectFieldAccessor(trigger);
assertEquals(1234L, triggerAccessor.getPropertyValue("period"));
assertEquals(Boolean.FALSE, triggerAccessor.getPropertyValue("fixedRate"));
assertEquals(context.getBean("fixedDelayChannel"), producerAccessor.getPropertyValue("outputChannel"));
Expression payloadExpression = (Expression) new DirectFieldAccessor(
producerAccessor.getPropertyValue("task")).getPropertyValue("payloadExpression");
assertEquals("'fixedDelayTest'", payloadExpression.getExpressionString());
assertEquals(context.getBean("fixedDelayChannel"), adapterAccessor.getPropertyValue("outputChannel"));
Expression expression = TestUtils.getPropertyValue(adapter, "source.expression", Expression.class);
assertEquals("'fixedDelayTest'", expression.getExpressionString());
}
@Test
public void fixedRate() {
ScheduledMessageProducer producer = context.getBean("fixedRateProducer", ScheduledMessageProducer.class);
assertFalse(producer.isAutoStartup());
DirectFieldAccessor producerAccessor = new DirectFieldAccessor(producer);
Trigger trigger = (Trigger) producerAccessor.getPropertyValue("trigger");
SourcePollingChannelAdapter adapter = context.getBean("fixedRateProducer", SourcePollingChannelAdapter.class);
assertFalse(adapter.isAutoStartup());
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
Trigger trigger = TestUtils.getPropertyValue(adapter, "pollerMetadata.trigger", Trigger.class);
assertEquals(PeriodicTrigger.class, trigger.getClass());
DirectFieldAccessor triggerAccessor = new DirectFieldAccessor(trigger);
assertEquals(5678L, triggerAccessor.getPropertyValue("period"));
assertEquals(Boolean.TRUE, triggerAccessor.getPropertyValue("fixedRate"));
assertEquals(context.getBean("fixedRateChannel"), producerAccessor.getPropertyValue("outputChannel"));
Expression payloadExpression = (Expression) new DirectFieldAccessor(
producerAccessor.getPropertyValue("task")).getPropertyValue("payloadExpression");
assertEquals("'fixedRateTest'", payloadExpression.getExpressionString());
assertEquals(context.getBean("fixedRateChannel"), adapterAccessor.getPropertyValue("outputChannel"));
Expression expression = TestUtils.getPropertyValue(adapter, "source.expression", Expression.class);
assertEquals("'fixedRateTest'", expression.getExpressionString());
}
@Test
public void cron() {
ScheduledMessageProducer producer = context.getBean("cronProducer", ScheduledMessageProducer.class);
assertFalse(producer.isAutoStartup());
DirectFieldAccessor producerAccessor = new DirectFieldAccessor(producer);
Trigger trigger = (Trigger) producerAccessor.getPropertyValue("trigger");
SourcePollingChannelAdapter adapter = context.getBean("cronProducer", SourcePollingChannelAdapter.class);
assertFalse(adapter.isAutoStartup());
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
Trigger trigger = TestUtils.getPropertyValue(adapter, "pollerMetadata.trigger", Trigger.class);
assertEquals(CronTrigger.class, trigger.getClass());
assertEquals("7 6 5 4 3 ?", new DirectFieldAccessor(new DirectFieldAccessor(
trigger).getPropertyValue("sequenceGenerator")).getPropertyValue("expression"));
assertEquals(context.getBean("cronChannel"), producerAccessor.getPropertyValue("outputChannel"));
Expression payloadExpression = (Expression) new DirectFieldAccessor(
producerAccessor.getPropertyValue("task")).getPropertyValue("payloadExpression");
assertEquals("'cronTest'", payloadExpression.getExpressionString());
assertEquals(context.getBean("cronChannel"), adapterAccessor.getPropertyValue("outputChannel"));
Expression expression = TestUtils.getPropertyValue(adapter, "source.expression", Expression.class);
assertEquals("'cronTest'", expression.getExpressionString());
}
@Test
public void triggerRef() {
ScheduledMessageProducer producer = context.getBean("triggerRefProducer", ScheduledMessageProducer.class);
assertTrue(producer.isAutoStartup());
DirectFieldAccessor producerAccessor = new DirectFieldAccessor(producer);
Trigger trigger = (Trigger) producerAccessor.getPropertyValue("trigger");
SourcePollingChannelAdapter adapter = context.getBean("triggerRefProducer", SourcePollingChannelAdapter.class);
assertTrue(adapter.isAutoStartup());
DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
Trigger trigger = TestUtils.getPropertyValue(adapter, "pollerMetadata.trigger", Trigger.class);
assertEquals(context.getBean("customTrigger"), trigger);
assertEquals(context.getBean("triggerRefChannel"), producerAccessor.getPropertyValue("outputChannel"));
Expression payloadExpression = (Expression) new DirectFieldAccessor(
producerAccessor.getPropertyValue("task")).getPropertyValue("payloadExpression");
assertEquals("'triggerRefTest'", payloadExpression.getExpressionString());
assertEquals(context.getBean("triggerRefChannel"), adapterAccessor.getPropertyValue("outputChannel"));
Expression expression = TestUtils.getPropertyValue(adapter, "source.expression", Expression.class);
assertEquals("'triggerRefTest'", expression.getExpressionString());
}
@Test
@SuppressWarnings("unchecked")
public void headerExpressions() {
ScheduledMessageProducer producer = context.getBean("headerExpressionsProducer", ScheduledMessageProducer.class);
assertFalse(producer.isAutoStartup());
DirectFieldAccessor producerAccessor = new DirectFieldAccessor(producer);
Map<String, Expression> headerExpressions = (Map<String, Expression>) producerAccessor.getPropertyValue("headerExpressions");
SourcePollingChannelAdapter adapter = context.getBean("headerExpressionsProducer", SourcePollingChannelAdapter.class);
assertFalse(adapter.isAutoStartup());
Map<String, Expression> headerExpressions = TestUtils.getPropertyValue(adapter, "source.headerExpressions", Map.class);
assertEquals(2, headerExpressions.size());
assertEquals("6 * 7", headerExpressions.get("foo").getExpressionString());
assertEquals("x", headerExpressions.get("bar").getExpressionString());

View File

@@ -25,21 +25,22 @@ import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Test;
import org.springframework.expression.Expression;
import org.springframework.expression.common.LiteralExpression;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.integration.Message;
import org.springframework.integration.channel.QueueChannel;
import org.springframework.scheduling.Trigger;
import org.springframework.integration.config.ExpressionFactoryBean;
import org.springframework.integration.scheduling.PollerMetadata;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.PeriodicTrigger;
import org.springframework.util.ErrorHandler;
/**
* @author Mark Fisher
* @since 2.0
*/
public class ScheduledMessageProducerTests {
public class ExpressionEvaluatingMessageSourceIntegrationTests {
private static final AtomicInteger counter = new AtomicInteger();
@@ -47,18 +48,31 @@ public class ScheduledMessageProducerTests {
@Test
public void test() throws Exception {
QueueChannel channel = new QueueChannel();
Trigger trigger = new PeriodicTrigger(100);
String payloadExpression = "'test-' + T(org.springframework.integration.endpoint.ScheduledMessageProducerTests).next()";
String payloadExpression = "'test-' + T(org.springframework.integration.endpoint.ExpressionEvaluatingMessageSourceIntegrationTests).next()";
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.afterPropertiesSet();
Map<String, Expression> headerExpressions = new HashMap<String, Expression>();
headerExpressions.put("foo", new LiteralExpression("x"));
headerExpressions.put("bar", new SpelExpressionParser().parseExpression("7 * 6"));
ScheduledMessageProducer producer = new ScheduledMessageProducer(trigger, payloadExpression);
producer.setHeaderExpressions(headerExpressions);
producer.setTaskScheduler(scheduler);
producer.setOutputChannel(channel);
producer.start();
ExpressionFactoryBean factoryBean = new ExpressionFactoryBean(payloadExpression);
factoryBean.afterPropertiesSet();
Expression expression = factoryBean.getObject();
ExpressionEvaluatingMessageSource<Object> source = new ExpressionEvaluatingMessageSource<Object>(expression, Object.class);
source.setHeaderExpressions(headerExpressions);
SourcePollingChannelAdapter adapter = new SourcePollingChannelAdapter();
adapter.setSource(source);
adapter.setTaskScheduler(scheduler);
PollerMetadata pollerMetadata = new PollerMetadata();
pollerMetadata.setMaxMessagesPerPoll(3);
pollerMetadata.setTrigger(new PeriodicTrigger(60000));
adapter.setPollerMetadata(pollerMetadata);
adapter.setOutputChannel(channel);
adapter.setErrorHandler(new ErrorHandler() {
public void handleError(Throwable t) {
throw new IllegalStateException("unexpected exception in test", t);
}
});
adapter.start();
List<Message<?>> messages = new ArrayList<Message<?>>();
for (int i = 0; i < 3; i++) {
messages.add(channel.receive(1000));

View File

@@ -0,0 +1,57 @@
/*
* Copyright 2002-2010 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.endpoint;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import org.junit.Test;
import org.springframework.core.convert.ConversionFailedException;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.common.LiteralExpression;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.integration.Message;
/**
* @author Mark Fisher
* @since 2.0
*/
public class ExpressionEvaluatingMessageSourceTests {
private static final ExpressionParser parser = new SpelExpressionParser();
@Test
public void literalExpression() {
Expression expression = new LiteralExpression("foo");
ExpressionEvaluatingMessageSource<String> source =
new ExpressionEvaluatingMessageSource<String>(expression, String.class);
Message<?> message = source.receive();
assertNotNull(message);
assertEquals("foo", message.getPayload());
}
@Test(expected = ConversionFailedException.class)
public void unexpectedType() {
Expression expression = new LiteralExpression("foo");
ExpressionEvaluatingMessageSource<Integer> source =
new ExpressionEvaluatingMessageSource<Integer>(expression, Integer.class);
source.receive();
}
}