diff --git a/spring-batch-samples/.settings/quartzLauncher.launch b/spring-batch-samples/.settings/quartzLauncher.launch new file mode 100644 index 000000000..6be8e0ffb --- /dev/null +++ b/spring-batch-samples/.settings/quartzLauncher.launch @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/launch/QuartzBatchLauncher.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/launch/QuartzBatchLauncher.java deleted file mode 100644 index 7b3ecfa20..000000000 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/launch/QuartzBatchLauncher.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2006-2007 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.batch.sample.launch; - -import java.io.IOException; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.context.support.ClassPathXmlApplicationContext; - - -public class QuartzBatchLauncher { - private static Log log = LogFactory.getLog(QuartzBatchLauncher.class); - - public static void main(String[] args) throws IOException { - if (args[0] == null) { - log.error("Missing argument: provide a path to configuration file"); - System.exit(-1); - } - - new ClassPathXmlApplicationContext(args[0] + ".xml"); - - log.info("Quartz context initialized"); - } -} diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/quartz/JobLauncherDetails.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/quartz/JobLauncherDetails.java new file mode 100644 index 000000000..93614ab42 --- /dev/null +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/quartz/JobLauncherDetails.java @@ -0,0 +1,74 @@ +/* + * Copyright 2006-2007 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.batch.sample.quartz; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.quartz.JobExecutionContext; +import org.springframework.batch.core.configuration.JobLocator; +import org.springframework.batch.core.domain.JobParameters; +import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException; +import org.springframework.batch.core.repository.JobRestartException; +import org.springframework.batch.core.repository.NoSuchJobException; +import org.springframework.batch.execution.launch.JobLauncher; +import org.springframework.scheduling.quartz.QuartzJobBean; + +/** + * @author Dave Syer + * + */ +public class JobLauncherDetails extends QuartzJobBean { + + private static Log log = LogFactory.getLog(JobLauncherDetails.class); + + private JobLocator jobLocator; + + private JobLauncher jobLauncher; + + /** + * Public setter for the {@link JobLocator}. + * @param jobLocator the {@link JobLocator} to set + */ + public void setJobLocator(JobLocator jobLocator) { + this.jobLocator = jobLocator; + } + + /** + * Public setter for the {@link JobLauncher}. + * @param jobLauncher the {@link JobLauncher} to set + */ + public void setJobLauncher(JobLauncher jobLauncher) { + this.jobLauncher = jobLauncher; + } + + protected void executeInternal(JobExecutionContext context) { + String jobName = (String) context.getJobDetail().getJobDataMap().get("jobName"); + JobParameters jobParameters = new JobParameters(); + try { + jobLauncher.run(jobLocator.getJob(jobName), jobParameters); + } + catch (JobExecutionAlreadyRunningException e) { + log.error("Could not execute job.", e); + } + catch (JobRestartException e) { + log.error("Could not execute job.", e); + } + catch (NoSuchJobException e) { + log.error("Could not execute job.", e); + } + } + +} diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/quartz/QuartzBatchLauncher.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/quartz/QuartzBatchLauncher.java new file mode 100644 index 000000000..6c3e9a481 --- /dev/null +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/quartz/QuartzBatchLauncher.java @@ -0,0 +1,106 @@ +/* + * Copyright 2006-2007 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.batch.sample.quartz; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.batch.core.configuration.JobRegistry; +import org.springframework.batch.core.domain.Job; +import org.springframework.batch.core.repository.DuplicateJobException; +import org.springframework.batch.sample.ClassPathXmlApplicationContextJobFactory; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.xml.XmlBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.core.io.ResourceLoader; + +public class QuartzBatchLauncher { + + private static Log log = LogFactory.getLog(QuartzBatchLauncher.class); + + private JobRegistry registry; + + private ResourceLoader resourceLoader; + + private ApplicationContext parentContext = null; + + /** + * Public setter for the {@link JobRegistry}. + * @param registry the registry to set + */ + public void setRegistry(JobRegistry registry) { + this.registry = registry; + } + + /* + * (non-Javadoc) + * @see org.springframework.context.ResourceLoaderAware#setResourceLoader(org.springframework.core.io.ResourceLoader) + */ + public void setResourceLoader(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } + + private void register(String[] paths) throws DuplicateJobException { + for (int i = 0; i < paths.length; i++) { + String path = paths[i]; + ConfigurableListableBeanFactory beanFactory = new XmlBeanFactory(resourceLoader.getResource(path), + parentContext.getAutowireCapableBeanFactory()); + String[] names = beanFactory.getBeanNamesForType(Job.class); + for (int j = 0; j < names.length; j++) { + registry.register(new ClassPathXmlApplicationContextJobFactory(names[j], path, parentContext)); + } + } + } + + public static void main(String[] args) throws Exception { + + final QuartzBatchLauncher launcher = new QuartzBatchLauncher(); + + new Thread(new Runnable() { + public void run() { + launcher.run(); + }; + }).start(); + + while (launcher.parentContext == null) { + Thread.sleep(100L); + } + + // Paths to individual job configurations. + final String[] paths = new String[] { "jobs/adhocLoopJob.xml", "jobs/footballJob.xml" }; + + launcher.register(paths); + + log.info("Started Quartz scheduler."); + System.in.read(); + } + + private void run() { + + /* + * A simple execution environment with a Quartz scheduler. This will be + * used as the parent context for loading job configurations. + */ + final ApplicationContext parent = new ClassPathXmlApplicationContext("quartz-job-launcher-context.xml"); + parent.getAutowireCapableBeanFactory().autowireBeanProperties(this, + AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false); + parent.getAutowireCapableBeanFactory().initializeBean(this, "quartzLauncher"); + this.parentContext = parent; + + } +} diff --git a/spring-batch-samples/src/main/resources/quartz-job-launcher-context.xml b/spring-batch-samples/src/main/resources/quartz-job-launcher-context.xml new file mode 100644 index 000000000..78b756b0b --- /dev/null +++ b/spring-batch-samples/src/main/resources/quartz-job-launcher-context.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +