From 8adff1bd70ef185213665ed3c3b8c1d1cae66b96 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 19 Jan 2016 18:03:03 +0100 Subject: [PATCH] Support Quartz trigger without JobDetail This commit allows to create a Quartz trigger implementation via either `CronTriggerFactoryBean` or `SimpleTriggerFactoryBean` even if no job detail is provided. Issue: SPR-13604 (cherry picked from commit 2970065) --- .../quartz/CronTriggerFactoryBean.java | 20 +++++---- .../quartz/SimpleTriggerFactoryBean.java | 20 +++++---- .../quartz/CronTriggerFactoryBeanTests.java | 41 ++++++++++++++++++ .../quartz/SimpleTriggerFactoryBeanTests.java | 43 +++++++++++++++++++ 4 files changed, 108 insertions(+), 16 deletions(-) create mode 100644 spring-context-support/src/test/java/org/springframework/scheduling/quartz/CronTriggerFactoryBeanTests.java create mode 100644 spring-context-support/src/test/java/org/springframework/scheduling/quartz/SimpleTriggerFactoryBeanTests.java diff --git a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/CronTriggerFactoryBean.java b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/CronTriggerFactoryBean.java index 4eea1c5627..03fc938b3b 100644 --- a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/CronTriggerFactoryBean.java +++ b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/CronTriggerFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2016 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. @@ -245,7 +245,9 @@ public class CronTriggerFactoryBean implements FactoryBean, BeanNam CronTriggerImpl cti = new CronTriggerImpl(); cti.setName(this.name); cti.setGroup(this.group); - cti.setJobKey(this.jobDetail.getKey()); + if (this.jobDetail != null) { + cti.setJobKey(this.jobDetail.getKey()); + } cti.setJobDataMap(this.jobDataMap); cti.setStartTime(this.startTime); cti.setCronExpression(this.cronExpression); @@ -274,12 +276,14 @@ public class CronTriggerFactoryBean implements FactoryBean, BeanNam MutablePropertyValues pvs = new MutablePropertyValues(); pvs.add("name", this.name); pvs.add("group", this.group); - if (jobKeyMethod != null) { - pvs.add("jobKey", ReflectionUtils.invokeMethod(jobKeyMethod, this.jobDetail)); - } - else { - pvs.add("jobName", this.jobDetail.getName()); - pvs.add("jobGroup", this.jobDetail.getGroup()); + if (this.jobDetail != null) { + if (jobKeyMethod != null) { + pvs.add("jobKey", ReflectionUtils.invokeMethod(jobKeyMethod, this.jobDetail)); + } + else { + pvs.add("jobName", this.jobDetail.getName()); + pvs.add("jobGroup", this.jobDetail.getGroup()); + } } pvs.add("jobDataMap", this.jobDataMap); pvs.add("startTime", this.startTime); diff --git a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SimpleTriggerFactoryBean.java b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SimpleTriggerFactoryBean.java index 96a39cd8eb..15daf8ac5f 100644 --- a/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SimpleTriggerFactoryBean.java +++ b/spring-context-support/src/main/java/org/springframework/scheduling/quartz/SimpleTriggerFactoryBean.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2014 the original author or authors. + * Copyright 2002-2016 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. @@ -237,7 +237,9 @@ public class SimpleTriggerFactoryBean implements FactoryBean, Bea SimpleTriggerImpl sti = new SimpleTriggerImpl(); sti.setName(this.name); sti.setGroup(this.group); - sti.setJobKey(this.jobDetail.getKey()); + if (this.jobDetail != null) { + sti.setJobKey(this.jobDetail.getKey()); + } sti.setJobDataMap(this.jobDataMap); sti.setStartTime(this.startTime); sti.setRepeatInterval(this.repeatInterval); @@ -265,12 +267,14 @@ public class SimpleTriggerFactoryBean implements FactoryBean, Bea MutablePropertyValues pvs = new MutablePropertyValues(); pvs.add("name", this.name); pvs.add("group", this.group); - if (jobKeyMethod != null) { - pvs.add("jobKey", ReflectionUtils.invokeMethod(jobKeyMethod, this.jobDetail)); - } - else { - pvs.add("jobName", this.jobDetail.getName()); - pvs.add("jobGroup", this.jobDetail.getGroup()); + if (this.jobDetail != null) { + if (jobKeyMethod != null) { + pvs.add("jobKey", ReflectionUtils.invokeMethod(jobKeyMethod, this.jobDetail)); + } + else { + pvs.add("jobName", this.jobDetail.getName()); + pvs.add("jobGroup", this.jobDetail.getGroup()); + } } pvs.add("jobDataMap", this.jobDataMap); pvs.add("startTime", this.startTime); diff --git a/spring-context-support/src/test/java/org/springframework/scheduling/quartz/CronTriggerFactoryBeanTests.java b/spring-context-support/src/test/java/org/springframework/scheduling/quartz/CronTriggerFactoryBeanTests.java new file mode 100644 index 0000000000..5aa0142fc7 --- /dev/null +++ b/spring-context-support/src/test/java/org/springframework/scheduling/quartz/CronTriggerFactoryBeanTests.java @@ -0,0 +1,41 @@ +/* + * Copyright 2002-2016 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.scheduling.quartz; + +import java.text.ParseException; + +import org.junit.Test; +import org.quartz.CronTrigger; + +import static org.junit.Assert.*; + +/** + * @author Stephane Nicoll + */ +public class CronTriggerFactoryBeanTests { + + @Test + public void createWithoutJobDetail() throws ParseException { + CronTriggerFactoryBean factory = new CronTriggerFactoryBean(); + factory.setName("myTrigger"); + factory.setCronExpression("0 15 10 ? * *"); + factory.afterPropertiesSet(); + CronTrigger trigger = factory.getObject(); + assertEquals("0 15 10 ? * *", trigger.getCronExpression()); + } + +} diff --git a/spring-context-support/src/test/java/org/springframework/scheduling/quartz/SimpleTriggerFactoryBeanTests.java b/spring-context-support/src/test/java/org/springframework/scheduling/quartz/SimpleTriggerFactoryBeanTests.java new file mode 100644 index 0000000000..7021682b23 --- /dev/null +++ b/spring-context-support/src/test/java/org/springframework/scheduling/quartz/SimpleTriggerFactoryBeanTests.java @@ -0,0 +1,43 @@ +/* + * Copyright 2002-2016 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.scheduling.quartz; + +import java.text.ParseException; + +import org.junit.Test; +import org.quartz.SimpleTrigger; + +import static org.junit.Assert.*; + +/** + * @author Stephane Nicoll + */ +public class SimpleTriggerFactoryBeanTests { + + @Test + public void createWithoutJobDetail() throws ParseException { + SimpleTriggerFactoryBean factory = new SimpleTriggerFactoryBean(); + factory.setName("myTrigger"); + factory.setRepeatCount(5); + factory.setRepeatInterval(1000L); + factory.afterPropertiesSet(); + SimpleTrigger trigger = factory.getObject(); + assertEquals(5, trigger.getRepeatCount()); + assertEquals(1000L, trigger.getRepeatInterval()); + } + +}