Example usage for org.springframework.batch.core.jsr.configuration.xml JsrXmlApplicationContext JsrXmlApplicationContext

List of usage examples for org.springframework.batch.core.jsr.configuration.xml JsrXmlApplicationContext JsrXmlApplicationContext

Introduction

In this page you can find the example usage for org.springframework.batch.core.jsr.configuration.xml JsrXmlApplicationContext JsrXmlApplicationContext.

Prototype

public JsrXmlApplicationContext(Properties jobParameters) 

Source Link

Document

Create a new context instance using the provided Properties representing job parameters when pre-processing the job definition document.

Usage

From source file:de.codecentric.batch.jsr352.CustomJsrJobOperator.java

@Override
public long start(String jobName, Properties params) throws JobStartException, JobSecurityException {
    final JsrXmlApplicationContext batchContext = new JsrXmlApplicationContext(params);
    batchContext.setValidating(false);/*from www. j  av a 2 s .c o m*/

    Resource batchXml = new ClassPathResource("/META-INF/batch.xml");
    String jobConfigurationLocation = "/META-INF/batch-jobs/" + jobName + ".xml";
    Resource jobXml = new ClassPathResource(jobConfigurationLocation);

    if (batchXml.exists()) {
        batchContext.load(batchXml);
    }

    if (jobXml.exists()) {
        batchContext.load(jobXml);
    }

    AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder
            .genericBeanDefinition("org.springframework.batch.core.jsr.JsrJobContextFactoryBean")
            .getBeanDefinition();
    beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
    batchContext.registerBeanDefinition(JSR_JOB_CONTEXT_BEAN_NAME, beanDefinition);

    batchContext.setParent(parentContext);

    try {
        batchContext.refresh();
    } catch (BeanCreationException e) {
        throw new JobStartException(e);
    }

    Assert.notNull(jobName, "The job name must not be null.");

    final org.springframework.batch.core.JobExecution jobExecution;

    try {
        JobParameters jobParameters = jobParametersConverter.getJobParameters(params);
        String[] jobNames = batchContext.getBeanNamesForType(Job.class);

        if (jobNames == null || jobNames.length <= 0) {
            throw new BatchRuntimeException("No Job defined in current context");
        }

        org.springframework.batch.core.JobInstance jobInstance = jobRepository.createJobInstance(jobNames[0],
                jobParameters);
        jobExecution = jobRepository.createJobExecution(jobInstance, jobParameters, jobConfigurationLocation);
    } catch (Exception e) {
        throw new JobStartException(e);
    }

    try {
        final Semaphore semaphore = new Semaphore(1);
        final List<Exception> exceptionHolder = Collections.synchronizedList(new ArrayList<Exception>());
        semaphore.acquire();

        taskExecutor.execute(new Runnable() {

            @Override
            public void run() {
                JsrJobContextFactoryBean factoryBean = null;
                try {
                    factoryBean = (JsrJobContextFactoryBean) batchContext
                            .getBean("&" + JSR_JOB_CONTEXT_BEAN_NAME);
                    factoryBean.setJobExecution(jobExecution);
                    final AbstractJob job = batchContext.getBean(AbstractJob.class);
                    addListenerToJobService.addListenerToJob(job);
                    semaphore.release();
                    // Initialization of the JobExecution for job level dependencies
                    jobRegistry.register(job, jobExecution);
                    job.execute(jobExecution);
                    jobRegistry.remove(jobExecution);
                } catch (Exception e) {
                    exceptionHolder.add(e);
                } finally {
                    if (factoryBean != null) {
                        factoryBean.close();
                    }

                    batchContext.close();

                    if (semaphore.availablePermits() == 0) {
                        semaphore.release();
                    }
                }
            }
        });

        semaphore.acquire();
        if (exceptionHolder.size() > 0) {
            semaphore.release();
            throw new JobStartException(exceptionHolder.get(0));
        }
    } catch (Exception e) {
        if (jobRegistry.exists(jobExecution.getId())) {
            jobRegistry.remove(jobExecution);
        }
        jobExecution.upgradeStatus(BatchStatus.FAILED);
        if (jobExecution.getExitStatus().equals(ExitStatus.UNKNOWN)) {
            jobExecution.setExitStatus(ExitStatus.FAILED.addExitDescription(e));
        }
        jobRepository.update(jobExecution);

        if (batchContext.isActive()) {
            batchContext.close();
        }

        throw new JobStartException(e);
    }
    return jobExecution.getId();
}

