INT-1494 first step: scheduled-producer now creates an instance of SourcePollingChannelAdapter
This commit is contained in:
@@ -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"/>
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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));
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user