@ -34,11 +34,15 @@ import org.junit.After;
@@ -34,11 +34,15 @@ import org.junit.After;
import org.junit.Test ;
import org.springframework.aop.framework.ProxyFactory ;
import org.springframework.aop.scope.ScopedProxyUtils ;
import org.springframework.beans.DirectFieldAccessor ;
import org.springframework.beans.factory.BeanCreationException ;
import org.springframework.beans.factory.config.BeanDefinition ;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer ;
import org.springframework.beans.factory.support.RootBeanDefinition ;
import org.springframework.context.annotation.AnnotatedBeanDefinitionReader ;
import org.springframework.context.annotation.Scope ;
import org.springframework.context.annotation.ScopedProxyMode ;
import org.springframework.context.support.StaticApplicationContext ;
import org.springframework.core.annotation.AliasFor ;
import org.springframework.scheduling.Trigger ;
@ -49,8 +53,7 @@ import org.springframework.scheduling.config.ScheduledTaskRegistrar;
@@ -49,8 +53,7 @@ import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger ;
import org.springframework.scheduling.support.ScheduledMethodRunnable ;
import org.springframework.scheduling.support.SimpleTriggerContext ;
import org.springframework.tests.Assume ;
import org.springframework.tests.TestGroup ;
import org.springframework.stereotype.Component ;
import org.springframework.validation.annotation.Validated ;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor ;
@ -222,9 +225,7 @@ public class ScheduledAnnotationBeanPostProcessorTests {
@@ -222,9 +225,7 @@ public class ScheduledAnnotationBeanPostProcessorTests {
}
@Test
public void cronTask ( ) throws InterruptedException {
Assume . group ( TestGroup . LONG_RUNNING ) ;
public void cronTask ( ) {
BeanDefinition processorDefinition = new RootBeanDefinition ( ScheduledAnnotationBeanPostProcessor . class ) ;
BeanDefinition targetDefinition = new RootBeanDefinition ( CronTestBean . class ) ;
context . registerBeanDefinition ( "postProcessor" , processorDefinition ) ;
@ -246,13 +247,10 @@ public class ScheduledAnnotationBeanPostProcessorTests {
@@ -246,13 +247,10 @@ public class ScheduledAnnotationBeanPostProcessorTests {
assertEquals ( target , targetObject ) ;
assertEquals ( "cron" , targetMethod . getName ( ) ) ;
assertEquals ( "*/7 * * * * ?" , task . getExpression ( ) ) ;
Thread . sleep ( 10000 ) ;
}
@Test
public void cronTaskWithZone ( ) throws InterruptedException {
Assume . group ( TestGroup . LONG_RUNNING ) ;
public void cronTaskWithZone ( ) {
BeanDefinition processorDefinition = new RootBeanDefinition ( ScheduledAnnotationBeanPostProcessor . class ) ;
BeanDefinition targetDefinition = new RootBeanDefinition ( CronWithTimezoneTestBean . class ) ;
context . registerBeanDefinition ( "postProcessor" , processorDefinition ) ;
@ -280,34 +278,30 @@ public class ScheduledAnnotationBeanPostProcessorTests {
@@ -280,34 +278,30 @@ public class ScheduledAnnotationBeanPostProcessorTests {
CronTrigger cronTrigger = ( CronTrigger ) trigger ;
Calendar cal = Calendar . getInstance ( TimeZone . getTimeZone ( "GMT+10" ) ) ;
cal . clear ( ) ;
cal . set ( 2013 , 3 , 15 , 4 , 0 ) ; // 15-04-2013 4:00 GMT+10
cal . set ( 2013 , 3 , 15 , 4 , 0 ) ; // 15-04-2013 4:00 GMT+10
Date lastScheduledExecutionTime = cal . getTime ( ) ;
Date lastActualExecutionTime = cal . getTime ( ) ;
cal . add ( Calendar . MINUTE , 30 ) ; // 4:30
cal . add ( Calendar . MINUTE , 30 ) ; // 4:30
Date lastCompletionTime = cal . getTime ( ) ;
TriggerContext triggerContext = new SimpleTriggerContext (
lastScheduledExecutionTime , lastActualExecutionTime , lastCompletionTime ) ;
cal . add ( Calendar . MINUTE , 30 ) ;
cal . add ( Calendar . HOUR_OF_DAY , 1 ) ; // 6:00
cal . add ( Calendar . HOUR_OF_DAY , 1 ) ; // 6:00
Date nextExecutionTime = cronTrigger . nextExecutionTime ( triggerContext ) ;
assertEquals ( cal . getTime ( ) , nextExecutionTime ) ; // assert that 6:00 is next execution time
Thread . sleep ( 10000 ) ;
assertEquals ( cal . getTime ( ) , nextExecutionTime ) ; // assert that 6:00 is next execution time
}
@Test ( expected = BeanCreationException . class )
public void cronTaskWithInvalidZone ( ) throws InterruptedException {
Assume . group ( TestGroup . LONG_RUNNING ) ;
public void cronTaskWithInvalidZone ( ) {
BeanDefinition processorDefinition = new RootBeanDefinition ( ScheduledAnnotationBeanPostProcessor . class ) ;
BeanDefinition targetDefinition = new RootBeanDefinition ( CronWithInvalidTimezoneTestBean . class ) ;
context . registerBeanDefinition ( "postProcessor" , processorDefinition ) ;
context . registerBeanDefinition ( "target" , targetDefinition ) ;
context . refresh ( ) ;
Thread . sleep ( 10000 ) ;
}
@Test ( expected = BeanCreationException . class )
public void cronTaskWithMethodValidation ( ) throws InterruptedException {
public void cronTaskWithMethodValidation ( ) {
BeanDefinition validationDefinition = new RootBeanDefinition ( MethodValidationPostProcessor . class ) ;
BeanDefinition processorDefinition = new RootBeanDefinition ( ScheduledAnnotationBeanPostProcessor . class ) ;
BeanDefinition targetDefinition = new RootBeanDefinition ( CronTestBean . class ) ;
@ -317,6 +311,29 @@ public class ScheduledAnnotationBeanPostProcessorTests {
@@ -317,6 +311,29 @@ public class ScheduledAnnotationBeanPostProcessorTests {
context . refresh ( ) ;
}
@Test
public void cronTaskWithScopedProxy ( ) {
BeanDefinition processorDefinition = new RootBeanDefinition ( ScheduledAnnotationBeanPostProcessor . class ) ;
context . registerBeanDefinition ( "postProcessor" , processorDefinition ) ;
new AnnotatedBeanDefinitionReader ( context ) . register ( ProxiedCronTestBean . class , ProxiedCronTestBeanDependent . class ) ;
context . refresh ( ) ;
Object postProcessor = context . getBean ( "postProcessor" ) ;
ScheduledTaskRegistrar registrar = ( ScheduledTaskRegistrar )
new DirectFieldAccessor ( postProcessor ) . getPropertyValue ( "registrar" ) ;
@SuppressWarnings ( "unchecked" )
List < CronTask > cronTasks = ( List < CronTask > )
new DirectFieldAccessor ( registrar ) . getPropertyValue ( "cronTasks" ) ;
assertEquals ( 1 , cronTasks . size ( ) ) ;
CronTask task = cronTasks . get ( 0 ) ;
ScheduledMethodRunnable runnable = ( ScheduledMethodRunnable ) task . getRunnable ( ) ;
Object targetObject = runnable . getTarget ( ) ;
Method targetMethod = runnable . getMethod ( ) ;
assertEquals ( context . getBean ( ScopedProxyUtils . getTargetBeanName ( "target" ) ) , targetObject ) ;
assertEquals ( "cron" , targetMethod . getName ( ) ) ;
assertEquals ( "*/7 * * * * ?" , task . getExpression ( ) ) ;
}
@Test
public void metaAnnotationWithFixedRate ( ) {
BeanDefinition processorDefinition = new RootBeanDefinition ( ScheduledAnnotationBeanPostProcessor . class ) ;
@ -352,11 +369,11 @@ public class ScheduledAnnotationBeanPostProcessorTests {
@@ -352,11 +369,11 @@ public class ScheduledAnnotationBeanPostProcessorTests {
Object postProcessor = context . getBean ( "postProcessor" ) ;
Object target = context . getBean ( "target" ) ;
ScheduledTaskRegistrar registrar = ( ScheduledTaskRegistrar ) new DirectFieldAccessor (
postProcessor ) . getPropertyValue ( "registrar" ) ;
ScheduledTaskRegistrar registrar = ( ScheduledTaskRegistrar )
new DirectFieldAccessor ( postProcessor ) . getPropertyValue ( "registrar" ) ;
@SuppressWarnings ( "unchecked" )
List < IntervalTask > fixedRateTasks = ( List < IntervalTask > ) new DirectFieldAccessor ( registrar ) . getPropertyValue (
"fixedRateTasks" ) ;
List < IntervalTask > fixedRateTasks = ( List < IntervalTask > )
new DirectFieldAccessor ( registrar ) . getPropertyValue ( "fixedRateTasks" ) ;
assertEquals ( 1 , fixedRateTasks . size ( ) ) ;
IntervalTask task = fixedRateTasks . get ( 0 ) ;
ScheduledMethodRunnable runnable = ( ScheduledMethodRunnable ) task . getRunnable ( ) ;
@ -627,8 +644,7 @@ public class ScheduledAnnotationBeanPostProcessorTests {
@@ -627,8 +644,7 @@ public class ScheduledAnnotationBeanPostProcessorTests {
static class SeveralFixedRatesWithSchedulesContainerAnnotationTestBean {
@Schedules ( { @Scheduled ( fixedRate = 4000 ) ,
@Scheduled ( fixedRate = 4000 , initialDelay = 2000 ) } )
@Schedules ( { @Scheduled ( fixedRate = 4000 ) , @Scheduled ( fixedRate = 4000 , initialDelay = 2000 ) } )
public void fixedRate ( ) {
}
}
@ -705,6 +721,24 @@ public class ScheduledAnnotationBeanPostProcessorTests {
@@ -705,6 +721,24 @@ public class ScheduledAnnotationBeanPostProcessorTests {
}
@Component ( "target" )
@Scope ( proxyMode = ScopedProxyMode . TARGET_CLASS )
static class ProxiedCronTestBean {
@Scheduled ( cron = "*/7 * * * * ?" )
public void cron ( ) throws IOException {
throw new IOException ( "no no no" ) ;
}
}
static class ProxiedCronTestBeanDependent {
public ProxiedCronTestBeanDependent ( ProxiedCronTestBean testBean ) {
}
}
static class NonVoidReturnTypeTestBean {
@Scheduled ( cron = "0 0 9-17 * * MON-FRI" )
@ -785,6 +819,7 @@ public class ScheduledAnnotationBeanPostProcessorTests {
@@ -785,6 +819,7 @@ public class ScheduledAnnotationBeanPostProcessorTests {
}
}
static class PropertyPlaceholderWithCronTestBean {
@Scheduled ( cron = "${schedules.businessHours}" )