Browse Source
* Added ExitCodeGenerator and SpringApplication.exit convenience method * User can add bean of type ExitCodeGenerator or supply one in the call to exit() [Fixes #48475971]pull/1/head
11 changed files with 399 additions and 11 deletions
@ -0,0 +1,50 @@
@@ -0,0 +1,50 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
<modelVersion>4.0.0</modelVersion> |
||||
<parent> |
||||
<groupId>org.springframework.bootstrap</groupId> |
||||
<artifactId>spring-bootstrap-samples</artifactId> |
||||
<version>0.0.1-SNAPSHOT</version> |
||||
</parent> |
||||
<artifactId>spring-bootstrap-batch-sample</artifactId> |
||||
<packaging>jar</packaging> |
||||
<properties> |
||||
<main.basedir>${project.basedir}/../..</main.basedir> |
||||
<start-class>org.springframework.bootstrap.sample.simple.SimpleBootstrapApplication</start-class> |
||||
</properties> |
||||
<dependencies> |
||||
<dependency> |
||||
<groupId>${project.groupId}</groupId> |
||||
<artifactId>spring-bootstrap</artifactId> |
||||
<version>${project.version}</version> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.springframework.batch</groupId> |
||||
<artifactId>spring-batch-core</artifactId> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.springframework</groupId> |
||||
<artifactId>spring-jdbc</artifactId> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.hsqldb</groupId> |
||||
<artifactId>hsqldb</artifactId> |
||||
</dependency> |
||||
<dependency> |
||||
<groupId>org.slf4j</groupId> |
||||
<artifactId>slf4j-jdk14</artifactId> |
||||
<scope>runtime</scope> |
||||
</dependency> |
||||
</dependencies> |
||||
<build> |
||||
<plugins> |
||||
<plugin> |
||||
<artifactId>maven-dependency-plugin</artifactId> |
||||
</plugin> |
||||
<plugin> |
||||
<artifactId>maven-assembly-plugin</artifactId> |
||||
</plugin> |
||||
</plugins> |
||||
</build> |
||||
</project> |
||||
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
/* |
||||
* Copyright 2012-2013 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.bootstrap.sample.batch; |
||||
|
||||
import org.springframework.batch.core.Job; |
||||
import org.springframework.batch.core.Step; |
||||
import org.springframework.batch.core.StepContribution; |
||||
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; |
||||
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; |
||||
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; |
||||
import org.springframework.batch.core.scope.context.ChunkContext; |
||||
import org.springframework.batch.core.step.tasklet.Tasklet; |
||||
import org.springframework.batch.repeat.RepeatStatus; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.bootstrap.SpringApplication; |
||||
import org.springframework.bootstrap.context.annotation.EnableAutoConfiguration; |
||||
import org.springframework.context.annotation.Bean; |
||||
import org.springframework.context.annotation.ComponentScan; |
||||
import org.springframework.context.annotation.Configuration; |
||||
|
||||
@Configuration |
||||
@EnableAutoConfiguration |
||||
@ComponentScan |
||||
@EnableBatchProcessing |
||||
public class BatchBootstrapApplication { |
||||
|
||||
@Autowired |
||||
private JobBuilderFactory jobs; |
||||
|
||||
@Autowired |
||||
private StepBuilderFactory steps; |
||||
|
||||
@Bean |
||||
protected Tasklet tasklet() { |
||||
return new Tasklet() { |
||||
@Override |
||||
public RepeatStatus execute(StepContribution contribution, |
||||
ChunkContext context) { |
||||
return RepeatStatus.FINISHED; |
||||
} |
||||
}; |
||||
} |
||||
|
||||
@Bean |
||||
public Job job() throws Exception { |
||||
return this.jobs.get("job").start(step1()).build(); |
||||
} |
||||
|
||||
@Bean |
||||
protected Step step1() throws Exception { |
||||
return this.steps.get("step1").tasklet(tasklet()).build(); |
||||
} |
||||
|
||||
public static void main(String[] args) throws Exception { |
||||
// System.exit is common for Batch applications since the exit code can be used to
|
||||
// drive a workflow
|
||||
System.exit(SpringApplication.exit(SpringApplication.run( |
||||
BatchBootstrapApplication.class, args))); |
||||
} |
||||
} |
||||
@ -0,0 +1,60 @@
@@ -0,0 +1,60 @@
|
||||
/* |
||||
* Copyright 2012-2013 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.bootstrap.sample.batch; |
||||
|
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.PrintStream; |
||||
|
||||
import org.junit.After; |
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
import org.springframework.bootstrap.SpringApplication; |
||||
|
||||
import static org.junit.Assert.assertEquals; |
||||
import static org.junit.Assert.assertTrue; |
||||
|
||||
public class BatchBootstrapApplicationTests { |
||||
|
||||
private PrintStream savedOutput; |
||||
private ByteArrayOutputStream output; |
||||
|
||||
@Before |
||||
public void init() { |
||||
this.savedOutput = System.err; |
||||
this.output = new ByteArrayOutputStream(); |
||||
// jdk logging goes to syserr by default
|
||||
System.setErr(new PrintStream(this.output)); |
||||
} |
||||
|
||||
@After |
||||
public void after() { |
||||
System.setErr(this.savedOutput); |
||||
} |
||||
|
||||
private String getOutput() { |
||||
return this.output.toString(); |
||||
} |
||||
|
||||
@Test |
||||
public void testDefaultSettings() throws Exception { |
||||
assertEquals(0, SpringApplication.exit(SpringApplication |
||||
.run(BatchBootstrapApplication.class))); |
||||
String output = getOutput(); |
||||
assertTrue("Wrong output: " + output, |
||||
output.contains("completed with the following parameters")); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,26 @@
@@ -0,0 +1,26 @@
|
||||
/* |
||||
* Copyright 2012-2013 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.bootstrap; |
||||
|
||||
/** |
||||
* @author Dave Syer |
||||
* |
||||
*/ |
||||
public interface ExitCodeGenerator { |
||||
|
||||
int getExitCode(); |
||||
|
||||
} |
||||
@ -0,0 +1,44 @@
@@ -0,0 +1,44 @@
|
||||
/* |
||||
* Copyright 2012-2013 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.bootstrap.autoconfigure.batch; |
||||
|
||||
import org.springframework.batch.core.JobExecution; |
||||
import org.springframework.context.ApplicationEvent; |
||||
|
||||
/** |
||||
* @author Dave Syer |
||||
* |
||||
*/ |
||||
public class JobExecutionEvent extends ApplicationEvent { |
||||
|
||||
private JobExecution execution; |
||||
|
||||
/** |
||||
* @param execution |
||||
*/ |
||||
public JobExecutionEvent(JobExecution execution) { |
||||
super(execution); |
||||
this.execution = execution; |
||||
} |
||||
|
||||
/** |
||||
* @return the job execution |
||||
*/ |
||||
public JobExecution getJobExecution() { |
||||
return this.execution; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,49 @@
@@ -0,0 +1,49 @@
|
||||
/* |
||||
* Copyright 2012-2013 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.bootstrap.autoconfigure.batch; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
import org.springframework.batch.core.JobExecution; |
||||
import org.springframework.bootstrap.ExitCodeGenerator; |
||||
import org.springframework.context.ApplicationListener; |
||||
|
||||
/** |
||||
* @author Dave Syer |
||||
* |
||||
*/ |
||||
public class JobExecutionExitCodeGenerator implements |
||||
ApplicationListener<JobExecutionEvent>, ExitCodeGenerator { |
||||
|
||||
private List<JobExecution> executions = new ArrayList<JobExecution>(); |
||||
|
||||
@Override |
||||
public void onApplicationEvent(JobExecutionEvent event) { |
||||
this.executions.add(event.getJobExecution()); |
||||
} |
||||
|
||||
@Override |
||||
public int getExitCode() { |
||||
for (JobExecution execution : this.executions) { |
||||
if (execution.getStatus().isUnsuccessful()) { |
||||
return 2; |
||||
} |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue