From 64d031939fe42b58ace2e0b794dc2ad51f224b64 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Fri, 5 Jul 2013 16:50:39 -0500 Subject: [PATCH 01/35] Convert to fpp --- README.ftl.md | 119 ++++++++++++++++++ README.md | 72 +++++++---- complete/pom.xml | 2 - .../main/java/hello/BatchConfiguration.java | 12 +- 4 files changed, 171 insertions(+), 34 deletions(-) create mode 100644 README.ftl.md diff --git a/README.ftl.md b/README.ftl.md new file mode 100644 index 0000000000..c7ca7433d9 --- /dev/null +++ b/README.ftl.md @@ -0,0 +1,119 @@ +<#assign project_id="gs-batch-processing"> + +# Getting Started: Creating a Batch Service + +What you'll build +----------------- + +This guide walks you through creating a basic batch-driven solution. You build a service that imports data from a CSV spreadsheet, transforms it with custom code, and stores the final results in a database. + +What you'll need +---------------- + + - About 15 minutes + - <@prereq_editor_jdk_buildtools/> + +## <@how_to_complete_this_guide jump_ahead='Create a business class'/> + + + +Set up the project +------------------ +<@build_system_intro/> + +<@create_directory_structure_hello/> + +### Create a Maven POM + + <@snippet path="pom.xml" prefix="complete"/> + +<@bootstrap_starter_pom_disclaimer/> + +### Create business data + +Typically your customer or a business analyst supplies a spreadsheet. In this case, you make it up. + + <@snippet path="src/main/resources/sample-data.csv" prefix="initial"/> + +This spreadsheet contains a first name and a last name on each row, separated by a comma. This is a fairly common pattern that Spring handles out-of-the-box, as you will see. + +### Define the destination for your data + +Next, you write a SQL script to create a table to store the data. + + <@snippet path="src/main/resources/schema.sql" prefix="initial"/> + + +Create a business class +----------------------- + +Now that you see the format of data inputs and outputs, you write code to represent a row of data. + + <@snippet path="src/main/java/hello/Person.java" prefix="complete"/> + +You can instantiate the `Person` class either with first and last name through a constructor, or by setting the properties. + +Create an intermediate processor +-------------------------------- + +A common paradigm in batch processing is to ingest data, transform it, and then pipe it out somewhere else. Here you write a simple transformer that converts the names to uppercase. + + <@snippet path="src/main/java/hello/PersonItemProcessor.java" prefix="complete"/> + +`PersonItemProcessor` implements Spring Batch's `ItemProcessor` interface. This makes it easy to wire the code into a batch job that you define further down in this guide. According to the interface, you receive an incoming `Person` object, after which you transform it to an upper-cased `Person`. + +> **Note:** There is no requirement that the input and output types be the same. In fact, after one source of data is read, sometimes the application's data flow needs a different data type. + +Put together a batch job +---------------------------- + +Now you put together the actual batch job. Spring Batch provides many utility classes that reduce the need to write custom code. Instead, you can focus on the business logic. + + <@snippet path="src/main/java/hello/BatchConfiguration.java" prefix="complete"/> + +For starters, the `@EnableBatchProcessing` annotation adds many critical beans that support jobs and saves you a lot of leg work. + +Break it down: + + <@snippet "src/main/java/hello/BatchConfiguration.java" "readerwriterprocessor" "/complete"/> + +The first chunk of code defines the input, processor, and output. +- `reader()` creates an `ItemReader`. It looks for a file called `sample-data.csv` and parses each line item with enough information to turn it into a `Person`. +- `processor()` creates an instance of our `PersonItemProcessor` you defined earlier, meant to uppercase the data. +- `write(DataSource)` creates an `ItemWriter`. This one is aimed at a JDBC destination and automatically gets a copy of the dataSource created by `@EnableBatchProcessing`. It includes the SQL statement needed to insert a single `Person` driven by java bean properties. + +The next chunk focuses on the actual job configuration. + + <@snippet "src/main/java/hello/BatchConfiguration.java" "jobstep" "/complete"/> + +The first method defines the job and the second one defines a single step. Jobs are built from steps, where each step can involve a reader, a processor, and a writer. + +In this job definition, you need an incrementer because jobs use a database to maintain execution state. You then list each step, of which this job has only one step. The job ends, and the java API produces a perfectly configured job. + +In the step definition, you define how much data to write at a time. In this case, it writes up to ten records at a time. Next, you configure the reader, processor, and writer using the injected bits from earlier. + +> **Note:** chunk() is prefixed `` because it's a generic method. This represents the input and output types of each "chunk" of processing, and lines up with `ItemReader` and `ItemWriter`. + +Finally, you run the application. + + <@snippet "src/main/java/hello/BatchConfiguration.java" "templatemain" "/complete"/> + +This example uses a memory-based database (provided by `@EnableBatchProcessing`), meaning that when it's done, the data is gone. For demonstration purposes, there is extra code to create a `JdbcTemplate`, query the database, and print out the names of people the batch job inserts. + +## <@build_an_executable_jar/> + + +Run the batch job +----------------- + +Now you can run the job from the JAR as well, and distribute that as an executable artifact: + + $ java -jar target/${project_id}-complete-0.1.0.jar + + +The job prints out a line for each person that gets transformed. After the job runs, you can also see the output from querying the database. + +Summary +------- + +Congratulations! You built a batch job that ingested data from a spreadsheet, processed it, and wrote it to a database. diff --git a/README.md b/README.md index 863f1e659d..05f55db9ee 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ + # Getting Started: Creating a Batch Service What you'll build @@ -26,11 +27,13 @@ To **start from scratch**, move on to [Set up the project](#scratch). To **skip the basics**, do the following: - [Download][zip] and unzip the source repository for this guide, or clone it using [git](/understanding/git): -`git clone https://github.com/springframework-meta/{@project-name}.git` - - cd into `{@project-name}/initial` - - Jump ahead to [Create a resource representation class](#initial). +`git clone https://github.com/springframework-meta/gs-batch-processing.git` + - cd into `gs-batch-processing/initial` + - Jump ahead to [Create a business class](#initial). + +**When you're finished**, you can check your results against the code in `gs-batch-processing/complete`. +[zip]: https://github.com/springframework-meta/gs-batch-processing/archive/master.zip -**When you're finished**, you can check your results against the code in `{@project-name}/complete`. Set up the project @@ -56,7 +59,7 @@ In a project directory of your choosing, create the following subdirectory struc 4.0.0 org.springframework - gs-batch-processing-initial + gs-batch-processing-complete 0.1.0 @@ -76,6 +79,19 @@ In a project directory of your choosing, create the following subdirectory struc + + hello.BatchConfiguration + + + + + + org.apache.maven.plugins + maven-shade-plugin + + + + spring-snapshots @@ -100,15 +116,14 @@ In a project directory of your choosing, create the following subdirectory struc TODO: mention that we're using Spring Bootstrap's [_starter POMs_](../gs-bootstrap-starter) here. -> Note to experienced Maven users who don't use an external parent project: You can take out the project later, it's just there to reduce the amount of code you have to write to get started. - +Note to experienced Maven users who are unaccustomed to using an external parent project: you can take it out later, it's just there to reduce the amount of code you have to write to get started. ### Create business data Typically your customer or a business analyst supplies a spreadsheet. In this case, you make it up. `src/main/resources/sample-data.csv` -```text +```csv Jill,Doe Joe,Doe Justin,Doe @@ -423,30 +438,37 @@ Finally, you run the application. This example uses a memory-based database (provided by `@EnableBatchProcessing`), meaning that when it's done, the data is gone. For demonstration purposes, there is extra code to create a `JdbcTemplate`, query the database, and print out the names of people the batch job inserts. +### Build an executable JAR -Build an executable JAR ------------------------ -Add the following to your `pom.xml` file, keeping existing properties and plugins intact: +Now that your `Application` class is ready, you simply instruct the build system to create a single, executable jar containing everything. This makes it easy to ship, version, and deploy the service as an application throughout the development lifecycle, across different environments, and so forth. + +Add the following configuration to your existing Maven POM: `pom.xml` ```xml - - hello.BatchConfiguration - + + hello.Application + - - - - org.apache.maven.plugins - maven-shade-plugin - - - + + + + org.apache.maven.plugins + maven-shade-plugin + + + ``` -Create a single executable JAR file containing all necessary dependency classes: +The `start-class` property tells Maven to create a `META-INF/MANIFEST.MF` file with a `Main-Class: hello.Application` entry. This entry enables you to run the jar with `java -jar`. - $ mvn package +The [Maven Shade plugin][maven-shade-plugin] extracts classes from all jars on the classpath and builds a single "über-jar", which makes it more convenient to execute and transport your service. + +Now run the following to produce a single executable JAR file containing all necessary dependency classes and resources: + + mvn package + +[maven-shade-plugin]: https://maven.apache.org/plugins/maven-shade-plugin Run the batch job @@ -463,5 +485,3 @@ Summary ------- Congratulations! You built a batch job that ingested data from a spreadsheet, processed it, and wrote it to a database. - -[zip]: https://github.com/springframework-meta/gs-batch-processing/archive/master.zip diff --git a/complete/pom.xml b/complete/pom.xml index 3348c3f432..c5b5d7dcac 100644 --- a/complete/pom.xml +++ b/complete/pom.xml @@ -24,7 +24,6 @@ - hello.BatchConfiguration @@ -37,7 +36,6 @@ - diff --git a/complete/src/main/java/hello/BatchConfiguration.java b/complete/src/main/java/hello/BatchConfiguration.java index 1dd67ae470..5c995024c4 100644 --- a/complete/src/main/java/hello/BatchConfiguration.java +++ b/complete/src/main/java/hello/BatchConfiguration.java @@ -35,7 +35,7 @@ import org.springframework.jdbc.core.RowMapper; @EnableAutoConfiguration public class BatchConfiguration { - // {!begin#reader-writer-processor} + // {!begin readerwriterprocessor} @Bean public ItemReader reader() { FlatFileItemReader reader = new FlatFileItemReader(); @@ -64,9 +64,9 @@ public class BatchConfiguration { writer.setDataSource(dataSource); return writer; } - // {!end#reader-writer-processor} + // {!end readerwriterprocessor} - // {!begin#job-step} + // {!begin jobstep} @Bean public Job importUserJob(JobBuilderFactory jobs, Step s1) { return jobs.get("importUserJob") @@ -86,9 +86,9 @@ public class BatchConfiguration { .writer(writer) .build(); } - // {!end#job-step} + // {!end jobstep} - // {!begin#template-main} + // {!begin templatemain} @Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); @@ -106,5 +106,5 @@ public class BatchConfiguration { System.out.println("Found <" + person + "> in the database."); } } - // {!end#template-main} + // {!end templatemain} } From 840788c42eebc0cfeef9abd6fe1863f7d7560a25 Mon Sep 17 00:00:00 2001 From: Craig Walls Date: Tue, 9 Jul 2013 15:40:19 -0500 Subject: [PATCH 02/35] Add sidebar --- SIDEBAR.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 SIDEBAR.md diff --git a/SIDEBAR.md b/SIDEBAR.md new file mode 100644 index 0000000000..ffd5ffa6a4 --- /dev/null +++ b/SIDEBAR.md @@ -0,0 +1,31 @@ +### Related Resources + +There's more to data integration than is covered here. You may want to continue your exploration of Spring messaging and integration with the following + +### Getting Started Guides + +* [Integrating Data][gs-integration] +* [Capturing Stream Data][gs-capturing-stream-data] +* [Messaging with JMS][gs-messaging-jms] +* [Messaging with RabbitMQ][gs-messaging-rabbitmq] +* [Messaging with Redis][gs-messaging-redis] + +[gs-integration]: /guides/gs/integration/content +[gs-capturing-stream-data]: /guides/gs/capturing-stream-data/content +[gs-messaging-jms]: /guides/gs/messaging-rabbitmq/content +[gs-messaging-rabbitmq]: /guides/gs/messaging-rabbitmq/content +[gs-messaging-redis]: /guides/gs/messaging-redis/content + +### Tutorials + +* [Tutorial TBD][tut-tbd] + +[tut-tbd]: /guides/tutorials/tbd + +### Understanding + +* [REST][u-rest] +* [JSON][u-json] + +[u-rest]: /understanding/rest +[u-json]: /understanding/json \ No newline at end of file From 6e5344454506bead225091bb39e55da83830bae9 Mon Sep 17 00:00:00 2001 From: Craig Walls Date: Tue, 9 Jul 2013 15:42:17 -0500 Subject: [PATCH 03/35] Fix incorrect link in sidebar --- SIDEBAR.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SIDEBAR.md b/SIDEBAR.md index ffd5ffa6a4..123eebb02c 100644 --- a/SIDEBAR.md +++ b/SIDEBAR.md @@ -12,7 +12,7 @@ There's more to data integration than is covered here. You may want to continue [gs-integration]: /guides/gs/integration/content [gs-capturing-stream-data]: /guides/gs/capturing-stream-data/content -[gs-messaging-jms]: /guides/gs/messaging-rabbitmq/content +[gs-messaging-jms]: /guides/gs/messaging-jms/content [gs-messaging-rabbitmq]: /guides/gs/messaging-rabbitmq/content [gs-messaging-redis]: /guides/gs/messaging-redis/content From 59771e16c217a606ae5a7957fe856d3a0279773b Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Thu, 11 Jul 2013 11:16:15 -0500 Subject: [PATCH 04/35] Regenerate guides based on update to macros.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 05f55db9ee..41857c3afb 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ To **skip the basics**, do the following: Set up the project ------------------ -First you set up a basic build script. You can use any build system you like when building apps with Spring, but the code you need to work with [Maven](https://maven.apache.org) and [Gradle](http://gradle.org) is included here. If you're not familiar with either, refer to [Getting Started with Maven](../gs-maven/README.md) or [Getting Started with Gradle](../gs-gradle/README.md). +First you set up a basic build script. You can use any build system you like when building apps with Spring, but the code you need to work with [Maven](https://maven.apache.org) and [Gradle](http://gradle.org) is included here. If you're not familiar with either, refer to [Building Java Projects with Maven](../gs-maven/README.md) or [Building Java Projects with Gradle](../gs-gradle/README.md). ### Create the directory structure @@ -438,7 +438,7 @@ Finally, you run the application. This example uses a memory-based database (provided by `@EnableBatchProcessing`), meaning that when it's done, the data is gone. For demonstration purposes, there is extra code to create a `JdbcTemplate`, query the database, and print out the names of people the batch job inserts. -### Build an executable JAR +###Build an executable JAR Now that your `Application` class is ready, you simply instruct the build system to create a single, executable jar containing everything. This makes it easy to ship, version, and deploy the service as an application throughout the development lifecycle, across different environments, and so forth. From ec71f23e3d6eb56dd987b9163547d8ed3d576956 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Fri, 12 Jul 2013 08:13:32 -0500 Subject: [PATCH 05/35] Delete old README.src.md --- README.src.md | 134 -------------------------------------------------- 1 file changed, 134 deletions(-) delete mode 100644 README.src.md diff --git a/README.src.md b/README.src.md deleted file mode 100644 index 5824fe8217..0000000000 --- a/README.src.md +++ /dev/null @@ -1,134 +0,0 @@ -# Getting Started: Creating a Batch Service - -What you'll build ------------------ - -This guide walks you through creating a basic batch-driven solution. You build a service that imports data from a CSV spreadsheet, transforms it with custom code, and stores the final results in a database. - -What you'll need ----------------- - - - About 15 minutes - - {!include#prereq-editor-jdk-buildtools} - -## {!include#how-to-complete-this-guide} - - -Set up the project ------------------- -{!include#build-system-intro} - -{!include#create-directory-structure-hello} - -### Create a Maven POM - - {!include:initial/pom.xml} - -{!include#bootstrap-starter-pom-disclaimer} - -### Create business data - -Typically your customer or a business analyst supplies a spreadsheet. In this case, you make it up. - -`src/main/resources/sample-data.csv` -```text -Jill,Doe -Joe,Doe -Justin,Doe -Jane,Doe -John,Doe -``` - -This spreadsheet contains a first name and a last name on each row, separated by a comma. This is a fairly common pattern that Spring handles out-of-the-box, as you will see. - -### Define the destination for your data - -Next, you write a SQL script to create a table to store the data. - - {!include:complete/src/main/resources/schema.sql} - - -Create a business class ------------------------ - -Now that you see the format of data inputs and outputs, you write code to represent a row of data. - - {!include:complete/src/main/java/hello/Person.java} - -You can instantiate the `Person` class either with first and last name through a constructor, or by setting the properties. - -Create an intermediate processor --------------------------------- - -A common paradigm in batch processing is to ingest data, transform it, and then pipe it out somewhere else. Here you write a simple transformer that converts the names to uppercase. - - {!include:complete/src/main/java/hello/PersonItemProcessor.java} - -`PersonItemProcessor` implements Spring Batch's `ItemProcessor` interface. This makes it easy to wire the code into a batch job that you define further down in this guide. According to the interface, you receive an incoming `Person` object, after which you transform it to an upper-cased `Person`. - -> **Note:** There is no requirement that the input and output types be the same. In fact, after one source of data is read, sometimes the application's data flow needs a different data type. - -Put together a batch job ----------------------------- - -Now you put together the actual batch job. Spring Batch provides many utility classes that reduce the need to write custom code. Instead, you can focus on the business logic. - - {!include:complete/src/main/java/hello/BatchConfiguration.java} - -For starters, the `@EnableBatchProcessing` annotation adds many critical beans that support jobs and saves you a lot of leg work. - -Break it down: - - {!include:complete/src/main/java/hello/BatchConfiguration.java#reader-writer-processor} - -The first chunk of code defines the input, processor, and output. -- `reader()` creates an `ItemReader`. It looks for a file called `sample-data.csv` and parses each line item with enough information to turn it into a `Person`. -- `processor()` creates an instance of our `PersonItemProcessor` you defined earlier, meant to uppercase the data. -- `write(DataSource)` creates an `ItemWriter`. This one is aimed at a JDBC destination and automatically gets a copy of the dataSource created by `@EnableBatchProcessing`. It includes the SQL statement needed to insert a single `Person` driven by java bean properties. - -The next chunk focuses on the actual job configuration. - - {!include:complete/src/main/java/hello/BatchConfiguration.java#job-step} - -The first method defines the job and the second one defines a single step. Jobs are built from steps, where each step can involve a reader, a processor, and a writer. - -In this job definition, you need an incrementer because jobs use a database to maintain execution state. You then list each step, of which this job has only one step. The job ends, and the java API produces a perfectly configured job. - -In the step definition, you define how much data to write at a time. In this case, it writes up to ten records at a time. Next, you configure the reader, processor, and writer using the injected bits from earlier. - -> **Note:** chunk() is prefixed `` because it's a generic method. This represents the input and output types of each "chunk" of processing, and lines up with `ItemReader` and `ItemWriter`. - -Finally, you run the application. - - {!include:complete/src/main/java/hello/BatchConfiguration.java#template-main} - -This example uses a memory-based database (provided by `@EnableBatchProcessing`), meaning that when it's done, the data is gone. For demonstration purposes, there is extra code to create a `JdbcTemplate`, query the database, and print out the names of people the batch job inserts. - - -Build an executable JAR ------------------------ -Add the following to your `pom.xml` file, keeping existing properties and plugins intact: - - {!include:complete/pom.xml#shade-config} - -Create a single executable JAR file containing all necessary dependency classes: - - $ mvn package - - -Run the batch job ------------------ - -Now you can run the job from the JAR as well, and distribute that as an executable artifact: - - $ java -jar target/gs-batch-processing-complete-0.1.0.jar - - -The job prints out a line for each person that gets transformed. After the job runs, you can also see the output from querying the database. - -Summary -------- - -Congratulations! You built a batch job that ingested data from a spreadsheet, processed it, and wrote it to a database. - -[zip]: https://github.com/springframework-meta/gs-batch-processing/archive/master.zip From 326cf8ed836b4b738636e7bcf7073da39897de34 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Mon, 15 Jul 2013 08:54:28 -0400 Subject: [PATCH 06/35] Replace java -jar with run_the_application macro --- README.ftl.md | 9 +-------- README.md | 7 +++---- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/README.ftl.md b/README.ftl.md index c7ca7433d9..f72ac89238 100644 --- a/README.ftl.md +++ b/README.ftl.md @@ -102,14 +102,7 @@ This example uses a memory-based database (provided by `@EnableBatchProcessing`) ## <@build_an_executable_jar/> - -Run the batch job ------------------ - -Now you can run the job from the JAR as well, and distribute that as an executable artifact: - - $ java -jar target/${project_id}-complete-0.1.0.jar - +<@run_the_application module="batch job"/> The job prints out a line for each person that gets transformed. After the job runs, you can also see the output from querying the database. diff --git a/README.md b/README.md index 41857c3afb..49f3ec3b36 100644 --- a/README.md +++ b/README.md @@ -470,13 +470,12 @@ Now run the following to produce a single executable JAR file containing all nec [maven-shade-plugin]: https://maven.apache.org/plugins/maven-shade-plugin - Run the batch job ------------------ +------------------- +Run your batch job with `java -jar` at the command line: -Now you can run the job from the JAR as well, and distribute that as an executable artifact: + java -jar target/gs-batch-processing-0.1.0.jar - $ java -jar target/gs-batch-processing-complete-0.1.0.jar The job prints out a line for each person that gets transformed. After the job runs, you can also see the output from querying the database. From feea89d2e7aee6f06c8637b8e18e9e52dbdca0d9 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Mon, 15 Jul 2013 16:29:56 -0400 Subject: [PATCH 07/35] Renegerate guides based on updated macros.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 49f3ec3b36..38cd5d9e61 100644 --- a/README.md +++ b/README.md @@ -438,8 +438,6 @@ Finally, you run the application. This example uses a memory-based database (provided by `@EnableBatchProcessing`), meaning that when it's done, the data is gone. For demonstration purposes, there is extra code to create a `JdbcTemplate`, query the database, and print out the names of people the batch job inserts. -###Build an executable JAR - Now that your `Application` class is ready, you simply instruct the build system to create a single, executable jar containing everything. This makes it easy to ship, version, and deploy the service as an application throughout the development lifecycle, across different environments, and so forth. Add the following configuration to your existing Maven POM: From 2184958d38b4b5aad428925adcbfff0dc25d3dd6 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Wed, 17 Jul 2013 07:12:11 -0400 Subject: [PATCH 08/35] Update build_the_application macros to link in gs-convert-jar-to-war --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 38cd5d9e61..e312eac121 100644 --- a/README.md +++ b/README.md @@ -468,6 +468,8 @@ Now run the following to produce a single executable JAR file containing all nec [maven-shade-plugin]: https://maven.apache.org/plugins/maven-shade-plugin +> **Note:** The procedure above will create a runnable JAR. You can also opt to [build a classic WAR file](/guides/gs/gs-convert-jar-to-war) instead. + Run the batch job ------------------- Run your batch job with `java -jar` at the command line: From 47556b8a9144bfc9b8718d7b13b512c63c48c0f3 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Wed, 17 Jul 2013 07:22:31 -0400 Subject: [PATCH 09/35] Typo in macro. Regenerate guides --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e312eac121..b4399d1e37 100644 --- a/README.md +++ b/README.md @@ -468,7 +468,7 @@ Now run the following to produce a single executable JAR file containing all nec [maven-shade-plugin]: https://maven.apache.org/plugins/maven-shade-plugin -> **Note:** The procedure above will create a runnable JAR. You can also opt to [build a classic WAR file](/guides/gs/gs-convert-jar-to-war) instead. +> **Note:** The procedure above will create a runnable JAR. You can also opt to [build a classic WAR file](/guides/gs/convert-jar-to-war/content) instead. Run the batch job ------------------- From f3ff1f34a800a11cc08f1cbbcd415b319853e731 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Thu, 18 Jul 2013 10:41:06 -0400 Subject: [PATCH 10/35] Strip out -complete and -initial from artifacts. Regenerate guides suitably. --- README.md | 10 +++++----- complete/pom.xml | 2 +- initial/pom.xml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index b4399d1e37..445436b745 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ In a project directory of your choosing, create the following subdirectory struc 4.0.0 org.springframework - gs-batch-processing-complete + gs-batch-processing 0.1.0 @@ -451,8 +451,8 @@ Add the following configuration to your existing Maven POM: - org.apache.maven.plugins - maven-shade-plugin + org.springframework.zero + spring-package-maven-plugin @@ -460,13 +460,13 @@ Add the following configuration to your existing Maven POM: The `start-class` property tells Maven to create a `META-INF/MANIFEST.MF` file with a `Main-Class: hello.Application` entry. This entry enables you to run the jar with `java -jar`. -The [Maven Shade plugin][maven-shade-plugin] extracts classes from all jars on the classpath and builds a single "über-jar", which makes it more convenient to execute and transport your service. +The [Spring Package maven plugin][spring-package-maven-plugin] collects all the jars on the classpath and builds a single "über-jar", which makes it more convenient to execute and transport your service. Now run the following to produce a single executable JAR file containing all necessary dependency classes and resources: mvn package -[maven-shade-plugin]: https://maven.apache.org/plugins/maven-shade-plugin +[spring-package-maven-plugin]: https://github.com/SpringSource/spring-zero/tree/master/spring-package-maven-plugin > **Note:** The procedure above will create a runnable JAR. You can also opt to [build a classic WAR file](/guides/gs/convert-jar-to-war/content) instead. diff --git a/complete/pom.xml b/complete/pom.xml index c5b5d7dcac..4a9b790a3a 100644 --- a/complete/pom.xml +++ b/complete/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.springframework - gs-batch-processing-complete + gs-batch-processing 0.1.0 diff --git a/initial/pom.xml b/initial/pom.xml index 01fe2eee82..f53d907053 100644 --- a/initial/pom.xml +++ b/initial/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.springframework - gs-batch-processing-initial + gs-batch-processing 0.1.0 From f56b6ba306ab04fa466e673289675e6dea6d5f2f Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Thu, 18 Jul 2013 12:05:51 -0400 Subject: [PATCH 11/35] Update guides using complete/pom.xml to instead use initial/pom.xml --- README.ftl.md | 2 +- README.md | 13 ------------- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/README.ftl.md b/README.ftl.md index f72ac89238..d372719c9b 100644 --- a/README.ftl.md +++ b/README.ftl.md @@ -25,7 +25,7 @@ Set up the project ### Create a Maven POM - <@snippet path="pom.xml" prefix="complete"/> + <@snippet path="pom.xml" prefix="initial"/> <@bootstrap_starter_pom_disclaimer/> diff --git a/README.md b/README.md index 445436b745..2d896b5cc1 100644 --- a/README.md +++ b/README.md @@ -79,19 +79,6 @@ In a project directory of your choosing, create the following subdirectory struc - - hello.BatchConfiguration - - - - - - org.apache.maven.plugins - maven-shade-plugin - - - - spring-snapshots From f24bcd8547b044b5510a2e8a1a0d0609e6e5f187 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Thu, 18 Jul 2013 15:15:19 -0400 Subject: [PATCH 12/35] Regenerate guide based on macro updates from @btalbott --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2d896b5cc1..6bfdd6cb69 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ What you'll need How to complete this guide -------------------------- -Like all Spring's [Getting Started guides](/getting-started), you can start from scratch and complete each step, or you can bypass basic setup steps that are already familiar to you. Either way, you end up with working code. +Like all Spring's [Getting Started guides](guides/gs), you can start from scratch and complete each step, or you can bypass basic setup steps that are already familiar to you. Either way, you end up with working code. To **start from scratch**, move on to [Set up the project](#scratch). @@ -28,7 +28,7 @@ To **skip the basics**, do the following: - [Download][zip] and unzip the source repository for this guide, or clone it using [git](/understanding/git): `git clone https://github.com/springframework-meta/gs-batch-processing.git` - - cd into `gs-batch-processing/initial` + - cd into `gs-batch-processing/initial`. - Jump ahead to [Create a business class](#initial). **When you're finished**, you can check your results against the code in `gs-batch-processing/complete`. @@ -38,7 +38,7 @@ To **skip the basics**, do the following: Set up the project ------------------ -First you set up a basic build script. You can use any build system you like when building apps with Spring, but the code you need to work with [Maven](https://maven.apache.org) and [Gradle](http://gradle.org) is included here. If you're not familiar with either, refer to [Building Java Projects with Maven](../gs-maven/README.md) or [Building Java Projects with Gradle](../gs-gradle/README.md). +First you set up a basic build script. You can use any build system you like when building apps with Spring, but the code you need to work with [Maven](https://maven.apache.org) and [Gradle](http://gradle.org) is included here. If you're not familiar with either, refer to [Building Java Projects with Maven](guides/gs/maven/content) or [Building Java Projects with Gradle](guides/gs/gradle/content). ### Create the directory structure From 21d76a6886df4ca1e081eb933752703954bbe4a4 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Thu, 18 Jul 2013 15:38:39 -0400 Subject: [PATCH 13/35] Fixed typo in macro --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6bfdd6cb69..2a11c59b54 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ What you'll need How to complete this guide -------------------------- -Like all Spring's [Getting Started guides](guides/gs), you can start from scratch and complete each step, or you can bypass basic setup steps that are already familiar to you. Either way, you end up with working code. +Like all Spring's [Getting Started guides](/guides/gs), you can start from scratch and complete each step, or you can bypass basic setup steps that are already familiar to you. Either way, you end up with working code. To **start from scratch**, move on to [Set up the project](#scratch). @@ -38,7 +38,7 @@ To **skip the basics**, do the following: Set up the project ------------------ -First you set up a basic build script. You can use any build system you like when building apps with Spring, but the code you need to work with [Maven](https://maven.apache.org) and [Gradle](http://gradle.org) is included here. If you're not familiar with either, refer to [Building Java Projects with Maven](guides/gs/maven/content) or [Building Java Projects with Gradle](guides/gs/gradle/content). +First you set up a basic build script. You can use any build system you like when building apps with Spring, but the code you need to work with [Maven](https://maven.apache.org) and [Gradle](http://gradle.org) is included here. If you're not familiar with either, refer to [Building Java Projects with Maven](/guides/gs/maven/content) or [Building Java Projects with Gradle](/guides/gs/gradle/content). ### Create the directory structure From 7258dab628fa9a45ec0b25aa28dc029180269c23 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Mon, 22 Jul 2013 08:30:06 -0400 Subject: [PATCH 14/35] Renamed schema setup script to schema-all.sql --- complete/src/main/resources/{schema.sql => schema-all.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename complete/src/main/resources/{schema.sql => schema-all.sql} (100%) diff --git a/complete/src/main/resources/schema.sql b/complete/src/main/resources/schema-all.sql similarity index 100% rename from complete/src/main/resources/schema.sql rename to complete/src/main/resources/schema-all.sql From 5a0a5d7ff63278e897227ae90cb87eb632809367 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Mon, 22 Jul 2013 08:34:02 -0400 Subject: [PATCH 15/35] Convert to spring-package-maven-plugin and Spring Zero --- complete/pom.xml | 12 ++++++------ complete/src/main/java/hello/BatchConfiguration.java | 2 +- initial/pom.xml | 8 ++++---- .../main/resources/{schema.sql => schema-all.sql} | 0 4 files changed, 11 insertions(+), 11 deletions(-) rename initial/src/main/resources/{schema.sql => schema-all.sql} (100%) diff --git a/complete/pom.xml b/complete/pom.xml index 4a9b790a3a..b385f70fde 100644 --- a/complete/pom.xml +++ b/complete/pom.xml @@ -8,15 +8,15 @@ 0.1.0 - org.springframework.bootstrap - spring-bootstrap-starters + org.springframework.zero + spring-starter-parent 0.5.0.BUILD-SNAPSHOT - org.springframework.bootstrap - spring-bootstrap-batch-starter + org.springframework.zero + spring-starter-batch org.hsqldb @@ -31,8 +31,8 @@ - org.apache.maven.plugins - maven-shade-plugin + org.springframework.zero + spring-package-maven-plugin diff --git a/complete/src/main/java/hello/BatchConfiguration.java b/complete/src/main/java/hello/BatchConfiguration.java index 5c995024c4..f0b6fb8217 100644 --- a/complete/src/main/java/hello/BatchConfiguration.java +++ b/complete/src/main/java/hello/BatchConfiguration.java @@ -6,6 +6,7 @@ import java.util.List; import javax.sql.DataSource; +import org.springframework.autoconfigure.EnableAutoConfiguration; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; @@ -22,7 +23,6 @@ import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; import org.springframework.batch.item.file.mapping.DefaultLineMapper; import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; import org.springframework.bootstrap.SpringApplication; -import org.springframework.bootstrap.context.annotation.EnableAutoConfiguration; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/initial/pom.xml b/initial/pom.xml index f53d907053..0ff64866f6 100644 --- a/initial/pom.xml +++ b/initial/pom.xml @@ -8,15 +8,15 @@ 0.1.0 - org.springframework.bootstrap - spring-bootstrap-starters + org.springframework.zero + spring-starter-parent 0.5.0.BUILD-SNAPSHOT - org.springframework.bootstrap - spring-bootstrap-batch-starter + org.springframework.zero + spring-starter-batch org.hsqldb diff --git a/initial/src/main/resources/schema.sql b/initial/src/main/resources/schema-all.sql similarity index 100% rename from initial/src/main/resources/schema.sql rename to initial/src/main/resources/schema-all.sql From 1a8473d8e32180bfab7d17b9f28347a445f15385 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Mon, 22 Jul 2013 08:37:09 -0400 Subject: [PATCH 16/35] Edit guide base on updates --- README.ftl.md | 4 +++- README.md | 14 ++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/README.ftl.md b/README.ftl.md index d372719c9b..48ffddb7a6 100644 --- a/README.ftl.md +++ b/README.ftl.md @@ -41,7 +41,9 @@ This spreadsheet contains a first name and a last name on each row, separated by Next, you write a SQL script to create a table to store the data. - <@snippet path="src/main/resources/schema.sql" prefix="initial"/> + <@snippet path="src/main/resources/schema-all.sql" prefix="initial"/> + +> **Note:** Spring Zero runs `schema-@@platform@@` automatically during startup. `-all` is the default for all platforms. Create a business class diff --git a/README.md b/README.md index 2a11c59b54..2d626df2d5 100644 --- a/README.md +++ b/README.md @@ -63,15 +63,15 @@ In a project directory of your choosing, create the following subdirectory struc 0.1.0 - org.springframework.bootstrap - spring-bootstrap-starters + org.springframework.zero + spring-starter-parent 0.5.0.BUILD-SNAPSHOT - org.springframework.bootstrap - spring-bootstrap-batch-starter + org.springframework.zero + spring-starter-batch org.hsqldb @@ -124,7 +124,7 @@ This spreadsheet contains a first name and a last name on each row, separated by Next, you write a SQL script to create a table to store the data. -`src/main/resources/schema.sql` +`src/main/resources/schema-all.sql` ```sql DROP TABLE people IF EXISTS; @@ -135,6 +135,8 @@ CREATE TABLE people ( ); ``` +> **Note:** Spring Zero runs `schema-@@platform@@` automatically during startup. `-all` is the default for all platforms. + Create a business class ----------------------- @@ -228,6 +230,7 @@ import java.util.List; import javax.sql.DataSource; +import org.springframework.autoconfigure.EnableAutoConfiguration; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; @@ -244,7 +247,6 @@ import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; import org.springframework.batch.item.file.mapping.DefaultLineMapper; import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; import org.springframework.bootstrap.SpringApplication; -import org.springframework.bootstrap.context.annotation.EnableAutoConfiguration; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; From b7a1f10e4c1ee8c2fbe0efb21392164639295357 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Mon, 22 Jul 2013 08:38:03 -0400 Subject: [PATCH 17/35] Fix typo --- README.ftl.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.ftl.md b/README.ftl.md index 48ffddb7a6..3649666c8c 100644 --- a/README.ftl.md +++ b/README.ftl.md @@ -43,7 +43,7 @@ Next, you write a SQL script to create a table to store the data. <@snippet path="src/main/resources/schema-all.sql" prefix="initial"/> -> **Note:** Spring Zero runs `schema-@@platform@@` automatically during startup. `-all` is the default for all platforms. +> **Note:** Spring Zero runs `schema-@@platform@@.sql` automatically during startup. `-all` is the default for all platforms. Create a business class diff --git a/README.md b/README.md index 2d626df2d5..983b34e144 100644 --- a/README.md +++ b/README.md @@ -135,7 +135,7 @@ CREATE TABLE people ( ); ``` -> **Note:** Spring Zero runs `schema-@@platform@@` automatically during startup. `-all` is the default for all platforms. +> **Note:** Spring Zero runs `schema-@@platform@@.sql` automatically during startup. `-all` is the default for all platforms. Create a business class From 3cd4ae20df1f1a57f0b453bffa0f2de5b8838a18 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Tue, 23 Jul 2013 16:10:58 -0400 Subject: [PATCH 18/35] Replace java -jar with picketed code block --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 983b34e144..297070e993 100644 --- a/README.md +++ b/README.md @@ -453,7 +453,9 @@ The [Spring Package maven plugin][spring-package-maven-plugin] collects all the Now run the following to produce a single executable JAR file containing all necessary dependency classes and resources: - mvn package +```sh +$ mvn package +``` [spring-package-maven-plugin]: https://github.com/SpringSource/spring-zero/tree/master/spring-package-maven-plugin @@ -463,8 +465,9 @@ Run the batch job ------------------- Run your batch job with `java -jar` at the command line: - java -jar target/gs-batch-processing-0.1.0.jar - +```sh +$ java -jar target/gs-batch-processing-0.1.0.jar +``` The job prints out a line for each person that gets transformed. After the job runs, you can also see the output from querying the database. From 390a3780781720bb383b99055d165503cba0e665 Mon Sep 17 00:00:00 2001 From: Roy Clarkson Date: Fri, 26 Jul 2013 14:43:43 -0400 Subject: [PATCH 19/35] Update README to remove title --- README.ftl.md | 2 -- README.md | 2 -- 2 files changed, 4 deletions(-) diff --git a/README.ftl.md b/README.ftl.md index 3649666c8c..81c563becd 100644 --- a/README.ftl.md +++ b/README.ftl.md @@ -1,7 +1,5 @@ <#assign project_id="gs-batch-processing"> -# Getting Started: Creating a Batch Service - What you'll build ----------------- diff --git a/README.md b/README.md index 297070e993..aa9f24fea6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -# Getting Started: Creating a Batch Service - What you'll build ----------------- From b597faada0d3e90ea314ca816976ce8260023199 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Tue, 30 Jul 2013 10:19:08 -0400 Subject: [PATCH 20/35] Upgrade to Spring Boot --- README.md | 25 +++++++++++++++---------- complete/pom.xml | 12 ++++++------ initial/pom.xml | 8 ++++---- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index aa9f24fea6..2408eb5c7b 100644 --- a/README.md +++ b/README.md @@ -61,15 +61,15 @@ In a project directory of your choosing, create the following subdirectory struc 0.1.0 - org.springframework.zero - spring-starter-parent + org.springframework.boot + spring-boot-up-parent 0.5.0.BUILD-SNAPSHOT - org.springframework.zero - spring-starter-batch + org.springframework.boot + spring-boot-up-batch org.hsqldb @@ -99,7 +99,7 @@ In a project directory of your choosing, create the following subdirectory struc ``` -TODO: mention that we're using Spring Bootstrap's [_starter POMs_](../gs-bootstrap-starter) here. +TODO: mention that we're using Spring Boot's [_starter POMs_](../gs-bootstrap-starter) here. Note to experienced Maven users who are unaccustomed to using an external parent project: you can take it out later, it's just there to reduce the amount of code you have to write to get started. @@ -438,8 +438,8 @@ Add the following configuration to your existing Maven POM: - org.springframework.zero - spring-package-maven-plugin + org.springframework.boot + spring-boot-maven-plugin @@ -447,15 +447,20 @@ Add the following configuration to your existing Maven POM: The `start-class` property tells Maven to create a `META-INF/MANIFEST.MF` file with a `Main-Class: hello.Application` entry. This entry enables you to run the jar with `java -jar`. -The [Spring Package maven plugin][spring-package-maven-plugin] collects all the jars on the classpath and builds a single "über-jar", which makes it more convenient to execute and transport your service. +The [Spring Boot maven plugin][spring-boot-maven-plugin] collects all the jars on the classpath and builds a single "über-jar", which makes it more convenient to execute and transport your service. -Now run the following to produce a single executable JAR file containing all necessary dependency classes and resources: +Now run the following command to produce a single executable JAR file containing all necessary dependency classes and resources: ```sh $ mvn package ``` -[spring-package-maven-plugin]: https://github.com/SpringSource/spring-zero/tree/master/spring-package-maven-plugin +To run the package, run this: +```sh +$ mvn spring-boot:run +``` + +[spring-boot-maven-plugin]: https://github.com/SpringSource/spring-boot/tree/master/spring-boot-maven-plugin > **Note:** The procedure above will create a runnable JAR. You can also opt to [build a classic WAR file](/guides/gs/convert-jar-to-war/content) instead. diff --git a/complete/pom.xml b/complete/pom.xml index b385f70fde..3eac007e24 100644 --- a/complete/pom.xml +++ b/complete/pom.xml @@ -8,15 +8,15 @@ 0.1.0 - org.springframework.zero - spring-starter-parent + org.springframework.boot + spring-boot-up-parent 0.5.0.BUILD-SNAPSHOT - org.springframework.zero - spring-starter-batch + org.springframework.boot + spring-boot-up-batch org.hsqldb @@ -31,8 +31,8 @@ - org.springframework.zero - spring-package-maven-plugin + org.springframework.boot + spring-boot-maven-plugin diff --git a/initial/pom.xml b/initial/pom.xml index 0ff64866f6..2d9ad9e721 100644 --- a/initial/pom.xml +++ b/initial/pom.xml @@ -8,15 +8,15 @@ 0.1.0 - org.springframework.zero - spring-starter-parent + org.springframework.boot + spring-boot-up-parent 0.5.0.BUILD-SNAPSHOT - org.springframework.zero - spring-starter-batch + org.springframework.boot + spring-boot-up-batch org.hsqldb From 5d2e49c5db9a57e953570804afb7c4788fe74e0f Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Wed, 31 Jul 2013 15:42:31 -0400 Subject: [PATCH 21/35] Convert spring-boot-up to spring-boot-starter --- README.ftl.md | 2 +- README.md | 8 ++++---- complete/pom.xml | 4 ++-- initial/pom.xml | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.ftl.md b/README.ftl.md index 81c563becd..cdff554925 100644 --- a/README.ftl.md +++ b/README.ftl.md @@ -41,7 +41,7 @@ Next, you write a SQL script to create a table to store the data. <@snippet path="src/main/resources/schema-all.sql" prefix="initial"/> -> **Note:** Spring Zero runs `schema-@@platform@@.sql` automatically during startup. `-all` is the default for all platforms. +> **Note:** Spring Boot runs `schema-@@platform@@.sql` automatically during startup. `-all` is the default for all platforms. Create a business class diff --git a/README.md b/README.md index 2408eb5c7b..637e01d7df 100644 --- a/README.md +++ b/README.md @@ -62,14 +62,14 @@ In a project directory of your choosing, create the following subdirectory struc org.springframework.boot - spring-boot-up-parent + spring-boot-starter-parent 0.5.0.BUILD-SNAPSHOT org.springframework.boot - spring-boot-up-batch + spring-boot-starter-batch org.hsqldb @@ -99,7 +99,7 @@ In a project directory of your choosing, create the following subdirectory struc ``` -TODO: mention that we're using Spring Boot's [_starter POMs_](../gs-bootstrap-starter) here. +This guide is using [Spring Boot's starter POMs](/guides/gs/spring-boot/content). Note to experienced Maven users who are unaccustomed to using an external parent project: you can take it out later, it's just there to reduce the amount of code you have to write to get started. @@ -133,7 +133,7 @@ CREATE TABLE people ( ); ``` -> **Note:** Spring Zero runs `schema-@@platform@@.sql` automatically during startup. `-all` is the default for all platforms. +> **Note:** Spring Boot runs `schema-@@platform@@.sql` automatically during startup. `-all` is the default for all platforms. Create a business class diff --git a/complete/pom.xml b/complete/pom.xml index 3eac007e24..57ba7a912c 100644 --- a/complete/pom.xml +++ b/complete/pom.xml @@ -9,14 +9,14 @@ org.springframework.boot - spring-boot-up-parent + spring-boot-starter-parent 0.5.0.BUILD-SNAPSHOT org.springframework.boot - spring-boot-up-batch + spring-boot-starter-batch org.hsqldb diff --git a/initial/pom.xml b/initial/pom.xml index 2d9ad9e721..906f58e2c0 100644 --- a/initial/pom.xml +++ b/initial/pom.xml @@ -9,14 +9,14 @@ org.springframework.boot - spring-boot-up-parent + spring-boot-starter-parent 0.5.0.BUILD-SNAPSHOT org.springframework.boot - spring-boot-up-batch + spring-boot-starter-batch org.hsqldb From 9b690558be9d129efa48c2be921c94624be2a980 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Thu, 1 Aug 2013 14:32:05 -0400 Subject: [PATCH 22/35] Edit guide to properly use spring-boot:run --- README.ftl.md | 2 +- README.md | 11 +++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/README.ftl.md b/README.ftl.md index cdff554925..bf9048d4c1 100644 --- a/README.ftl.md +++ b/README.ftl.md @@ -102,7 +102,7 @@ This example uses a memory-based database (provided by `@EnableBatchProcessing`) ## <@build_an_executable_jar/> -<@run_the_application module="batch job"/> +<@run_the_application_with_maven module="batch job"/> The job prints out a line for each person that gets transformed. After the job runs, you can also see the output from querying the database. diff --git a/README.md b/README.md index 637e01d7df..3c61e60b00 100644 --- a/README.md +++ b/README.md @@ -445,7 +445,7 @@ Add the following configuration to your existing Maven POM: ``` -The `start-class` property tells Maven to create a `META-INF/MANIFEST.MF` file with a `Main-Class: hello.Application` entry. This entry enables you to run the jar with `java -jar`. +The `start-class` property tells Maven to create a `META-INF/MANIFEST.MF` file with a `Main-Class: hello.Application` entry. This entry enables you to run it with `mvn spring-boot:run` (or simply run the jar itself with `java -jar`). The [Spring Boot maven plugin][spring-boot-maven-plugin] collects all the jars on the classpath and builds a single "über-jar", which makes it more convenient to execute and transport your service. @@ -455,21 +455,16 @@ Now run the following command to produce a single executable JAR file containing $ mvn package ``` -To run the package, run this: -```sh -$ mvn spring-boot:run -``` - [spring-boot-maven-plugin]: https://github.com/SpringSource/spring-boot/tree/master/spring-boot-maven-plugin > **Note:** The procedure above will create a runnable JAR. You can also opt to [build a classic WAR file](/guides/gs/convert-jar-to-war/content) instead. Run the batch job ------------------- -Run your batch job with `java -jar` at the command line: +Run your batch job using the spring-boot plugin at the command line: ```sh -$ java -jar target/gs-batch-processing-0.1.0.jar +$ mvn spring-boot:run ``` From 2d82989dbd4bfa0aad131a1ef3bbdb779949d50f Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Thu, 1 Aug 2013 21:37:36 -0400 Subject: [PATCH 23/35] Add gradle support --- complete/build.gradle | 34 ++++ complete/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49875 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + complete/gradlew | 164 ++++++++++++++++++ complete/gradlew.bat | 90 ++++++++++ .../main/java/hello/BatchConfiguration.java | 4 +- initial/build.gradle | 33 ++++ initial/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49875 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + initial/gradlew | 164 ++++++++++++++++++ initial/gradlew.bat | 90 ++++++++++ 11 files changed, 589 insertions(+), 2 deletions(-) create mode 100644 complete/build.gradle create mode 100644 complete/gradle/wrapper/gradle-wrapper.jar create mode 100644 complete/gradle/wrapper/gradle-wrapper.properties create mode 100755 complete/gradlew create mode 100644 complete/gradlew.bat create mode 100644 initial/build.gradle create mode 100644 initial/gradle/wrapper/gradle-wrapper.jar create mode 100644 initial/gradle/wrapper/gradle-wrapper.properties create mode 100755 initial/gradlew create mode 100644 initial/gradlew.bat diff --git a/complete/build.gradle b/complete/build.gradle new file mode 100644 index 0000000000..5b2410a925 --- /dev/null +++ b/complete/build.gradle @@ -0,0 +1,34 @@ +buildscript { + repositories { + maven { url "http://repo.springsource.org/libs-snapshot" } + mavenLocal() + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:0.5.0.BUILD-SNAPSHOT") + } +} + +apply plugin: 'java' +apply plugin: 'eclipse' +apply plugin: 'idea' +apply plugin: 'spring-boot' + +jar { + baseName = 'gs-batch-processing' + version = '0.1.0' +} + +repositories { + mavenCentral() + maven { url "http://repo.springsource.org/libs-snapshot" } +} + +dependencies { + compile("org.springframework.boot:spring-boot-starter-batch:0.5.0.BUILD-SNAPSHOT") + compile("org.hsqldb:hsqldb") + testCompile("junit:junit:4.11") +} + +task wrapper(type: Wrapper) { + gradleVersion = '1.6' +} diff --git a/complete/gradle/wrapper/gradle-wrapper.jar b/complete/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..a7634b071cb255e91a4572934e55b8cd8877b3e4 GIT binary patch literal 49875 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 DCvKB) literal 0 HcmV?d00001 diff --git a/complete/gradle/wrapper/gradle-wrapper.properties b/complete/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..0e3f5d4e5a --- /dev/null +++ b/complete/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Aug 01 15:26:36 EDT 2013 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=http\://services.gradle.org/distributions/gradle-1.6-bin.zip diff --git a/complete/gradlew b/complete/gradlew new file mode 100755 index 0000000000..91a7e269e1 --- /dev/null +++ b/complete/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/complete/gradlew.bat b/complete/gradlew.bat new file mode 100644 index 0000000000..8a0b282aa6 --- /dev/null +++ b/complete/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/complete/src/main/java/hello/BatchConfiguration.java b/complete/src/main/java/hello/BatchConfiguration.java index f0b6fb8217..03e27eb1eb 100644 --- a/complete/src/main/java/hello/BatchConfiguration.java +++ b/complete/src/main/java/hello/BatchConfiguration.java @@ -6,7 +6,7 @@ import java.util.List; import javax.sql.DataSource; -import org.springframework.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; @@ -22,7 +22,7 @@ import org.springframework.batch.item.file.FlatFileItemReader; import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; import org.springframework.batch.item.file.mapping.DefaultLineMapper; import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; -import org.springframework.bootstrap.SpringApplication; +import org.springframework.boot.SpringApplication; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/initial/build.gradle b/initial/build.gradle new file mode 100644 index 0000000000..f6ab8d5a8c --- /dev/null +++ b/initial/build.gradle @@ -0,0 +1,33 @@ +buildscript { + repositories { + maven { url "http://repo.springsource.org/libs-snapshot" } + mavenLocal() + } + dependencies { + classpath("org.springframework.boot:spring-boot-gradle-plugin:0.5.0.BUILD-SNAPSHOT") + } +} + +apply plugin: 'java' +apply plugin: 'eclipse' +apply plugin: 'idea' + +jar { + baseName = 'gs-batch-processing' + version = '0.1.0' +} + +repositories { + mavenCentral() + maven { url "http://repo.springsource.org/libs-snapshot" } +} + +dependencies { + compile("org.springframework.boot:spring-boot-starter-batch:0.5.0.BUILD-SNAPSHOT") + compile("org.hsqldb:hsqldb") + testCompile("junit:junit:4.11") +} + +task wrapper(type: Wrapper) { + gradleVersion = '1.6' +} diff --git a/initial/gradle/wrapper/gradle-wrapper.jar b/initial/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..a7634b071cb255e91a4572934e55b8cd8877b3e4 GIT binary patch literal 49875 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 DCvKB) literal 0 HcmV?d00001 diff --git a/initial/gradle/wrapper/gradle-wrapper.properties b/initial/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..0e3f5d4e5a --- /dev/null +++ b/initial/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Aug 01 15:26:36 EDT 2013 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=http\://services.gradle.org/distributions/gradle-1.6-bin.zip diff --git a/initial/gradlew b/initial/gradlew new file mode 100755 index 0000000000..91a7e269e1 --- /dev/null +++ b/initial/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/initial/gradlew.bat b/initial/gradlew.bat new file mode 100644 index 0000000000..8a0b282aa6 --- /dev/null +++ b/initial/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega From e4df0c86329f69ce21613df60ca569e2ae47798b Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Tue, 6 Aug 2013 11:23:51 -0500 Subject: [PATCH 24/35] Remove 'TODO' from pom.xml and rebuild guide --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3c61e60b00..f783a0b2bb 100644 --- a/README.md +++ b/README.md @@ -228,7 +228,7 @@ import java.util.List; import javax.sql.DataSource; -import org.springframework.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; @@ -244,7 +244,7 @@ import org.springframework.batch.item.file.FlatFileItemReader; import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; import org.springframework.batch.item.file.mapping.DefaultLineMapper; import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; -import org.springframework.bootstrap.SpringApplication; +import org.springframework.boot.SpringApplication; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; From 6a68df49271ffb8c7b6b274dfc9c0ca6cdb02f8e Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Tue, 6 Aug 2013 14:43:29 -0500 Subject: [PATCH 25/35] Use libs-snapshot instead of snapshot --- README.md | 6 +++--- complete/pom.xml | 6 +++--- initial/pom.xml | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index f783a0b2bb..4b85cfad88 100644 --- a/README.md +++ b/README.md @@ -80,19 +80,19 @@ In a project directory of your choosing, create the following subdirectory struc spring-snapshots - http://repo.springsource.org/snapshot + http://repo.springsource.org/libs-snapshot true spring-milestones - http://repo.springsource.org/milestone + http://repo.springsource.org/libs-milestone true spring-snapshots - http://repo.springsource.org/snapshot + http://repo.springsource.org/libs-snapshot true diff --git a/complete/pom.xml b/complete/pom.xml index 57ba7a912c..ee41ee7467 100644 --- a/complete/pom.xml +++ b/complete/pom.xml @@ -40,19 +40,19 @@ spring-snapshots - http://repo.springsource.org/snapshot + http://repo.springsource.org/libs-snapshot true spring-milestones - http://repo.springsource.org/milestone + http://repo.springsource.org/libs-milestone true spring-snapshots - http://repo.springsource.org/snapshot + http://repo.springsource.org/libs-snapshot true diff --git a/initial/pom.xml b/initial/pom.xml index 906f58e2c0..c31944b9ef 100644 --- a/initial/pom.xml +++ b/initial/pom.xml @@ -27,19 +27,19 @@ spring-snapshots - http://repo.springsource.org/snapshot + http://repo.springsource.org/libs-snapshot true spring-milestones - http://repo.springsource.org/milestone + http://repo.springsource.org/libs-milestone true spring-snapshots - http://repo.springsource.org/snapshot + http://repo.springsource.org/libs-snapshot true From 5b1dd74f38a918635f710a286101b1a088382a2b Mon Sep 17 00:00:00 2001 From: Roy Clarkson Date: Wed, 7 Aug 2013 17:08:12 -0400 Subject: [PATCH 26/35] Add run.sh for CI support --- test/run.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100755 test/run.sh diff --git a/test/run.sh b/test/run.sh new file mode 100755 index 0000000000..9603867b7a --- /dev/null +++ b/test/run.sh @@ -0,0 +1,13 @@ +#!/bin/sh +cd $(dirname $0) +cd ../complete +mvn clean package +rm -rf target +./gradlew build +rm -rf build +cd ../initial +mvn clean package +rm -rf target +./gradlew build +rm -rf build +exit $ret From 82b2bed8805bdd7c3cbe19ec1ae6fb4e23243a48 Mon Sep 17 00:00:00 2001 From: Roy Clarkson Date: Wed, 7 Aug 2013 23:17:45 -0400 Subject: [PATCH 27/35] Update run.sh --- test/run.sh | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/test/run.sh b/test/run.sh index 9603867b7a..4f3ce42d1e 100755 --- a/test/run.sh +++ b/test/run.sh @@ -1,13 +1,36 @@ #!/bin/sh cd $(dirname $0) + cd ../complete + mvn clean package -rm -rf target -./gradlew build -rm -rf build -cd ../initial -mvn clean package -rm -rf target -./gradlew build -rm -rf build +ret=$? +if [ $ret -ne 0 ]; then exit $ret +fi +rm -rf target + +./gradlew build +ret=$? +if [ $ret -ne 0 ]; then +exit $ret +fi +rm -rf build + +cd ../initial + +mvn clean package +ret=$? +if [ $ret -ne 0 ]; then +exit $ret +fi +rm -rf target + +./gradlew build +ret=$? +if [ $ret -ne 0 ]; then +exit $ret +fi +rm -rf build + +exit From 1fd1cfd9a62318640a2f7239b35a3cd8f0b768dd Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Thu, 8 Aug 2013 10:38:40 +0200 Subject: [PATCH 28/35] Replace /content with / in GSG links [Delivers #54822628] --- README.md | 6 +++--- SIDEBAR.md | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 4b85cfad88..be7ae91976 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ To **skip the basics**, do the following: Set up the project ------------------ -First you set up a basic build script. You can use any build system you like when building apps with Spring, but the code you need to work with [Maven](https://maven.apache.org) and [Gradle](http://gradle.org) is included here. If you're not familiar with either, refer to [Building Java Projects with Maven](/guides/gs/maven/content) or [Building Java Projects with Gradle](/guides/gs/gradle/content). +First you set up a basic build script. You can use any build system you like when building apps with Spring, but the code you need to work with [Maven](https://maven.apache.org) and [Gradle](http://gradle.org) is included here. If you're not familiar with either, refer to [Building Java Projects with Maven](/guides/gs/maven/) or [Building Java Projects with Gradle](/guides/gs/gradle/). ### Create the directory structure @@ -99,7 +99,7 @@ In a project directory of your choosing, create the following subdirectory struc ``` -This guide is using [Spring Boot's starter POMs](/guides/gs/spring-boot/content). +This guide is using [Spring Boot's starter POMs](/guides/gs/spring-boot/). Note to experienced Maven users who are unaccustomed to using an external parent project: you can take it out later, it's just there to reduce the amount of code you have to write to get started. @@ -457,7 +457,7 @@ $ mvn package [spring-boot-maven-plugin]: https://github.com/SpringSource/spring-boot/tree/master/spring-boot-maven-plugin -> **Note:** The procedure above will create a runnable JAR. You can also opt to [build a classic WAR file](/guides/gs/convert-jar-to-war/content) instead. +> **Note:** The procedure above will create a runnable JAR. You can also opt to [build a classic WAR file](/guides/gs/convert-jar-to-war/) instead. Run the batch job ------------------- diff --git a/SIDEBAR.md b/SIDEBAR.md index 123eebb02c..6c77ff22a4 100644 --- a/SIDEBAR.md +++ b/SIDEBAR.md @@ -10,11 +10,11 @@ There's more to data integration than is covered here. You may want to continue * [Messaging with RabbitMQ][gs-messaging-rabbitmq] * [Messaging with Redis][gs-messaging-redis] -[gs-integration]: /guides/gs/integration/content -[gs-capturing-stream-data]: /guides/gs/capturing-stream-data/content -[gs-messaging-jms]: /guides/gs/messaging-jms/content -[gs-messaging-rabbitmq]: /guides/gs/messaging-rabbitmq/content -[gs-messaging-redis]: /guides/gs/messaging-redis/content +[gs-integration]: /guides/gs/integration/ +[gs-capturing-stream-data]: /guides/gs/capturing-stream-data/ +[gs-messaging-jms]: /guides/gs/messaging-jms/ +[gs-messaging-rabbitmq]: /guides/gs/messaging-rabbitmq/ +[gs-messaging-redis]: /guides/gs/messaging-redis/ ### Tutorials From 5992da45b3b116d99c640c16e34092be7a16beba Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Thu, 8 Aug 2013 10:13:42 -0500 Subject: [PATCH 29/35] Add intro sentence --- README.ftl.md | 3 ++- README.md | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.ftl.md b/README.ftl.md index bf9048d4c1..b11bb0fa6d 100644 --- a/README.ftl.md +++ b/README.ftl.md @@ -1,9 +1,10 @@ <#assign project_id="gs-batch-processing"> +This guide walks you through creating a basic batch-driven solution. What you'll build ----------------- -This guide walks you through creating a basic batch-driven solution. You build a service that imports data from a CSV spreadsheet, transforms it with custom code, and stores the final results in a database. +You build a service that imports data from a CSV spreadsheet, transforms it with custom code, and stores the final results in a database. What you'll need ---------------- diff --git a/README.md b/README.md index be7ae91976..6ea42c29c1 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ +This guide walks you through creating a basic batch-driven solution. What you'll build ----------------- -This guide walks you through creating a basic batch-driven solution. You build a service that imports data from a CSV spreadsheet, transforms it with custom code, and stores the final results in a database. +You build a service that imports data from a CSV spreadsheet, transforms it with custom code, and stores the final results in a database. What you'll need ---------------- @@ -36,7 +37,7 @@ To **skip the basics**, do the following: Set up the project ------------------ -First you set up a basic build script. You can use any build system you like when building apps with Spring, but the code you need to work with [Maven](https://maven.apache.org) and [Gradle](http://gradle.org) is included here. If you're not familiar with either, refer to [Building Java Projects with Maven](/guides/gs/maven/) or [Building Java Projects with Gradle](/guides/gs/gradle/). +First you set up a basic build script. You can use any build system you like when building apps with Spring, but the code you need to work with [Maven](https://maven.apache.org) and [Gradle](http://gradle.org) is included here. If you're not familiar with either, refer to [Building Java Projects with Maven](/guides/gs/maven) or [Building Java Projects with Gradle](/guides/gs/gradle/). ### Create the directory structure From fc8fc09804348e8cf701fea769610e607e4ca089 Mon Sep 17 00:00:00 2001 From: Roy Clarkson Date: Thu, 8 Aug 2013 18:08:44 -0400 Subject: [PATCH 30/35] Detab poms and source --- README.md | 324 +++++++++--------- complete/pom.xml | 71 ++-- .../main/java/hello/BatchConfiguration.java | 132 +++---- complete/src/main/java/hello/Person.java | 23 +- .../main/java/hello/PersonItemProcessor.java | 6 +- complete/src/main/resources/schema-all.sql | 6 +- initial/pom.xml | 49 ++- initial/src/main/resources/schema-all.sql | 6 +- 8 files changed, 307 insertions(+), 310 deletions(-) diff --git a/README.md b/README.md index 6ea42c29c1..831463a254 100644 --- a/README.md +++ b/README.md @@ -54,12 +54,12 @@ In a project directory of your choosing, create the following subdirectory struc ```xml - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - org.springframework - gs-batch-processing - 0.1.0 + org.springframework + gs-batch-processing + 0.1.0 org.springframework.boot @@ -67,7 +67,7 @@ In a project directory of your choosing, create the following subdirectory struc 0.5.0.BUILD-SNAPSHOT - + org.springframework.boot spring-boot-starter-batch @@ -76,27 +76,24 @@ In a project directory of your choosing, create the following subdirectory struc org.hsqldb hsqldb - + + + + + spring-snapshots + http://repo.springsource.org/libs-snapshot + true + + + + + + spring-snapshots + http://repo.springsource.org/libs-snapshot + true + + - - - spring-snapshots - http://repo.springsource.org/libs-snapshot - true - - - spring-milestones - http://repo.springsource.org/libs-milestone - true - - - - - spring-snapshots - http://repo.springsource.org/libs-snapshot - true - - ``` @@ -128,9 +125,9 @@ Next, you write a SQL script to create a table to store the data. DROP TABLE people IF EXISTS; CREATE TABLE people ( - person_id BIGINT IDENTITY NOT NULL PRIMARY KEY, - first_name VARCHAR(20), - last_name VARCHAR(20) + person_id BIGINT IDENTITY NOT NULL PRIMARY KEY, + first_name VARCHAR(20), + last_name VARCHAR(20) ); ``` @@ -149,19 +146,19 @@ package hello; public class Person { private String lastName; private String firstName; - + public Person() { - + } - public Person(String firstName, String lastName) { - this.firstName = firstName; - this.lastName = lastName; - } + public Person(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } - public void setFirstName(String firstName) { - this.firstName = firstName; - } + public void setFirstName(String firstName) { + this.firstName = firstName; + } public String getFirstName() { return firstName; @@ -172,13 +169,14 @@ public class Person { } public void setLastName(String lastName) { - this.lastName = lastName; - } + this.lastName = lastName; + } @Override public String toString() { return "firstName: " + firstName + ", lastName: " + lastName; } + } ``` @@ -196,17 +194,19 @@ package hello; import org.springframework.batch.item.ItemProcessor; public class PersonItemProcessor implements ItemProcessor { + @Override public Person process(final Person person) throws Exception { final String firstName = person.getFirstName().toUpperCase(); final String lastName = person.getLastName().toUpperCase(); - + final Person transformedPerson = new Person(firstName, lastName); System.out.println("Converting (" + person + ") into (" + transformedPerson + ")"); - + return transformedPerson; } + } ``` @@ -258,72 +258,72 @@ import org.springframework.jdbc.core.RowMapper; @EnableAutoConfiguration public class BatchConfiguration { - @Bean - public ItemReader reader() { - FlatFileItemReader reader = new FlatFileItemReader(); - reader.setResource(new ClassPathResource("sample-data.csv")); - reader.setLineMapper(new DefaultLineMapper() {{ - setLineTokenizer(new DelimitedLineTokenizer() {{ - setNames(new String[] { "firstName", "lastName" }); - }}); - setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ - setTargetType(Person.class); - }}); - }}); - return reader; - } + @Bean + public ItemReader reader() { + FlatFileItemReader reader = new FlatFileItemReader(); + reader.setResource(new ClassPathResource("sample-data.csv")); + reader.setLineMapper(new DefaultLineMapper() {{ + setLineTokenizer(new DelimitedLineTokenizer() {{ + setNames(new String[] { "firstName", "lastName" }); + }}); + setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ + setTargetType(Person.class); + }}); + }}); + return reader; + } - @Bean - public ItemProcessor processor() { - return new PersonItemProcessor(); - } + @Bean + public ItemProcessor processor() { + return new PersonItemProcessor(); + } - @Bean - public ItemWriter writer(DataSource dataSource) { - JdbcBatchItemWriter writer = new JdbcBatchItemWriter(); - writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); - writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); - writer.setDataSource(dataSource); - return writer; - } + @Bean + public ItemWriter writer(DataSource dataSource) { + JdbcBatchItemWriter writer = new JdbcBatchItemWriter(); + writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); + writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); + writer.setDataSource(dataSource); + return writer; + } - @Bean - public Job importUserJob(JobBuilderFactory jobs, Step s1) { - return jobs.get("importUserJob") - .incrementer(new RunIdIncrementer()) - .flow(s1) - .end() - .build(); - } + @Bean + public Job importUserJob(JobBuilderFactory jobs, Step s1) { + return jobs.get("importUserJob") + .incrementer(new RunIdIncrementer()) + .flow(s1) + .end() + .build(); + } - @Bean - public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader reader, - ItemWriter writer, ItemProcessor processor) { - return stepBuilderFactory.get("step1") - . chunk(10) - .reader(reader) - .processor(processor) - .writer(writer) - .build(); - } + @Bean + public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader reader, + ItemWriter writer, ItemProcessor processor) { + return stepBuilderFactory.get("step1") + . chunk(10) + .reader(reader) + .processor(processor) + .writer(writer) + .build(); + } - @Bean - public JdbcTemplate jdbcTemplate(DataSource dataSource) { - return new JdbcTemplate(dataSource); - } + @Bean + public JdbcTemplate jdbcTemplate(DataSource dataSource) { + return new JdbcTemplate(dataSource); + } - public static void main(String[] args) { - ApplicationContext ctx = SpringApplication.run(BatchConfiguration.class, args); - List results = ctx.getBean(JdbcTemplate.class).query("SELECT first_name, last_name FROM people", new RowMapper() { - @Override - public Person mapRow(ResultSet rs, int row) throws SQLException { - return new Person(rs.getString(1), rs.getString(2)); - } - }); - for (Person person : results) { - System.out.println("Found <" + person + "> in the database."); - } - } + public static void main(String[] args) { + ApplicationContext ctx = SpringApplication.run(BatchConfiguration.class, args); + List results = ctx.getBean(JdbcTemplate.class).query("SELECT first_name, last_name FROM people", new RowMapper() { + @Override + public Person mapRow(ResultSet rs, int row) throws SQLException { + return new Person(rs.getString(1), rs.getString(2)); + } + }); + for (Person person : results) { + System.out.println("Found <" + person + "> in the database."); + } + } } ``` @@ -333,34 +333,34 @@ Break it down: `src/main/java/hello/BatchConfiguration.java` ```java - @Bean - public ItemReader reader() { - FlatFileItemReader reader = new FlatFileItemReader(); - reader.setResource(new ClassPathResource("sample-data.csv")); - reader.setLineMapper(new DefaultLineMapper() {{ - setLineTokenizer(new DelimitedLineTokenizer() {{ - setNames(new String[] { "firstName", "lastName" }); - }}); - setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ - setTargetType(Person.class); - }}); - }}); - return reader; - } + @Bean + public ItemReader reader() { + FlatFileItemReader reader = new FlatFileItemReader(); + reader.setResource(new ClassPathResource("sample-data.csv")); + reader.setLineMapper(new DefaultLineMapper() {{ + setLineTokenizer(new DelimitedLineTokenizer() {{ + setNames(new String[] { "firstName", "lastName" }); + }}); + setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ + setTargetType(Person.class); + }}); + }}); + return reader; + } - @Bean - public ItemProcessor processor() { - return new PersonItemProcessor(); - } + @Bean + public ItemProcessor processor() { + return new PersonItemProcessor(); + } - @Bean - public ItemWriter writer(DataSource dataSource) { - JdbcBatchItemWriter writer = new JdbcBatchItemWriter(); - writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); - writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); - writer.setDataSource(dataSource); - return writer; - } + @Bean + public ItemWriter writer(DataSource dataSource) { + JdbcBatchItemWriter writer = new JdbcBatchItemWriter(); + writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); + writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); + writer.setDataSource(dataSource); + return writer; + } ``` The first chunk of code defines the input, processor, and output. @@ -372,25 +372,25 @@ The next chunk focuses on the actual job configuration. `src/main/java/hello/BatchConfiguration.java` ```java - @Bean - public Job importUserJob(JobBuilderFactory jobs, Step s1) { - return jobs.get("importUserJob") - .incrementer(new RunIdIncrementer()) - .flow(s1) - .end() - .build(); - } + @Bean + public Job importUserJob(JobBuilderFactory jobs, Step s1) { + return jobs.get("importUserJob") + .incrementer(new RunIdIncrementer()) + .flow(s1) + .end() + .build(); + } - @Bean - public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader reader, - ItemWriter writer, ItemProcessor processor) { - return stepBuilderFactory.get("step1") - . chunk(10) - .reader(reader) - .processor(processor) - .writer(writer) - .build(); - } + @Bean + public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader reader, + ItemWriter writer, ItemProcessor processor) { + return stepBuilderFactory.get("step1") + . chunk(10) + .reader(reader) + .processor(processor) + .writer(writer) + .build(); + } ``` The first method defines the job and the second one defines a single step. Jobs are built from steps, where each step can involve a reader, a processor, and a writer. @@ -405,23 +405,23 @@ Finally, you run the application. `src/main/java/hello/BatchConfiguration.java` ```java - @Bean - public JdbcTemplate jdbcTemplate(DataSource dataSource) { - return new JdbcTemplate(dataSource); - } + @Bean + public JdbcTemplate jdbcTemplate(DataSource dataSource) { + return new JdbcTemplate(dataSource); + } - public static void main(String[] args) { - ApplicationContext ctx = SpringApplication.run(BatchConfiguration.class, args); - List results = ctx.getBean(JdbcTemplate.class).query("SELECT first_name, last_name FROM people", new RowMapper() { - @Override - public Person mapRow(ResultSet rs, int row) throws SQLException { - return new Person(rs.getString(1), rs.getString(2)); - } - }); - for (Person person : results) { - System.out.println("Found <" + person + "> in the database."); - } - } + public static void main(String[] args) { + ApplicationContext ctx = SpringApplication.run(BatchConfiguration.class, args); + List results = ctx.getBean(JdbcTemplate.class).query("SELECT first_name, last_name FROM people", new RowMapper() { + @Override + public Person mapRow(ResultSet rs, int row) throws SQLException { + return new Person(rs.getString(1), rs.getString(2)); + } + }); + for (Person person : results) { + System.out.println("Found <" + person + "> in the database."); + } + } ``` This example uses a memory-based database (provided by `@EnableBatchProcessing`), meaning that when it's done, the data is gone. For demonstration purposes, there is extra code to create a `JdbcTemplate`, query the database, and print out the names of people the batch job inserts. diff --git a/complete/pom.xml b/complete/pom.xml index ee41ee7467..4f99c5e196 100644 --- a/complete/pom.xml +++ b/complete/pom.xml @@ -1,11 +1,11 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - org.springframework - gs-batch-processing - 0.1.0 + org.springframework + gs-batch-processing + 0.1.0 org.springframework.boot @@ -13,7 +13,7 @@ 0.5.0.BUILD-SNAPSHOT - + org.springframework.boot spring-boot-starter-batch @@ -22,38 +22,35 @@ org.hsqldb hsqldb - + - - hello.BatchConfiguration - + + hello.BatchConfiguration + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + spring-snapshots + http://repo.springsource.org/libs-snapshot + true + + + + + + spring-snapshots + http://repo.springsource.org/libs-snapshot + true + + - - - spring-snapshots - http://repo.springsource.org/libs-snapshot - true - - - spring-milestones - http://repo.springsource.org/libs-milestone - true - - - - - spring-snapshots - http://repo.springsource.org/libs-snapshot - true - - diff --git a/complete/src/main/java/hello/BatchConfiguration.java b/complete/src/main/java/hello/BatchConfiguration.java index 03e27eb1eb..f5e9230719 100644 --- a/complete/src/main/java/hello/BatchConfiguration.java +++ b/complete/src/main/java/hello/BatchConfiguration.java @@ -35,76 +35,76 @@ import org.springframework.jdbc.core.RowMapper; @EnableAutoConfiguration public class BatchConfiguration { - // {!begin readerwriterprocessor} - @Bean - public ItemReader reader() { - FlatFileItemReader reader = new FlatFileItemReader(); - reader.setResource(new ClassPathResource("sample-data.csv")); - reader.setLineMapper(new DefaultLineMapper() {{ - setLineTokenizer(new DelimitedLineTokenizer() {{ - setNames(new String[] { "firstName", "lastName" }); - }}); - setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ - setTargetType(Person.class); - }}); - }}); - return reader; - } + // {!begin readerwriterprocessor} + @Bean + public ItemReader reader() { + FlatFileItemReader reader = new FlatFileItemReader(); + reader.setResource(new ClassPathResource("sample-data.csv")); + reader.setLineMapper(new DefaultLineMapper() {{ + setLineTokenizer(new DelimitedLineTokenizer() {{ + setNames(new String[] { "firstName", "lastName" }); + }}); + setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ + setTargetType(Person.class); + }}); + }}); + return reader; + } - @Bean - public ItemProcessor processor() { - return new PersonItemProcessor(); - } + @Bean + public ItemProcessor processor() { + return new PersonItemProcessor(); + } - @Bean - public ItemWriter writer(DataSource dataSource) { - JdbcBatchItemWriter writer = new JdbcBatchItemWriter(); - writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); - writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); - writer.setDataSource(dataSource); - return writer; - } - // {!end readerwriterprocessor} + @Bean + public ItemWriter writer(DataSource dataSource) { + JdbcBatchItemWriter writer = new JdbcBatchItemWriter(); + writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider()); + writer.setSql("INSERT INTO people (first_name, last_name) VALUES (:firstName, :lastName)"); + writer.setDataSource(dataSource); + return writer; + } + // {!end readerwriterprocessor} - // {!begin jobstep} - @Bean - public Job importUserJob(JobBuilderFactory jobs, Step s1) { - return jobs.get("importUserJob") - .incrementer(new RunIdIncrementer()) - .flow(s1) - .end() - .build(); - } + // {!begin jobstep} + @Bean + public Job importUserJob(JobBuilderFactory jobs, Step s1) { + return jobs.get("importUserJob") + .incrementer(new RunIdIncrementer()) + .flow(s1) + .end() + .build(); + } - @Bean - public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader reader, - ItemWriter writer, ItemProcessor processor) { - return stepBuilderFactory.get("step1") - . chunk(10) - .reader(reader) - .processor(processor) - .writer(writer) - .build(); - } - // {!end jobstep} + @Bean + public Step step1(StepBuilderFactory stepBuilderFactory, ItemReader reader, + ItemWriter writer, ItemProcessor processor) { + return stepBuilderFactory.get("step1") + . chunk(10) + .reader(reader) + .processor(processor) + .writer(writer) + .build(); + } + // {!end jobstep} - // {!begin templatemain} - @Bean - public JdbcTemplate jdbcTemplate(DataSource dataSource) { - return new JdbcTemplate(dataSource); - } + // {!begin templatemain} + @Bean + public JdbcTemplate jdbcTemplate(DataSource dataSource) { + return new JdbcTemplate(dataSource); + } - public static void main(String[] args) { - ApplicationContext ctx = SpringApplication.run(BatchConfiguration.class, args); - List results = ctx.getBean(JdbcTemplate.class).query("SELECT first_name, last_name FROM people", new RowMapper() { - @Override - public Person mapRow(ResultSet rs, int row) throws SQLException { - return new Person(rs.getString(1), rs.getString(2)); - } - }); - for (Person person : results) { - System.out.println("Found <" + person + "> in the database."); - } - } - // {!end templatemain} + public static void main(String[] args) { + ApplicationContext ctx = SpringApplication.run(BatchConfiguration.class, args); + List results = ctx.getBean(JdbcTemplate.class).query("SELECT first_name, last_name FROM people", new RowMapper() { + @Override + public Person mapRow(ResultSet rs, int row) throws SQLException { + return new Person(rs.getString(1), rs.getString(2)); + } + }); + for (Person person : results) { + System.out.println("Found <" + person + "> in the database."); + } + } + // {!end templatemain} } diff --git a/complete/src/main/java/hello/Person.java b/complete/src/main/java/hello/Person.java index 0cc17ed8a2..745c739150 100644 --- a/complete/src/main/java/hello/Person.java +++ b/complete/src/main/java/hello/Person.java @@ -3,19 +3,19 @@ package hello; public class Person { private String lastName; private String firstName; - + public Person() { - + } - public Person(String firstName, String lastName) { - this.firstName = firstName; - this.lastName = lastName; - } + public Person(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } - public void setFirstName(String firstName) { - this.firstName = firstName; - } + public void setFirstName(String firstName) { + this.firstName = firstName; + } public String getFirstName() { return firstName; @@ -26,11 +26,12 @@ public class Person { } public void setLastName(String lastName) { - this.lastName = lastName; - } + this.lastName = lastName; + } @Override public String toString() { return "firstName: " + firstName + ", lastName: " + lastName; } + } diff --git a/complete/src/main/java/hello/PersonItemProcessor.java b/complete/src/main/java/hello/PersonItemProcessor.java index 5256af777f..0752f5868b 100644 --- a/complete/src/main/java/hello/PersonItemProcessor.java +++ b/complete/src/main/java/hello/PersonItemProcessor.java @@ -3,15 +3,17 @@ package hello; import org.springframework.batch.item.ItemProcessor; public class PersonItemProcessor implements ItemProcessor { + @Override public Person process(final Person person) throws Exception { final String firstName = person.getFirstName().toUpperCase(); final String lastName = person.getLastName().toUpperCase(); - + final Person transformedPerson = new Person(firstName, lastName); System.out.println("Converting (" + person + ") into (" + transformedPerson + ")"); - + return transformedPerson; } + } diff --git a/complete/src/main/resources/schema-all.sql b/complete/src/main/resources/schema-all.sql index 4e405e6de6..e472ce1e8c 100644 --- a/complete/src/main/resources/schema-all.sql +++ b/complete/src/main/resources/schema-all.sql @@ -1,7 +1,7 @@ DROP TABLE people IF EXISTS; CREATE TABLE people ( - person_id BIGINT IDENTITY NOT NULL PRIMARY KEY, - first_name VARCHAR(20), - last_name VARCHAR(20) + person_id BIGINT IDENTITY NOT NULL PRIMARY KEY, + first_name VARCHAR(20), + last_name VARCHAR(20) ); diff --git a/initial/pom.xml b/initial/pom.xml index c31944b9ef..f40259867c 100644 --- a/initial/pom.xml +++ b/initial/pom.xml @@ -1,11 +1,11 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - org.springframework - gs-batch-processing - 0.1.0 + org.springframework + gs-batch-processing + 0.1.0 org.springframework.boot @@ -13,7 +13,7 @@ 0.5.0.BUILD-SNAPSHOT - + org.springframework.boot spring-boot-starter-batch @@ -22,25 +22,22 @@ org.hsqldb hsqldb - + + + + + spring-snapshots + http://repo.springsource.org/libs-snapshot + true + + + + + + spring-snapshots + http://repo.springsource.org/libs-snapshot + true + + - - - spring-snapshots - http://repo.springsource.org/libs-snapshot - true - - - spring-milestones - http://repo.springsource.org/libs-milestone - true - - - - - spring-snapshots - http://repo.springsource.org/libs-snapshot - true - - diff --git a/initial/src/main/resources/schema-all.sql b/initial/src/main/resources/schema-all.sql index 4e405e6de6..e472ce1e8c 100644 --- a/initial/src/main/resources/schema-all.sql +++ b/initial/src/main/resources/schema-all.sql @@ -1,7 +1,7 @@ DROP TABLE people IF EXISTS; CREATE TABLE people ( - person_id BIGINT IDENTITY NOT NULL PRIMARY KEY, - first_name VARCHAR(20), - last_name VARCHAR(20) + person_id BIGINT IDENTITY NOT NULL PRIMARY KEY, + first_name VARCHAR(20), + last_name VARCHAR(20) ); From 17d26dbfa133532483897c301a35af07a76cf24d Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Fri, 9 Aug 2013 12:03:58 -0500 Subject: [PATCH 31/35] Upgrade to Gradle 1.7 --- complete/build.gradle | 2 +- complete/gradle/wrapper/gradle-wrapper.jar | Bin 49875 -> 50518 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 ++-- initial/build.gradle | 2 +- initial/gradle/wrapper/gradle-wrapper.jar | Bin 49875 -> 50518 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 ++-- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/complete/build.gradle b/complete/build.gradle index 5b2410a925..4302c323d4 100644 --- a/complete/build.gradle +++ b/complete/build.gradle @@ -30,5 +30,5 @@ dependencies { } task wrapper(type: Wrapper) { - gradleVersion = '1.6' + gradleVersion = '1.7' } diff --git a/complete/gradle/wrapper/gradle-wrapper.jar b/complete/gradle/wrapper/gradle-wrapper.jar index a7634b071cb255e91a4572934e55b8cd8877b3e4..b979729db0ad460288cfe16f07072da7b1305e93 100644 GIT binary patch delta 23041 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 L6JdU-y1es$%|bZL delta 22385 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 L6JdU-y1es$%|bZL delta 22385 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 Date: Fri, 9 Aug 2013 13:18:06 -0500 Subject: [PATCH 32/35] Fix maven-compiler-plugin to version 2.3.2 --- README.md | 9 +++++++++ complete/pom.xml | 4 ++++ initial/pom.xml | 9 +++++++++ 3 files changed, 22 insertions(+) diff --git a/README.md b/README.md index 831463a254..29a730055f 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,15 @@ In a project directory of your choosing, create the following subdirectory struc + + + + maven-compiler-plugin + 2.3.2 + + + + spring-snapshots diff --git a/complete/pom.xml b/complete/pom.xml index 4f99c5e196..ede9dde20d 100644 --- a/complete/pom.xml +++ b/complete/pom.xml @@ -30,6 +30,10 @@ + + maven-compiler-plugin + 2.3.2 + org.springframework.boot spring-boot-maven-plugin diff --git a/initial/pom.xml b/initial/pom.xml index f40259867c..7cf86d5b3a 100644 --- a/initial/pom.xml +++ b/initial/pom.xml @@ -24,6 +24,15 @@ + + + + maven-compiler-plugin + 2.3.2 + + + + spring-snapshots From b9e2f3599b10d97e1a7904e78f43298c7ff67c6c Mon Sep 17 00:00:00 2001 From: Chris Beams Date: Sat, 10 Aug 2013 21:43:26 +0200 Subject: [PATCH 33/35] Capitalize /understanding/{subject} as approprite [#54951278] --- SIDEBAR.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SIDEBAR.md b/SIDEBAR.md index 6c77ff22a4..053f3ded6b 100644 --- a/SIDEBAR.md +++ b/SIDEBAR.md @@ -27,5 +27,5 @@ There's more to data integration than is covered here. You may want to continue * [REST][u-rest] * [JSON][u-json] -[u-rest]: /understanding/rest -[u-json]: /understanding/json \ No newline at end of file +[u-rest]: /understanding/REST +[u-json]: /understanding/JSON \ No newline at end of file From 2e0881ce5bf4aba057f4dda9f4db778fbb9cc090 Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Mon, 12 Aug 2013 14:12:24 -0500 Subject: [PATCH 34/35] Fix link to spring-boot-maven-plugin --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 29a730055f..815d352f46 100644 --- a/README.md +++ b/README.md @@ -465,7 +465,7 @@ Now run the following command to produce a single executable JAR file containing $ mvn package ``` -[spring-boot-maven-plugin]: https://github.com/SpringSource/spring-boot/tree/master/spring-boot-maven-plugin +[spring-boot-maven-plugin]: https://github.com/SpringSource/spring-boot/tree/master/spring-boot-tools/spring-boot-maven-plugin > **Note:** The procedure above will create a runnable JAR. You can also opt to [build a classic WAR file](/guides/gs/convert-jar-to-war/) instead. From 0928cea4d83331d93a310f1917ae103ef2439b8a Mon Sep 17 00:00:00 2001 From: Greg Turnquist Date: Mon, 12 Aug 2013 14:31:39 -0500 Subject: [PATCH 35/35] Replace Tutorial TBD with REST tutorial --- SIDEBAR.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SIDEBAR.md b/SIDEBAR.md index 053f3ded6b..5ff3c47a74 100644 --- a/SIDEBAR.md +++ b/SIDEBAR.md @@ -18,9 +18,9 @@ There's more to data integration than is covered here. You may want to continue ### Tutorials -* [Tutorial TBD][tut-tbd] +* [Designing and Implementing RESTful Web Services with Spring][tut-rest] -[tut-tbd]: /guides/tutorials/tbd +[tut-rest]: /guides/tutorials/rest ### Understanding