From source file:org.springframework.batch.core.jsr.configuration.xml.JsrBeanDefinitionDocumentReaderTests.java

@Test
@SuppressWarnings("resource")
public void testGetJobParameters() {
    Properties jobParameters = new Properties();
    jobParameters.setProperty("jobParameter1", "jobParameter1Value");
    jobParameters.setProperty("jobParameter2", "jobParameter2Value");

    JsrXmlApplicationContext applicationContext = new JsrXmlApplicationContext(jobParameters);
    applicationContext.setValidating(false);
    applicationContext.load(new ClassPathResource("jsrBaseContext.xml"),
            new ClassPathResource("/META-INF/batch.xml"),
            new ClassPathResource("/META-INF/batch-jobs/jsrPropertyPreparseTestJob.xml"));
    applicationContext.refresh();//from w  w w. j av a2s. com

    BeanDefinition beanDefinition = applicationContext.getBeanDefinition(JOB_PARAMETERS_BEAN_DEFINITION_NAME);

    Properties processedJobParameters = (Properties) beanDefinition.getConstructorArgumentValues()
            .getGenericArgumentValue(Properties.class).getValue();
    assertNotNull(processedJobParameters);
    assertTrue("Wrong number of job parameters", processedJobParameters.size() == 2);
    assertEquals("jobParameter1Value", processedJobParameters.getProperty("jobParameter1"));
    assertEquals("jobParameter2Value", processedJobParameters.getProperty("jobParameter2"));
}

From source file:org.springframework.batch.core.jsr.configuration.xml.JsrBeanDefinitionDocumentReaderTests.java

@Test
public void testJobParametersResolution() {
    Properties jobParameters = new Properties();
    jobParameters.setProperty("jobParameter1", "myfile.txt");
    jobParameters.setProperty("jobParameter2", "#{jobProperties['jobProperty2']}");
    jobParameters.setProperty("jobParameter3", "#{jobParameters['jobParameter1']}");

    @SuppressWarnings("resource")
    JsrXmlApplicationContext applicationContext = new JsrXmlApplicationContext(jobParameters);
    applicationContext.setValidating(false);
    applicationContext.load(new ClassPathResource("jsrBaseContext.xml"),
            new ClassPathResource("/META-INF/batch.xml"),
            new ClassPathResource("/META-INF/batch-jobs/jsrPropertyPreparseTestJob.xml"));
    applicationContext.refresh();//from  www .jav a2s  .c  om

    Document document = getDocument("/META-INF/batch-jobs/jsrPropertyPreparseTestJob.xml");

    JsrBeanDefinitionDocumentReader documentReader = new JsrBeanDefinitionDocumentReader(applicationContext);
    documentReader.initProperties(document.getDocumentElement());

    Properties resolvedParameters = documentReader.getJobParameters();

    assertNotNull(resolvedParameters);
    assertTrue("Wrong number of job parameters", resolvedParameters.size() == 3);
    assertEquals("myfile.txt", resolvedParameters.getProperty("jobParameter1"));
    assertEquals("jobProperty1Value", resolvedParameters.getProperty("jobParameter2"));
    assertEquals("myfile.txt", resolvedParameters.getProperty("jobParameter3"));
}

From source file:org.springframework.batch.core.jsr.configuration.xml.JsrBeanDefinitionDocumentReaderTests.java

@Test
public void testJobPropertyResolution() {
    Properties jobParameters = new Properties();
    jobParameters.setProperty("file.name", "myfile.txt");

    @SuppressWarnings("resource")
    JsrXmlApplicationContext applicationContext = new JsrXmlApplicationContext(jobParameters);
    applicationContext.setValidating(false);
    applicationContext.load(new ClassPathResource("jsrBaseContext.xml"),
            new ClassPathResource("/META-INF/batch.xml"),
            new ClassPathResource("/META-INF/batch-jobs/jsrPropertyPreparseTestJob.xml"));
    applicationContext.refresh();//from  w  ww  .j a v  a2  s. c o m

    Document document = getDocument("/META-INF/batch-jobs/jsrPropertyPreparseTestJob.xml");

    JsrBeanDefinitionDocumentReader documentReader = new JsrBeanDefinitionDocumentReader(applicationContext);
    documentReader.initProperties(document.getDocumentElement());

    Properties resolvedProperties = documentReader.getJobProperties();
    assertNotNull(resolvedProperties);
    assertTrue("Wrong number of job properties", resolvedProperties.size() == 3);
    assertEquals("jobProperty1Value", resolvedProperties.getProperty("jobProperty1"));
    assertEquals("jobProperty1Value", resolvedProperties.getProperty("jobProperty2"));
    assertEquals("myfile.txt", resolvedProperties.getProperty("jobProperty3"));
}

From source file:org.springframework.batch.core.jsr.configuration.xml.JsrBeanDefinitionDocumentReaderTests.java

@SuppressWarnings("resource")
@Test//  ww w  .j  a  va  2  s  . co  m
public void testGenerationOfBeanDefinitionsForMultipleReferences() throws Exception {
    JsrXmlApplicationContext applicationContext = new JsrXmlApplicationContext(new Properties());
    applicationContext.setValidating(false);
    applicationContext.load(new ClassPathResource("jsrBaseContext.xml"),
            new ClassPathResource("/META-INF/batch.xml"),
            new ClassPathResource("/META-INF/batch-jobs/jsrUniqueInstanceTests.xml"));
    applicationContext.refresh();

    assertTrue("exitStatusSettingStepListener bean definition not found",
            applicationContext.containsBeanDefinition("exitStatusSettingStepListener"));
    assertTrue("exitStatusSettingStepListener1 bean definition not found",
            applicationContext.containsBeanDefinition("exitStatusSettingStepListener1"));
    assertTrue("exitStatusSettingStepListener2 bean definition not found",
            applicationContext.containsBeanDefinition("exitStatusSettingStepListener2"));
    assertTrue("exitStatusSettingStepListener3 bean definition not found",
            applicationContext.containsBeanDefinition("exitStatusSettingStepListener3"));
    assertTrue("exitStatusSettingStepListenerClassBeanDefinition bean definition not found",
            applicationContext.containsBeanDefinition(
                    "org.springframework.batch.core.jsr.step.listener.ExitStatusSettingStepListener"));
    assertTrue("exitStatusSettingStepListener1ClassBeanDefinition bean definition not found",
            applicationContext.containsBeanDefinition(
                    "org.springframework.batch.core.jsr.step.listener.ExitStatusSettingStepListener1"));
    assertTrue("exitStatusSettingStepListener2ClassBeanDefinition bean definition not found",
            applicationContext.containsBeanDefinition(
                    "org.springframework.batch.core.jsr.step.listener.ExitStatusSettingStepListener2"));
    assertTrue("exitStatusSettingStepListener3ClassBeanDefinition bean definition not found",
            applicationContext.containsBeanDefinition(
                    "org.springframework.batch.core.jsr.step.listener.ExitStatusSettingStepListener3"));
    assertTrue("testBatchlet bean definition not found",
            applicationContext.containsBeanDefinition("testBatchlet"));
    assertTrue("testBatchlet1 bean definition not found",
            applicationContext.containsBeanDefinition("testBatchlet1"));
}

From source file:org.springframework.batch.core.jsr.configuration.xml.JsrBeanDefinitionDocumentReaderTests.java

@Test
@SuppressWarnings("resource")
public void testGenerationOfSpringBeanDefinitionsForMultipleReferences() {
    JsrXmlApplicationContext applicationContext = new JsrXmlApplicationContext(new Properties());
    applicationContext.setValidating(false);
    applicationContext.load(new ClassPathResource("jsrBaseContext.xml"),
            new ClassPathResource("/META-INF/batch-jobs/jsrSpringInstanceTests.xml"));

    applicationContext.refresh();/*from  w  w  w. j  av a2  s .c om*/

    assertTrue("exitStatusSettingStepListener bean definition not found",
            applicationContext.containsBeanDefinition("exitStatusSettingStepListener"));
    assertTrue("scopedTarget.exitStatusSettingStepListener bean definition not found",
            applicationContext.containsBeanDefinition("scopedTarget.exitStatusSettingStepListener"));

    BeanDefinition exitStatusSettingStepListenerBeanDefinition = applicationContext
            .getBeanDefinition("scopedTarget.exitStatusSettingStepListener");
    assertTrue("step".equals(exitStatusSettingStepListenerBeanDefinition.getScope()));

    assertTrue("Should not contain bean definition for exitStatusSettingStepListener1",
            !applicationContext.containsBeanDefinition("exitStatusSettingStepListener1"));
    assertTrue("Should not contain bean definition for exitStatusSettingStepListener2",
            !applicationContext.containsBeanDefinition("exitStatusSettingStepListener2"));
    assertTrue("Should not contain bean definition for exitStatusSettingStepListener3",
            !applicationContext.containsBeanDefinition("exitStatusSettingStepListener3"));

    assertTrue("Should not contain bean definition for testBatchlet1",
            !applicationContext.containsBeanDefinition("testBatchlet1"));
    assertTrue("Should not contain bean definition for testBatchlet2",
            !applicationContext.containsBeanDefinition("testBatchlet2"));

    assertTrue("testBatchlet bean definition not found",
            applicationContext.containsBeanDefinition("testBatchlet"));

    BeanDefinition testBatchletBeanDefinition = applicationContext.getBeanDefinition("testBatchlet");
    assertTrue("singleton".equals(testBatchletBeanDefinition.getScope()));
}

From source file:org.springframework.batch.core.jsr.launch.JsrJobOperator.java

/**
 * Creates a child {@link ApplicationContext} for the job being requested based upon
 * the /META-INF/batch.xml (if exists) and the /META-INF/batch-jobs/&lt;jobName&gt;.xml
 * configuration and restart the job./*from  w ww .  j a  v a  2s  . c  o m*/
 *
 * @param executionId the database id of the job execution to be restarted.
 * @param params any job parameters to be used during the execution of this job.
 * @throws JobExecutionAlreadyCompleteException thrown if the requested job execution has
 * a status of COMPLETE
 * @throws NoSuchJobExecutionException throw if the requested job execution does not exist
 * in the repository
 * @throws JobExecutionNotMostRecentException thrown if the requested job execution is not
 * the most recent attempt for the job instance it's related to.
 * @throws JobRestartException thrown for any general errors during the job restart process
 */
@Override
public long restart(long executionId, Properties params)
        throws JobExecutionAlreadyCompleteException, NoSuchJobExecutionException,
        JobExecutionNotMostRecentException, JobRestartException, JobSecurityException {
    org.springframework.batch.core.JobExecution previousJobExecution = jobExplorer.getJobExecution(executionId);

    if (previousJobExecution == null) {
        throw new NoSuchJobExecutionException("No JobExecution found for id: [" + executionId + "]");
    } else if (previousJobExecution.getStatus().equals(BatchStatus.COMPLETED)) {
        throw new JobExecutionAlreadyCompleteException("The requested job has already completed");
    }

    List<org.springframework.batch.core.JobExecution> previousExecutions = jobExplorer
            .getJobExecutions(previousJobExecution.getJobInstance());

    for (org.springframework.batch.core.JobExecution jobExecution : previousExecutions) {
        if (jobExecution.getCreateTime().compareTo(previousJobExecution.getCreateTime()) > 0) {
            throw new JobExecutionNotMostRecentException(
                    "The requested JobExecution to restart was not the most recently run");
        }

        if (jobExecution.getStatus().equals(BatchStatus.ABANDONED)) {
            throw new JobRestartException("JobExecution ID: " + jobExecution.getId()
                    + " is abandoned and attempted to be restarted.");
        }
    }

    final String jobName = previousJobExecution.getJobInstance().getJobName();

    Properties jobRestartProperties = getJobRestartProperties(params, previousJobExecution);

    final JsrXmlApplicationContext batchContext = new JsrXmlApplicationContext(jobRestartProperties);
    batchContext.setValidating(false);

    Resource batchXml = new ClassPathResource("/META-INF/batch.xml");
    Resource jobXml = new ClassPathResource(previousJobExecution.getJobConfigurationName());

    if (batchXml.exists()) {
        batchContext.load(batchXml);
    }

    if (jobXml.exists()) {
        batchContext.load(jobXml);
    }

    AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder
            .genericBeanDefinition("org.springframework.batch.core.jsr.JsrJobContextFactoryBean")
            .getBeanDefinition();
    beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
    batchContext.registerBeanDefinition(JSR_JOB_CONTEXT_BEAN_NAME, beanDefinition);

    batchContext.setParent(baseContext);

    try {
        batchContext.refresh();
    } catch (BeanCreationException e) {
        throw new JobRestartException(e);
    }

    final org.springframework.batch.core.JobExecution jobExecution;

    try {
        JobParameters jobParameters = jobParametersConverter.getJobParameters(jobRestartProperties);
        jobExecution = jobRepository.createJobExecution(previousJobExecution.getJobInstance(), jobParameters,
                previousJobExecution.getJobConfigurationName());
    } catch (Exception e) {
        throw new JobRestartException(e);
    }

    try {
        final Semaphore semaphore = new Semaphore(1);
        final List<Exception> exceptionHolder = Collections.synchronizedList(new ArrayList<Exception>());
        semaphore.acquire();

        taskExecutor.execute(new Runnable() {

            @Override
            public void run() {
                JsrJobContextFactoryBean factoryBean = null;
                try {
                    factoryBean = (JsrJobContextFactoryBean) batchContext
                            .getBean("&" + JSR_JOB_CONTEXT_BEAN_NAME);
                    factoryBean.setJobExecution(jobExecution);
                    final Job job = batchContext.getBean(Job.class);

                    if (!job.isRestartable()) {
                        throw new JobRestartException("Job " + jobName + " is not restartable");
                    }

                    semaphore.release();
                    // Initialization of the JobExecution for job level dependencies
                    jobRegistry.register(job, jobExecution);
                    job.execute(jobExecution);
                    jobRegistry.remove(jobExecution);
                } catch (Exception e) {
                    exceptionHolder.add(e);
                } finally {
                    if (factoryBean != null) {
                        factoryBean.close();
                    }

                    batchContext.close();

                    if (semaphore.availablePermits() == 0) {
                        semaphore.release();
                    }
                }
            }
        });

        semaphore.acquire();
        if (exceptionHolder.size() > 0) {
            semaphore.release();
            throw new JobRestartException(exceptionHolder.get(0));
        }
    } catch (Exception e) {
        jobExecution.upgradeStatus(BatchStatus.FAILED);
        if (jobExecution.getExitStatus().equals(ExitStatus.UNKNOWN)) {
            jobExecution.setExitStatus(ExitStatus.FAILED.addExitDescription(e));
        }

        jobRepository.update(jobExecution);

        if (batchContext.isActive()) {
            batchContext.close();
        }

        throw new JobRestartException(e);
    }

    return jobExecution.getId();
}

From source file:org.springframework.batch.core.jsr.launch.JsrJobOperator.java

/**
 * Creates a child {@link ApplicationContext} for the job being requested based upon
 * the /META-INF/batch.xml (if exists) and the /META-INF/batch-jobs/&lt;jobName&gt;.xml
 * configuration and launches the job.  Per JSR-352, calls to this method will always
 * create a new {@link JobInstance} (and related {@link JobExecution}).
 *
 * @param jobName the name of the job XML file without the .xml that is located within the
 * /META-INF/batch-jobs directory.//from ww w.  j  a  v  a  2s. c o m
 * @param params any job parameters to be used during the execution of this job.
 */
