@Override public final FlowJob getObject() throws Exception { Assert.isTrue(StringUtils.hasText(name), "The job must have an id."); FlowJob flowJob = new FlowJob(name); if (restartable != null) { flowJob.setRestartable(restartable); } if (jobRepository != null) { flowJob.setJobRepository(jobRepository); } if (jobParametersValidator != null) { flowJob.setJobParametersValidator(jobParametersValidator); } if (jobExecutionListeners != null) { flowJob.setJobExecutionListeners(jobExecutionListeners); } if (jobParametersIncrementer != null) { flowJob.setJobParametersIncrementer(jobParametersIncrementer); } if (flow != null) { flowJob.setFlow(flow); } flowJob.afterPropertiesSet(); return flowJob; }
/** * Initialize the step names */ private void init() { findSteps(flow, stepMap); }
/** * @see AbstractJob#doExecute(JobExecution) */ @Override protected void doExecute(final JobExecution execution) throws JobExecutionException { try { JobFlowExecutor executor = new JobFlowExecutor(getJobRepository(), new SimpleStepHandler(getJobRepository()), execution); executor.updateJobExecutionStatus(flow.start(executor).getStatus()); } catch (FlowExecutionException e) { if (e.getCause() instanceof JobExecutionException) { throw (JobExecutionException) e.getCause(); } throw new JobExecutionException("Flow execution ended unexpectedly", e); } }
/** * Build a job that executes the flow provided, normally composed of other steps. * * @return a flow job */ public Job build() { FlowJob job = new FlowJob(); job.setName(getName()); job.setFlow(flow); super.enhance(job); try { job.afterPropertiesSet(); } catch (Exception e) { throw new StepBuilderException(e); } return job; }
@Test public void testGetStepNamesWithPrefix() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List<StateTransition> transitions = new ArrayList<>(); transitions.add(StateTransition.createStateTransition(new StepState("job.step", new StubStep("step")), "end0")); transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0"))); flow.setStateTransitions(transitions); flow.afterPropertiesSet(); job.setFlow(flow); job.setName(flow.getName()); job.afterPropertiesSet(); assertEquals("[step]", job.getStepNames().toString()); }
@Test public void testStepFailure() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List<StateTransition> transitions = new ArrayList<>(); StepState step = new StepState(new StepSupport("step")); transitions.add(StateTransition.createStateTransition(step, ExitStatus.FAILED.getExitCode(), "end0")); transitions.add(StateTransition.createStateTransition(step, ExitStatus.COMPLETED.getExitCode(), "end1")); transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.FAILED, "end0"))); transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end1"))); flow.setStateTransitions(transitions); job.setFlow(flow); job.afterPropertiesSet(); job.execute(execution); assertEquals(BatchStatus.FAILED, execution.getStatus()); }
@Test public void testTwoSteps() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List<StateTransition> transitions = new ArrayList<>(); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2")); StepState step2 = new StepState(new StubStep("step2")); transitions.add(StateTransition.createStateTransition(step2, ExitStatus.FAILED.getExitCode(), "end0")); transitions.add(StateTransition.createStateTransition(step2, ExitStatus.COMPLETED.getExitCode(), "end1")); transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.FAILED, "end0"))); transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end1"))); flow.setStateTransitions(transitions); job.setFlow(flow); job.afterPropertiesSet(); job.doExecute(jobExecution); StepExecution stepExecution = getStepExecution(jobExecution, "step2"); assertEquals(ExitStatus.COMPLETED, stepExecution.getExitStatus()); assertEquals(2, jobExecution.getStepExecutions().size()); }
@Test public void testGetStepExistsWithPrefix() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List<StateTransition> transitions = new ArrayList<>(); transitions.add(StateTransition.createStateTransition(new StepState("job.step", new StubStep("step")), "end0")); transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0"))); flow.setStateTransitions(transitions); flow.afterPropertiesSet(); job.setFlow(flow); job.setName(flow.getName()); job.afterPropertiesSet(); Step step = job.getStep("step"); assertNotNull(step); assertEquals("step", step.getName()); }
@Test public void testGetSteps() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List<StateTransition> transitions = new ArrayList<>(); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2")); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), "end0")); transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0"))); flow.setStateTransitions(transitions); flow.afterPropertiesSet(); job.setFlow(flow); job.afterPropertiesSet(); assertEquals(2, job.getStepNames().size()); }
@Test public void testGetStepNotExists() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List<StateTransition> transitions = new ArrayList<>(); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "step2")); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), "end0")); transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0"))); flow.setStateTransitions(transitions); flow.afterPropertiesSet(); job.setFlow(flow); job.afterPropertiesSet(); Step step = job.getStep("foo"); assertNull(step); }
@Test public void testGetPartitionedStep() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List<StateTransition> transitions = new ArrayList<>(); PartitionStep step = new PartitionStep(); step.setName("step1"); JsrPartitionHandler partitionHandler = new JsrPartitionHandler(); partitionHandler.setPropertyContext(new BatchPropertyContext()); partitionHandler.setPartitions(3); partitionHandler.setJobRepository(jobRepository); partitionHandler.setStep(new StubStep("subStep")); partitionHandler.afterPropertiesSet(); step.setPartitionHandler(partitionHandler); step.setStepExecutionSplitter(new JsrStepExecutionSplitter(jobRepository, false, "step1", true)); step.setJobRepository(jobRepository); step.afterPropertiesSet(); transitions.add(StateTransition.createStateTransition(new StepState("job.step", step), "end0")); transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0"))); flow.setStateTransitions(transitions); flow.afterPropertiesSet(); job.setFlow(flow); job.afterPropertiesSet(); job.execute(jobRepository.createJobExecution("partitionJob", new JobParameters())); assertEquals(3, step.getStepNames().size()); Step subStep = job.getStep("step1:partition0"); assertNotNull(subStep); assertEquals("subStep", subStep.getName()); assertNull(job.getStep("step that does not exist")); }
/** * {@inheritDoc} */ @Override public Step getStep(String stepName) { if (!initialized) { init(); } return stepMap.get(stepName); }
@Test public void testBasicFlow() throws Throwable { SimpleFlow flow = new SimpleFlow("job"); List<StateTransition> transitions = new ArrayList<>(); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step")), "end0")); transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0"))); flow.setStateTransitions(transitions); job.setFlow(flow); job.execute(jobExecution); if (!jobExecution.getAllFailureExceptions().isEmpty()) { throw jobExecution.getAllFailureExceptions().get(0); } assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); }
@Before public void init() throws Exception { JobRepository jobRepository = new MapJobRepositoryFactoryBean().getObject(); job.setJobRepository(jobRepository); execution = jobRepository.createJobExecution("job", new JobParameters()); }
public void registerListener(final Job job) { if (job != null) { try { if (job instanceof SimpleJob) { final SimpleJob simpleJob = (SimpleJob) job; final JobExecutionListener[] jobExecutionListeners = this.getJobExecutionListeners(); simpleJob.setJobExecutionListeners(jobExecutionListeners); } else if (job instanceof FlowJob) { final FlowJob flowJob = (FlowJob) job; final JobExecutionListener[] jobExecutionListeners = this.getJobExecutionListeners(); flowJob.setJobExecutionListeners(jobExecutionListeners); } else { throw new SpringBatchLightminApplicationException("Could not cast" + job + "to org.springframework.batch.core.job.SimpleJob or " + "org.springframework.batch.core.job.FlowJob"); } } catch (final Exception e) { log.error("Could not cast {} to org.springframework.batch.core.job.SimpleJob or " + "org.springframework.batch.core.job.FlowJob", job); } } else { throw new SpringBatchLightminApplicationException("Could not register listener for a null job"); } }
/** * Build a job that executes the flow provided, normally composed of other steps. * * @return a flow job */ public Job build() { FlowJob job = new FlowJob(); job.setName(getName()); job.setFlow(flow); super.enhance(job); try { job.afterPropertiesSet(); } catch (Exception e) { throw new StepBuilderException(e); } return job; }
@Test public void testInterruptedException() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List<StateTransition> transitions = new ArrayList<>(); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1") { @Override public void execute(StepExecution stepExecution) throws JobInterruptedException { throw new JobInterruptedException("Stopped"); } }), "end0")); transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0"))); flow.setStateTransitions(transitions); flow.afterPropertiesSet(); job.setFlow(flow); job.afterPropertiesSet(); job.execute(jobExecution); assertEquals(BatchStatus.STOPPED, jobExecution.getStatus()); checkRepository(BatchStatus.STOPPED, ExitStatus.STOPPED); assertEquals(1, jobExecution.getAllFailureExceptions().size()); assertEquals(JobInterruptedException.class, jobExecution.getFailureExceptions().get(0).getClass()); }
@Test public void testEndStateStopped() throws Exception { SimpleFlow flow = new SimpleFlow("job"); List<StateTransition> transitions = new ArrayList<>(); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "end")); transitions.add(StateTransition .createStateTransition(new EndState(FlowExecutionStatus.STOPPED, "end"), "step2")); StepState step2 = new StepState(new StubStep("step2")); transitions.add(StateTransition.createStateTransition(step2, ExitStatus.FAILED.getExitCode(), "end0")); transitions.add(StateTransition.createStateTransition(step2, ExitStatus.COMPLETED.getExitCode(), "end1")); transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.FAILED, "end0"))); transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end1"))); flow.setStateTransitions(transitions); job.setFlow(flow); job.afterPropertiesSet(); job.doExecute(jobExecution); assertEquals(1, jobExecution.getStepExecutions().size()); assertEquals(BatchStatus.STOPPED, jobExecution.getStatus()); }
@Test public void testGetStepNestedFlow() throws Exception { SimpleFlow nested = new SimpleFlow("nested"); List<StateTransition> transitions = new ArrayList<>(); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step2")), "end1")); transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end1"))); nested.setStateTransitions(transitions); nested.afterPropertiesSet(); SimpleFlow flow = new SimpleFlow("job"); transitions = new ArrayList<>(); transitions.add(StateTransition.createStateTransition(new StepState(new StubStep("step1")), "nested")); transitions.add(StateTransition.createStateTransition(new FlowState(nested, "nested"), "end0")); transitions.add(StateTransition.createEndStateTransition(new EndState(FlowExecutionStatus.COMPLETED, "end0"))); flow.setStateTransitions(transitions); flow.afterPropertiesSet(); job.setFlow(flow); job.afterPropertiesSet(); List<String> names = new ArrayList<>(job.getStepNames()); Collections.sort(names); assertEquals("[step1, step2]", names.toString()); }