Merged HEAD-BUG-FIX (Cloud33/4.3) to HEAD (Cloud33/4.3)

62935: Merged PLATFORM1 (Cloud33) to HEAD-BUG-FIX (Cloud33/4.3)
      62854: ACE-403
      Added configured delayed test
      TODO: Add property-configured startDelay


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@62990 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Alan Davis
2014-02-20 15:02:30 +00:00
parent 8d4e29a8f9
commit eaf03f462b
2 changed files with 104 additions and 27 deletions

View File

@@ -2,7 +2,7 @@ package org.alfresco.util;
import static org.junit.Assert.*; import static org.junit.Assert.*;
import java.util.ArrayList; import java.util.*;
import org.junit.After; import org.junit.After;
import org.junit.AfterClass; import org.junit.AfterClass;
@@ -22,7 +22,7 @@ public class CronTriggerBeanTest {
private ClassPathXmlApplicationContext ctx; private ClassPathXmlApplicationContext ctx;
private Scheduler scheduler; private Scheduler scheduler;
private static ArrayList<Long> dummyJobRuns; private static Map<String, ArrayList<Long>> dummyJobRuns;
@BeforeClass @BeforeClass
public static void setUpBeforeClass() throws Exception { public static void setUpBeforeClass() throws Exception {
@@ -34,7 +34,7 @@ public class CronTriggerBeanTest {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
dummyJobRuns = new ArrayList<>(); dummyJobRuns = new HashMap<String, ArrayList<Long>>();
this.ctx = null; this.ctx = null;
this.scheduler = null; this.scheduler = null;
} }
@@ -56,39 +56,43 @@ public class CronTriggerBeanTest {
@Test @Test
public void testCodedCronTriggerBean() throws Exception { public void testCodedCronTriggerBean() throws Exception {
assertEquals(0, dummyJobRuns.size()); final String JOB_NAME = "codedCronJob";
List<Long> jobRuns = this.getRunList(JOB_NAME);
assertEquals(0, jobRuns.size());
scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start(); scheduler.start();
CronTriggerBean ctBean = new CronTriggerBean(); CronTriggerBean ctBean = new CronTriggerBean();
ctBean.setBeanName("Dummy"); ctBean.setBeanName("Dummy");
ctBean.setCronExpression("0/1 * * * * ? *"); ctBean.setCronExpression("0/1 * * * * ? *");
ctBean.setEnabled(true); ctBean.setEnabled(true);
JobDetail jobDetail = new JobDetail("DummyJob", "DefaultGroup", DummyJob.class); JobDetail jobDetail = new JobDetail(JOB_NAME, "DefaultGroup", DummyJob.class);
ctBean.setJobDetail(jobDetail); ctBean.setJobDetail(jobDetail);
ctBean.setScheduler(scheduler); ctBean.setScheduler(scheduler);
ctBean.afterPropertiesSet(); ctBean.afterPropertiesSet();
Thread.sleep(1000); Thread.sleep(1000);
int runs = dummyJobRuns.size(); int runs = jobRuns.size();
assertTrue(runs > 0); assertTrue(runs > 0);
scheduler.shutdown(); scheduler.shutdown();
Thread.sleep(1000); Thread.sleep(1000);
assertEquals(runs, dummyJobRuns.size()); assertEquals(runs, jobRuns.size());
Thread.sleep(1000); Thread.sleep(1000);
assertEquals(runs, dummyJobRuns.size()); assertEquals(runs, jobRuns.size());
} }
@Test @Test
public void testCodedDelayedCronTriggerBean() throws Exception { public void testCodedDelayedCronTriggerBean() throws Exception {
assertEquals(0, dummyJobRuns.size()); final String JOB_NAME = "codedDelayedCronJob";
List<Long> jobRuns = this.getRunList(JOB_NAME);
assertEquals(0, jobRuns.size());
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start(); scheduler.start();
CronTriggerBean ctBean = new CronTriggerBean(); CronTriggerBean ctBean = new CronTriggerBean();
ctBean.setBeanName("Dummy"); ctBean.setBeanName("Dummy");
ctBean.setCronExpression("0/1 * * * * ? *"); ctBean.setCronExpression("0/1 * * * * ? *");
ctBean.setEnabled(true); ctBean.setEnabled(true);
JobDetail jobDetail = new JobDetail("DummyJob", "DefaultGroup", DummyJob.class); JobDetail jobDetail = new JobDetail(JOB_NAME, "DefaultGroup", DummyJob.class);
ctBean.setJobDetail(jobDetail); ctBean.setJobDetail(jobDetail);
ctBean.setScheduler(scheduler); ctBean.setScheduler(scheduler);
final long START_DELAY = 4000L; final long START_DELAY = 4000L;
@@ -97,49 +101,95 @@ public class CronTriggerBeanTest {
// It should not have run during the delay. Give a second precision leeway // It should not have run during the delay. Give a second precision leeway
Thread.sleep(START_DELAY - 1000); Thread.sleep(START_DELAY - 1000);
assertEquals(0, dummyJobRuns.size()); assertEquals(0, jobRuns.size());
// It should have had a chance to run after the delay // It should have had a chance to run after the delay
Thread.sleep(1000); Thread.sleep(1000);
int runs = dummyJobRuns.size(); int runs = jobRuns.size();
assertTrue(runs > 0); assertTrue(runs > 0);
// It should not have run again after shutdown // It should not have run again after shutdown
scheduler.shutdown(); scheduler.shutdown();
Thread.sleep(1000); Thread.sleep(1000);
assertEquals(runs, dummyJobRuns.size()); assertEquals(runs, jobRuns.size());
// Indeed after another second, it should not have changed. // Indeed after another second, it should not have changed.
Thread.sleep(1000); Thread.sleep(1000);
assertEquals(runs, dummyJobRuns.size()); assertEquals(runs, jobRuns.size());
} }
@Test @Test
public void testConfiguredCronTriggerBean() throws BeansException, public void testConfiguredDelayedCronTriggerBean() throws BeansException, Exception {
Exception { final String JOB_NAME = "configuredDelayedCronJob";
assertEquals(0, dummyJobRuns.size()); List<Long> jobRuns = this.getRunList(JOB_NAME);
assertEquals(0, jobRuns.size());
ctx = new ClassPathXmlApplicationContext( ctx = new ClassPathXmlApplicationContext(
"alfresco/scheduler-core-context.xml", "alfresco/scheduler-core-context.xml",
"org/alfresco/util/test-scheduled-jobs-context.xml"); "org/alfresco/util/test-scheduled-jobs-context.xml");
CronTriggerBean ctBean = ctx.getBean(CronTriggerBean.class); CronTriggerBean ctBean = ctx.getBean("cronTriggerBeanDelayed", CronTriggerBean.class);
scheduler = ctBean.getScheduler(); scheduler = ctBean.getScheduler();
scheduler.start(); scheduler.start();
// It should not have run during the delay. Give a second precision leeway
final long START_DELAY = ctBean.getStartDelay();
Thread.sleep(START_DELAY - 1000);
assertEquals(0, jobRuns.size());
// After the interval, there should be at least one run // After the interval, there should be at least one run
final long INTERVAL = 2000L; final long INTERVAL = 1000L;
Thread.sleep(INTERVAL); Thread.sleep(INTERVAL);
int runs = dummyJobRuns.size(); int runs = jobRuns.size();
assertTrue(runs > 0); assertTrue(runs > 0);
// When the context closes, the scheduler should close, thereby stopping the job // When the context closes, the scheduler should close, thereby stopping the job
ctx.close(); ctx.close();
Thread.sleep(INTERVAL); Thread.sleep(INTERVAL);
assertEquals(runs, dummyJobRuns.size()); assertEquals(runs, jobRuns.size());
Thread.sleep(INTERVAL); Thread.sleep(INTERVAL);
assertEquals(runs, dummyJobRuns.size()); assertEquals(runs, jobRuns.size());
}
@Test
public void testConfiguredCronTriggerBean() throws BeansException, Exception {
final String JOB_NAME = "configuredCronJob";
List<Long> jobRuns = this.getRunList(JOB_NAME);
assertEquals(0, jobRuns.size());
ctx = new ClassPathXmlApplicationContext(
"alfresco/scheduler-core-context.xml",
"org/alfresco/util/test-scheduled-jobs-context.xml");
CronTriggerBean ctBean = ctx.getBean("cronTriggerBean", CronTriggerBean.class);
scheduler = ctBean.getScheduler();
scheduler.start();
// After the interval, there should be at least one run
final long INTERVAL = 1000L;
Thread.sleep(INTERVAL);
int runs = jobRuns.size();
assertTrue(runs > 0);
// When the context closes, the scheduler should close, thereby stopping the job
ctx.close();
Thread.sleep(INTERVAL);
assertEquals(runs, jobRuns.size());
Thread.sleep(INTERVAL);
assertEquals(runs, jobRuns.size());
} }
public static class DummyJob implements Job { public static class DummyJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException { public void execute(JobExecutionContext context) throws JobExecutionException {
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
dummyJobRuns.add(now); ArrayList<Long> runs = dummyJobRuns.get(context.getJobDetail().getName());
if (runs == null) {
runs = new ArrayList<Long>();
dummyJobRuns.put(context.getJobDetail().getName(), runs);
}
runs.add(now);
} }
} }
private List<Long> getRunList(String jobName) {
ArrayList<Long> runs = dummyJobRuns.get(jobName);
if (runs == null) {
runs = new ArrayList<Long>();
dummyJobRuns.put(jobName, runs);
}
return runs;
}
} }

View File

@@ -3,13 +3,21 @@
<beans> <beans>
<bean id="dummyJobTestDelayed" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>org.alfresco.util.CronTriggerBeanTest$DummyJob</value>
</property>
<property name="name">
<value>configuredDelayedCronJob</value>
</property>
</bean>
<bean id="dummyJobTest" class="org.springframework.scheduling.quartz.JobDetailBean"> <bean id="dummyJobTest" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass"> <property name="jobClass">
<value>org.alfresco.util.CronTriggerBeanTest$DummyJob</value> <value>org.alfresco.util.CronTriggerBeanTest$DummyJob</value>
</property> </property>
<property name="name"> <property name="name">
<value>dummy</value> <value>configuredCronJob</value>
</property> </property>
</bean> </bean>
@@ -45,12 +53,31 @@
</property> </property>
<!-- trigger at 3am each day --> <!-- trigger at 3am each day -->
<property name="cronExpression"> <property name="cronExpression">
<value>0/2 * * * * ?</value> <value>0/1 * * * * ?</value>
</property> </property>
<property name="beanName"> <property name="beanName">
<value>dummyTriggerBean</value> <value>dummyTriggerBean</value>
</property> </property>
</bean> </bean>
</beans> <bean id="cronTriggerBeanDelayed" class="org.alfresco.util.CronTriggerBean">
<property name="jobDetail">
<ref bean="dummyJobTestDelayed" />
</property>
<property name="scheduler">
<ref bean="schedulerFactory" />
</property>
<!-- trigger at 3am each day -->
<property name="cronExpression">
<value>0/1 * * * * ?</value>
</property>
<property name="beanName">
<value>dummyTriggerBeanDelayed</value>
</property>
<property name="startDelay">
<value>4000</value>
</property>
</bean>
</beans>