@Override
public long start(String jobName, Properties params) throws JobStartException, JobSecurityException {
    final JsrXmlApplicationContext batchContext = new JsrXmlApplicationContext(params);
    batchContext.setValidating(false);

    Resource batchXml = new ClassPathResource("/META-INF/batch.xml");
    String jobConfigurationLocation = "/META-INF/batch-jobs/" + jobName + ".xml";
    Resource jobXml = new ClassPathResource(jobConfigurationLocation);

    if (batchXml.exists()) {
        batchContext.load(batchXml);
    }

    if (jobXml.exists()) {
        batchContext.load(jobXml);
    }

    AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder
            .genericBeanDefinition("org.springframework.batch.core.jsr.JsrJobContextFactoryBean")
            .getBeanDefinition();
    beanDefinition.setScope(BeanDefinition.SCOPE_SINGLETON);
    batchContext.registerBeanDefinition(JSR_JOB_CONTEXT_BEAN_NAME, beanDefinition);

    if (baseContext != null) {
        batchContext.setParent(baseContext);
    } else {
        batchContext.getBeanFactory().registerSingleton("jobExplorer", jobExplorer);
        batchContext.getBeanFactory().registerSingleton("jobRepository", jobRepository);
        batchContext.getBeanFactory().registerSingleton("jobParametersConverter", jobParametersConverter);
        batchContext.getBeanFactory().registerSingleton("transactionManager", transactionManager);
    }

    try {
        batchContext.refresh();
    } catch (BeanCreationException e) {
        throw new JobStartException(e);
    }

    Assert.notNull(jobName, "The job name must not be null.");

    final org.springframework.batch.core.JobExecution jobExecution;

    try {
        JobParameters jobParameters = jobParametersConverter.getJobParameters(params);
        String[] jobNames = batchContext.getBeanNamesForType(Job.class);

        if (jobNames == null || jobNames.length <= 0) {
            throw new BatchRuntimeException("No Job defined in current context");
        }

        org.springframework.batch.core.JobInstance jobInstance = jobRepository.createJobInstance(jobNames[0],
                jobParameters);
        jobExecution = jobRepository.createJobExecution(jobInstance, jobParameters, jobConfigurationLocation);
    } catch (Exception e) {
        throw new JobStartException(e);
    }

    try {
        final Semaphore semaphore = new Semaphore(1);
        final List<Exception> exceptionHolder = Collections.synchronizedList(new ArrayList<Exception>());
        semaphore.acquire();

        taskExecutor.execute(new Runnable() {

            @Override
            public void run() {
                JsrJobContextFactoryBean factoryBean = null;
                try {
                    factoryBean = (JsrJobContextFactoryBean) batchContext
                            .getBean("&" + JSR_JOB_CONTEXT_BEAN_NAME);
                    factoryBean.setJobExecution(jobExecution);
                    final Job job = batchContext.getBean(Job.class);
                    semaphore.release();
                    // Initialization of the JobExecution for job level dependencies
                    jobRegistry.register(job, jobExecution);
                    job.execute(jobExecution);
                    jobRegistry.remove(jobExecution);
                } catch (Exception e) {
                    exceptionHolder.add(e);
                } finally {
                    if (factoryBean != null) {
                        factoryBean.close();
                    }

                    batchContext.close();

                    if (semaphore.availablePermits() == 0) {
                        semaphore.release();
                    }
                }
            }
        });

        semaphore.acquire();
        if (exceptionHolder.size() > 0) {
            semaphore.release();
            throw new JobStartException(exceptionHolder.get(0));
        }
    } catch (Exception e) {
        if (jobRegistry.exists(jobExecution.getId())) {
            jobRegistry.remove(jobExecution);
        }
        jobExecution.upgradeStatus(BatchStatus.FAILED);
        if (jobExecution.getExitStatus().equals(ExitStatus.UNKNOWN)) {
            jobExecution.setExitStatus(ExitStatus.FAILED.addExitDescription(e));
        }
        jobRepository.update(jobExecution);

        if (batchContext.isActive()) {
            batchContext.close();
        }

        throw new JobStartException(e);
    }
    return jobExecution.getId();
}