From 1e1c78408f7c4101420c227f791956bfb562b5db Mon Sep 17 00:00:00 2001 From: dsyer Date: Sun, 8 Feb 2009 18:22:49 +0000 Subject: [PATCH] Switch image locations and refactor docs build to load images in PDF --- docs/models/Figures.ppt | Bin 181760 -> 179712 bytes docs/pom.xml | 40 +- .../src/docbkx/resources/images/important.png | Bin 0 -> 1178 bytes docs/src/docbkx/resources/images/note.png | Bin 0 -> 1178 bytes docs/src/docbkx/resources/images/tip.png | Bin 0 -> 1178 bytes .../domain-chunck-view-classdiagram.gif | Bin 31787 -> 0 bytes docs/src/models/domain-classdiagram.dnx | 847 ---------- .../models/flat-file-input-source-design.dnx | 551 ------- docs/src/models/io-design.dnx | 1392 ----------------- docs/src/models/item-reader-design.dnx | 983 ------------ docs/src/models/item-stream-adapter.dnx | 353 ----- docs/src/models/repository-classdiagram.dnx | 482 ------ .../site/docbook/reference/arch-overview.xml | 1092 ++++++------- .../docbook/reference/common-patterns.xml | 4 +- .../docbook/reference/container-overview.xml | 2 +- docs/src/site/docbook/reference/domain.xml | 8 +- docs/src/site/docbook/reference/execution.xml | 12 +- docs/src/site/docbook/reference/job.xml | 10 +- .../docbook/reference/readersAndWriters.xml | 10 +- .../docbook/reference/schema-appendix.xml | 4 +- .../docbook/reference/spring-batch-intro.xml | 8 +- docs/src/site/docbook/reference/step.xml | 8 +- docs/src/site/docbook/reference/whatsnew.xml | 16 +- 23 files changed, 616 insertions(+), 5206 deletions(-) create mode 100644 docs/src/docbkx/resources/images/important.png create mode 100644 docs/src/docbkx/resources/images/note.png create mode 100644 docs/src/docbkx/resources/images/tip.png delete mode 100644 docs/src/models/domain-chunck-view-classdiagram.gif delete mode 100644 docs/src/models/domain-classdiagram.dnx delete mode 100644 docs/src/models/flat-file-input-source-design.dnx delete mode 100644 docs/src/models/io-design.dnx delete mode 100644 docs/src/models/item-reader-design.dnx delete mode 100644 docs/src/models/item-stream-adapter.dnx delete mode 100644 docs/src/models/repository-classdiagram.dnx diff --git a/docs/models/Figures.ppt b/docs/models/Figures.ppt index 983683c5a55a60d71e955ca5e99584d84fdefa5d..bcb2bd613ba047baef6387c0c4a92dcd289e2cd1 100644 GIT binary patch delta 98 zcmZqZ;cocDHNk*4kdXlb1Q-~CC)$d$1OWxMGah1E!Pvyq#>BXciD}WaeM~u=AKq#% zw&*y?7_z-|AJciJ=@kc=6sD&fWD=R)ageEEVu8T6LrhXk+ohH;J>y)qg^3FQUp^mt delta 174 zcmZqp!`0BkJ;8uCj*$TZ1Q-|+CfbU#!~+GkGp=A-!Pvyq#>BXciD}WYRZLvlKTKj0 zV8lgEGTpFj3lrD0B}_S-7hW7T-B5FqF>!n85~lM^(<^o|DNIjU&LlG3WjT|=#Da`% zE10C1l$jZPN|O_d6~YsXQaFH4@L?!rNM=Z6C}vP#2nW(d3@O_mPGXX0oMgHL08AY= AQvd(} diff --git a/docs/pom.xml b/docs/pom.xml index 28e12ed85..bb2eb4c1f 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -19,6 +19,9 @@ agilejava http://agilejava.com/maven + + false + @@ -35,17 +38,19 @@ generate-html - false ${basedir}/src/docbkx/resources/xsl/html.xsl - + - + + + + @@ -60,23 +65,34 @@ pre-site - multi-page + single-pdf generate-pdf + + + src/site/docbook/reference/ + src/docbkx/resources/images/ + + + + + pre-site + + + multi-page + generate-html true - ${basedir}/src/site/docbook/reference/ ${basedir}/src/docbkx/resources/xsl/html_chunk.xsl - - + - + @@ -105,7 +121,7 @@ runtime - + org.apache.xmlgraphics fop 0.93 @@ -113,10 +129,12 @@ index.xml + false + css/html.css + ${basedir}/src/site/docbook/reference ${basedir}/src/docbkx/resources/xsl/fopdf.xsl true - ${basedir}/src/site/docbook/reference version diff --git a/docs/src/docbkx/resources/images/important.png b/docs/src/docbkx/resources/images/important.png new file mode 100644 index 0000000000000000000000000000000000000000..ad57f6f72e2c4ecf45f1443887956132174516b5 GIT binary patch literal 1178 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 N@g?8#C6j;v06X*Ky^;U` diff --git a/docs/src/models/domain-classdiagram.dnx b/docs/src/models/domain-classdiagram.dnx deleted file mode 100644 index 8a3a3af86..000000000 --- a/docs/src/models/domain-classdiagram.dnx +++ /dev/null @@ -1,847 +0,0 @@ - - -?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/src/models/flat-file-input-source-design.dnx b/docs/src/models/flat-file-input-source-design.dnx deleted file mode 100644 index b18b0180a..000000000 --- a/docs/src/models/flat-file-input-source-design.dnx +++ /dev/null @@ -1,551 +0,0 @@ - - -?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/src/models/io-design.dnx b/docs/src/models/io-design.dnx deleted file mode 100644 index f5294f773..000000000 --- a/docs/src/models/io-design.dnx +++ /dev/null @@ -1,1392 +0,0 @@ - - -?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/src/models/item-reader-design.dnx b/docs/src/models/item-reader-design.dnx deleted file mode 100644 index 0a981fb08..000000000 --- a/docs/src/models/item-reader-design.dnx +++ /dev/null @@ -1,983 +0,0 @@ - - -?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/src/models/item-stream-adapter.dnx b/docs/src/models/item-stream-adapter.dnx deleted file mode 100644 index 62cb870ec..000000000 --- a/docs/src/models/item-stream-adapter.dnx +++ /dev/null @@ -1,353 +0,0 @@ - - -?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/src/models/repository-classdiagram.dnx b/docs/src/models/repository-classdiagram.dnx deleted file mode 100644 index 4677d6176..000000000 --- a/docs/src/models/repository-classdiagram.dnx +++ /dev/null @@ -1,482 +0,0 @@ - - -?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/src/site/docbook/reference/arch-overview.xml b/docs/src/site/docbook/reference/arch-overview.xml index b928a11c6..954f9adf5 100644 --- a/docs/src/site/docbook/reference/arch-overview.xml +++ b/docs/src/site/docbook/reference/arch-overview.xml @@ -1,546 +1,546 @@ - - - - Container Architecture Overview -
- Introduction - -
- -
- Simple Container Architecture Overview - -
- - Introduction - - This chapter covers the overall spring batch architecture. - The Spring Container Archtiecture is made up of five logical - layers; 1) the Batch Application, 2) the Batch Application Layer, - 3) the batch core layer, and 4) the batch infrastucture - layer. - - - - - - - - - - - Provided - ByLayerDescription - - Application - DeveloperBatch - ApplicationThis is where the - application developer writes their batch jobs and - tasklets. - - Spring Batch Execution - ContainerContainer Application - LayerAllows for extending and - overwriting of the batch support layer for custom - requirements. Facilities implemented in this layer could - migrate down to Batch Support Layer. This is also the layer - to add the project specific jars required by job types - (e.g. reporting jars like Crystal, Brio, etc, form - generation jars like Central Pro or Adobe, - etc). - - Spring Batch Execution - ContainerContainer Support - LayerProvides default - implementations of batch core services including I/O, - Restart, Partitioning, Statistics, and - configurations - - Spring Batch Execution - ContainerContainer Core - LayerEnables configuration, - Common Services & Interfaces, - management - - Spring Batch - InfrastructureBatch-InfrastructureProvides - IO support, Batch style transactions, advanced exception - handling, batch-template, batch-retry - - - - - - - - - - - - Figure 2.0 - - - - - Batch Architecture Layers - - The batch architecture is modeled after a container - architecture, meaning that there are managed resources - essential to high performance batch architectures that are - configured through a spring context. The following sect1s - will provide a quick review of each layer and their role in - the batch architecture. - - - - - - - -
- -
- - Batch Applications - - -
- -
- - Container Application Layer - - -
- -
- - Container Support Layer - - The batch support layer provides default implementations - for all interfaces, interceptors, advice and other core batch - services. Figure 2.3.1 illustrates the following logical - packages. !Batch Support.png! Although physically they break out - into many more than depicted, logically you can think of the - groupings in the following manner: * I/O Support packages * - Restart Support * Lifecycle Support packages * DAO support - layer - - - - - - I/O Support Packages - - The I/O related packages are currently the richest - packages in the batch architecture. They are modeled after - Spring Patterns of Operations and Templates. For example, - you'll see FlatFileInputOperations accompanied with a - FlatFileInputTemplate. The FlatFileInputTemplate is wired up - with a File Descriptor, which contains a Record Descriptor - along with various other properties. With the File and Record - Descriptors the InputTemplate supports a callback method that - allows for the mapping of a record into an object. This - support applies to fixed length records, delimited records - and XML records. To further simplify this a - DefaultFlatFileDataProvider is supplied an input template, - which contains the field and record descriptions, along with - a line mapper that knows how to map the line to an object. - The next() operation on a record simply needs to - readAndMap(lineMapper) a record. This pattern is used over - again for XML and SQL input for simple mapping of input - records to objects. - - In addition to declarative descriptions of the records - that can be re-used by multiple batch jobs, the I/O - facilities also support configurable validation strategies. - The two currently supported are Apache Commons Validator and - Spring's VALang. - - - - - - Restart Support - - The Restart Support provides implementations for a few - common restart strategies that will be discussed further in - the respective sect1. The following are provided - out-of-the-box: * IDList Restart Strategy - a strategy that - supports a batch application where the application does not - have a "process" flag and needs the batch - architecture to track which records have been processed. This - is not the ideal scenario. * Last Processed Restart Strategy - - when the record can be identified through a where and order - by only the last record(s) processed needs to be saved for - restart. * No Restart Strategy - some batch jobs simply - can't support restart. When they are re-run they are - considered to be a new instance of a batch job. * Sql Restart - Strategy - [need some additional javadoc for this - strategy]. - - - - - - Lifecycle Support - - - - - -
-
-
- - The Core Layer - - The Batch Core interfaces and services are illustrated in - a simplified view of a package diagram. There are roughly seven - logical packages: * Core Spring Extensions * Core Batch Advice * - Core Batch Configuration * Core Batch Repository * Core Batch - Tasklet \ !Batch Core.png! [Figure 2.5] Batch Core Layer - - In the actual physical packaging there are a few more - logical services that the batch execution environment provides. The following - sections will provide an introduction into each set of core batch - facilities. - - - - - - Core Spring Extensions - - The Core Spring extensions provide the scaffolding for - a batch execution environment. This includes facilities for managing the - batch architecture in terms of launching, suspending and - stopping batch jobs. There is house keeping that goes on, - especially in concurrent batch jobs, related to ensuring that - batch jobs quiese properly. The lifecycle management provides - services for the proper initialization and subsequent - shutdown of batch resources and services. The batch - architecture is flexible in terms of how batch jobs may be - launched. For example, batch jobs can be started via JMX - facilities, scripts from the command line that launch a Java - VM. It can also support launching batch jobs through web - services or http. There are no restrictions. Finally, there - are standard batch error codes. These error codes can be - exposed to external utilities, like Schedulers, to ensure - that batch jobs expose the status of jobs to an operational - environment. This is especially important in the batch - context where the modus operandi is headless, meaning - unattended operation. - - - - - - Core Batch Advice - - Core Batch Advice is an inventory of the type of advice - that batch architectures will inject during the runtime of a - batch application. These are defined as a set of extensible - interfaces, with a number of default implementations in the - support layer that provide some of the most common types of - advice. Partition Advice is helpful with large datasets that - need to be "chunked" up and run concurrently for - better through put. Resource Advice is helpful for - registering interest in transactional information so that - file locations can be kept in sync with information processed - within a transaction. In addition, the resource is associated - with the correct step context and its associated - configuration properties. Skip advice is applied for records - that the tasklet is unable to process. Restart Advice is - helpful for Restartable jobs where for advising the job on - how to restart. There is considerable variability on how - restart can occur. For example, a job may be marking records - as "processed" and the restart advice will advise - the process with query that restarts the job at the last - successfully processed record. Finally, Statistics are vital - in operational environments to report on records processed, - records skipped and total number of records read. In - addition, certain batch jobs lend themselves to custom - reporting to expose additional business level information - like the number of trades processed or cases opened, - etc. - - - - - - Core Batch Configuration - - Batch configuration is considerably different from - online web applications or SOA based applications. The Core - Batch Configuration provides a place for configuring runtime - properties related to the batch application style. This - includes the ability to add Commit Policy. In a batch style - application it is often advantageous to keep the commit - interval as high as possible when processing Logical Units of - Work. Whereas in an online web application with declarative - transaction the transaction scope would be at the entrance to - a business service, a batch transaction scope may include - many logical units of work before a transaction commit is - executed. A Start Policy allows a configuration to tell the - batch job whether it is Restartable, and if so, what type of - restart to initiate. Some jobs are not restartable and care - should be taken to ensure that information is not applied - multiple times when the business rules do not allow for it. - Exception policies deal with what to do when exceptions - occur. This impacts logging policies and exception handling. - The architecture defines a common set of exceptions that - projects can apply handlers to like processing errors, - validation errors, parsing errors, missing configuration - parameters, etc. - - - - - - 2.5.4 Container Repository - - This is an internal package for storing the state of a - batch job and any associated partition and step status. - - - - - - Core Batch Tasklet - - The core batch tasklet is where control is handed off to - the application. There are a number of patterns that have - been observed in processing batch data. Spring Core Batch - Tasklet implements the most common patterns and provides and - extension point for additional Tasklet processing - implementations. The basic idea of tasklet provides the - facilities for reading and processing data. The simplest - implementation of Tasklet, the ReadProcessTasklet, handles both - the input and output of data within one class. An alternative - implementation, the DataProviderProcessTasklet, provides - functionality for 'split processing'. This type of - processing is characterized by separating the reading and - processing of batch data into two seperate classes: - DataProvider and TaskletProcessor. The DataProvider class - provides a solid means for reusablility and enforces good - architecture practices. Because an object *must* be returned - by the DataProider to continue processing, (Returning null - indicates processing should end) a developer is forced to - read in all relevant data, place it into domain or value - objects, and return the object. The TaskletProcessor will then - use this object within the business logic and final - output. - - - - - -
- -
- - Container's Use of batch - infrastructure - - - - - - Infrastructure Provided I/O - - The I/O core interfaces and implementations provide - facilities for simplifying the extraction of data from I/O - sources like files and database tables. The key concepts are - FieldDescriptors and FieldSets along with appropriate CallBack - Handlers. These are modeled after common spring operations and - templates like JdbcTemplate. Through the use of LineMappers a - developer needs only to describe a record format and write the - appropriate callback method that maps the parsed record into an - object of their choice. These can either be true POJO objects - or Value Objects (structures) that are subsequently available - for the tasklet to processs. The interface for Field Descriptors - also allows for a level of validation through the use of - Spring's VALang or Apache's Common Validator. - - - - - - Core Batch Interceptors & Interceptor - Services - - - - - - Batch Operations & Batch Template - - Interceptors and the associated services are the key - to how advise is applied in the batch architecture. The - interceptors are Point Cuts in the batch lifecycle that - allow the injection of advise. The shared lifecycle - behavior abstracted through the BatchLifeCycleInterceptor - defineds three methods; init, onError and finalize. All - subclasses of LifeCycleInterceptor define default behavior - for these three methods. The JobLifecycleInterceptor - further exposes the methods beforeJob(), beforeStep(), - afterJob(), and afterStep() allowing hooks into the - lifecycle for specific advise. The Batch Architecture - provides default implementations for all lifecycle point - cuts, or interception points. The Tasklet Interceptor, in - addition to the standard lifecycle methods, implements - logic around beforeLuw(), afterLuw(), - commitIntervalStarted() and commitIntervalCompleted(). - Having well defined lifecycle interception points allows - for the easy insertion of custom advice into the batch - runtime environment. - - - - - - - - - -
- -
- - Batch Execution Container Configurations - - In addition to core facilities for configuring or wiring - together jobs and steps with required resources, policies, and - interceptors, spring batch allows considerable flexibility in how - scalability is achieved. More options for scalability will be - available in the future. The important key for scalability in Java - is the recognition that there is a limit to what one JVM may scale - up to in terms of number of threads, managed resources, memory - configuration, etc. The spring batch architecture allows for the - configuration of simple batch jobs where one VM and one process is - sufficient to do perform the work within a batch window all the way - through many threads distributed within a cluster of JEE servers. - The figure below illistrates the scalability spectrum. - - This is not to be understood as the only way to scale batch - jobs as there are many factors. For example, other federated java - architectures hold potential like Teracotta or Gigaspaces although - there is no current implementation for these distributed models in - the current batch architecture. !scalability-model.png! [Figure - 2.3.1] - Scalability Model - -
- - Single VM Simple Batch Execution - Container - One Job, One Step, One Partition - - The simplest configuration is one job with with step and - hence, one implied partition. Implied means that there is nothing - for the developer to consider because the default number of - partitions is one. There is typically one input source and one - output source in this simple configuration. See the Simple Tasklet - Job for an example of what this configuration looks like. A - simple configuration still typically configures a datasource - context, the batch configuration for describing the Job, Step, - along with the associated configured policies, field descriptors, - and line mappers. !SimpleTradeConfiguration.jpg! [Figure 2.3.1] - Simple Container Configuration - - The details of this configuration will be covered - thoroughly in subsequent sect1s of the document but for now it - should be understood that Job, the Step, the input template, the - file descriptor with its associated line mapper, and the output - (e.g. the TradeWriter). - -
- -
- - Single VM Multi-threaded Batch Execution - Container Configuration - One Job, One Step, Multiple - Partitions - - In a Single JVM using partitioning a multi-threaded - execution is supported. [This is still work in progress] - -
- -
- - Batch Execution Container Hosted in J2EE - Container - managed environment - - The J2EE container model has fallen under fire over the - past few years for many valid reasons. There are some things that - the J2EE container do very well though that projects should - consider when planning for scalability with batch architectures. - Commercial and open source containers like WebSphere, BEA and - JBOSS typically: - - - - - - manage datasources effectively along with attendent - services like prepared statement caching. - - - - - - manage transactions effectively including many - configurable properties for long lived transactions. - - - - - - manage thread pools more effectively. - - - - - - supply robust implementations of JTA, a requirement - when batch jobs output to multiple XA resources like JMS and - JDBC. - - - - - - manage distribution effectively including domains, - clusters and cells - - - - - - provide robust JMX management for configuring, managing - and administering distributed applications. - - - - - - workload management facilities (clusters) provided by - J2EE vendors - - - - - - Projects are encouraged to deploy batch applications with - the simplest configuration possible, but when federated JVMs are - a requirement to process volumes of data within a batch window, - batch-in-container provides an effective way of distributing the - processing. Spring Batch supports this through a simple change in - configuration. [Work in progress on the exact implementation - - being released as part of M2]. - -
-
- -
- + + + + Container Architecture Overview +
+ Introduction + +
+ +
+ Simple Container Architecture Overview + +
+ + Introduction + + This chapter covers the overall spring batch architecture. + The Spring Container Archtiecture is made up of five logical + layers; 1) the Batch Application, 2) the Batch Application Layer, + 3) the batch core layer, and 4) the batch infrastucture + layer. + + + + + + + + + + + Provided + ByLayerDescription + + Application + DeveloperBatch + ApplicationThis is where the + application developer writes their batch jobs and + tasklets. + + Spring Batch Execution + ContainerContainer Application + LayerAllows for extending and + overwriting of the batch support layer for custom + requirements. Facilities implemented in this layer could + migrate down to Batch Support Layer. This is also the layer + to add the project specific jars required by job types + (e.g. reporting jars like Crystal, Brio, etc, form + generation jars like Central Pro or Adobe, + etc). + + Spring Batch Execution + ContainerContainer Support + LayerProvides default + implementations of batch core services including I/O, + Restart, Partitioning, Statistics, and + configurations + + Spring Batch Execution + ContainerContainer Core + LayerEnables configuration, + Common Services & Interfaces, + management + + Spring Batch + InfrastructureBatch-InfrastructureProvides + IO support, Batch style transactions, advanced exception + handling, batch-template, batch-retry + + + + + + + + + + + + Figure 2.0 + + + + - Batch Architecture Layers + + The batch architecture is modeled after a container + architecture, meaning that there are managed resources + essential to high performance batch architectures that are + configured through a spring context. The following sect1s + will provide a quick review of each layer and their role in + the batch architecture. + + + + + + + +
+ +
+ + Batch Applications + + +
+ +
+ + Container Application Layer + + +
+ +
+ + Container Support Layer + + The batch support layer provides default implementations + for all interfaces, interceptors, advice and other core batch + services. Figure 2.3.1 illustrates the following logical + packages. !Batch Support.png! Although physically they break out + into many more than depicted, logically you can think of the + groupings in the following manner: * I/O Support packages * + Restart Support * Lifecycle Support packages * DAO support + layer + + + + + + I/O Support Packages + + The I/O related packages are currently the richest + packages in the batch architecture. They are modeled after + Spring Patterns of Operations and Templates. For example, + you'll see FlatFileInputOperations accompanied with a + FlatFileInputTemplate. The FlatFileInputTemplate is wired up + with a File Descriptor, which contains a Record Descriptor + along with various other properties. With the File and Record + Descriptors the InputTemplate supports a callback method that + allows for the mapping of a record into an object. This + support applies to fixed length records, delimited records + and XML records. To further simplify this a + DefaultFlatFileDataProvider is supplied an input template, + which contains the field and record descriptions, along with + a line mapper that knows how to map the line to an object. + The next() operation on a record simply needs to + readAndMap(lineMapper) a record. This pattern is used over + again for XML and SQL input for simple mapping of input + records to objects. + + In addition to declarative descriptions of the records + that can be re-used by multiple batch jobs, the I/O + facilities also support configurable validation strategies. + The two currently supported are Apache Commons Validator and + Spring's VALang. + + + + + + Restart Support + + The Restart Support provides implementations for a few + common restart strategies that will be discussed further in + the respective sect1. The following are provided + out-of-the-box: * IDList Restart Strategy - a strategy that + supports a batch application where the application does not + have a "process" flag and needs the batch + architecture to track which records have been processed. This + is not the ideal scenario. * Last Processed Restart Strategy + - when the record can be identified through a where and order + by only the last record(s) processed needs to be saved for + restart. * No Restart Strategy - some batch jobs simply + can't support restart. When they are re-run they are + considered to be a new instance of a batch job. * Sql Restart + Strategy - [need some additional javadoc for this + strategy]. + + + + + + Lifecycle Support + + + + + +
+
+
+ + The Core Layer + + The Batch Core interfaces and services are illustrated in + a simplified view of a package diagram. There are roughly seven + logical packages: * Core Spring Extensions * Core Batch Advice * + Core Batch Configuration * Core Batch Repository * Core Batch + Tasklet \ !Batch Core.png! [Figure 2.5] Batch Core Layer + + In the actual physical packaging there are a few more + logical services that the batch execution environment provides. The following + sections will provide an introduction into each set of core batch + facilities. + + + + + + Core Spring Extensions + + The Core Spring extensions provide the scaffolding for + a batch execution environment. This includes facilities for managing the + batch architecture in terms of launching, suspending and + stopping batch jobs. There is house keeping that goes on, + especially in concurrent batch jobs, related to ensuring that + batch jobs quiese properly. The lifecycle management provides + services for the proper initialization and subsequent + shutdown of batch resources and services. The batch + architecture is flexible in terms of how batch jobs may be + launched. For example, batch jobs can be started via JMX + facilities, scripts from the command line that launch a Java + VM. It can also support launching batch jobs through web + services or http. There are no restrictions. Finally, there + are standard batch error codes. These error codes can be + exposed to external utilities, like Schedulers, to ensure + that batch jobs expose the status of jobs to an operational + environment. This is especially important in the batch + context where the modus operandi is headless, meaning + unattended operation. + + + + + + Core Batch Advice + + Core Batch Advice is an inventory of the type of advice + that batch architectures will inject during the runtime of a + batch application. These are defined as a set of extensible + interfaces, with a number of default implementations in the + support layer that provide some of the most common types of + advice. Partition Advice is helpful with large datasets that + need to be "chunked" up and run concurrently for + better through put. Resource Advice is helpful for + registering interest in transactional information so that + file locations can be kept in sync with information processed + within a transaction. In addition, the resource is associated + with the correct step context and its associated + configuration properties. Skip advice is applied for records + that the tasklet is unable to process. Restart Advice is + helpful for Restartable jobs where for advising the job on + how to restart. There is considerable variability on how + restart can occur. For example, a job may be marking records + as "processed" and the restart advice will advise + the process with query that restarts the job at the last + successfully processed record. Finally, Statistics are vital + in operational environments to report on records processed, + records skipped and total number of records read. In + addition, certain batch jobs lend themselves to custom + reporting to expose additional business level information + like the number of trades processed or cases opened, + etc. + + + + + + Core Batch Configuration + + Batch configuration is considerably different from + online web applications or SOA based applications. The Core + Batch Configuration provides a place for configuring runtime + properties related to the batch application style. This + includes the ability to add Commit Policy. In a batch style + application it is often advantageous to keep the commit + interval as high as possible when processing Logical Units of + Work. Whereas in an online web application with declarative + transaction the transaction scope would be at the entrance to + a business service, a batch transaction scope may include + many logical units of work before a transaction commit is + executed. A Start Policy allows a configuration to tell the + batch job whether it is Restartable, and if so, what type of + restart to initiate. Some jobs are not restartable and care + should be taken to ensure that information is not applied + multiple times when the business rules do not allow for it. + Exception policies deal with what to do when exceptions + occur. This impacts logging policies and exception handling. + The architecture defines a common set of exceptions that + projects can apply handlers to like processing errors, + validation errors, parsing errors, missing configuration + parameters, etc. + + + + + + 2.5.4 Container Repository + + This is an internal package for storing the state of a + batch job and any associated partition and step status. + + + + + + Core Batch Tasklet + + The core batch tasklet is where control is handed off to + the application. There are a number of patterns that have + been observed in processing batch data. Spring Core Batch + Tasklet implements the most common patterns and provides and + extension point for additional Tasklet processing + implementations. The basic idea of tasklet provides the + facilities for reading and processing data. The simplest + implementation of Tasklet, the ReadProcessTasklet, handles both + the input and output of data within one class. An alternative + implementation, the DataProviderProcessTasklet, provides + functionality for 'split processing'. This type of + processing is characterized by separating the reading and + processing of batch data into two seperate classes: + DataProvider and TaskletProcessor. The DataProvider class + provides a solid means for reusablility and enforces good + architecture practices. Because an object *must* be returned + by the DataProider to continue processing, (Returning null + indicates processing should end) a developer is forced to + read in all relevant data, place it into domain or value + objects, and return the object. The TaskletProcessor will then + use this object within the business logic and final + output. + + + + + +
+ +
+ + Container's Use of batch + infrastructure + + + + + + Infrastructure Provided I/O + + The I/O core interfaces and implementations provide + facilities for simplifying the extraction of data from I/O + sources like files and database tables. The key concepts are + FieldDescriptors and FieldSets along with appropriate CallBack + Handlers. These are modeled after common spring operations and + templates like JdbcTemplate. Through the use of LineMappers a + developer needs only to describe a record format and write the + appropriate callback method that maps the parsed record into an + object of their choice. These can either be true POJO objects + or Value Objects (structures) that are subsequently available + for the tasklet to processs. The interface for Field Descriptors + also allows for a level of validation through the use of + Spring's VALang or Apache's Common Validator. + + + + + + Core Batch Interceptors & Interceptor + Services + + + + + + Batch Operations & Batch Template + + Interceptors and the associated services are the key + to how advise is applied in the batch architecture. The + interceptors are Point Cuts in the batch lifecycle that + allow the injection of advise. The shared lifecycle + behavior abstracted through the BatchLifeCycleInterceptor + defineds three methods; init, onError and finalize. All + subclasses of LifeCycleInterceptor define default behavior + for these three methods. The JobLifecycleInterceptor + further exposes the methods beforeJob(), beforeStep(), + afterJob(), and afterStep() allowing hooks into the + lifecycle for specific advise. The Batch Architecture + provides default implementations for all lifecycle point + cuts, or interception points. The Tasklet Interceptor, in + addition to the standard lifecycle methods, implements + logic around beforeLuw(), afterLuw(), + commitIntervalStarted() and commitIntervalCompleted(). + Having well defined lifecycle interception points allows + for the easy insertion of custom advice into the batch + runtime environment. + + + + + + + + + +
+ +
+ + Batch Execution Container Configurations + + In addition to core facilities for configuring or wiring + together jobs and steps with required resources, policies, and + interceptors, spring batch allows considerable flexibility in how + scalability is achieved. More options for scalability will be + available in the future. The important key for scalability in Java + is the recognition that there is a limit to what one JVM may scale + up to in terms of number of threads, managed resources, memory + configuration, etc. The spring batch architecture allows for the + configuration of simple batch jobs where one VM and one process is + sufficient to do perform the work within a batch window all the way + through many threads distributed within a cluster of JEE servers. + The figure below illistrates the scalability spectrum. + + This is not to be understood as the only way to scale batch + jobs as there are many factors. For example, other federated java + architectures hold potential like Teracotta or Gigaspaces although + there is no current implementation for these distributed models in + the current batch architecture. !scalability-model.png! [Figure + 2.3.1] - Scalability Model + +
+ + Single VM Simple Batch Execution + Container - One Job, One Step, One Partition + + The simplest configuration is one job with with step and + hence, one implied partition. Implied means that there is nothing + for the developer to consider because the default number of + partitions is one. There is typically one input source and one + output source in this simple configuration. See the Simple Tasklet + Job for an example of what this configuration looks like. A + simple configuration still typically configures a datasource + context, the batch configuration for describing the Job, Step, + along with the associated configured policies, field descriptors, + and line mappers. !SimpleTradeConfiguration.jpg! [Figure 2.3.1] + Simple Container Configuration + + The details of this configuration will be covered + thoroughly in subsequent sect1s of the document but for now it + should be understood that Job, the Step, the input template, the + file descriptor with its associated line mapper, and the output + (e.g. the TradeWriter). + +
+ +
+ + Single VM Multi-threaded Batch Execution + Container Configuration - One Job, One Step, Multiple + Partitions + + In a Single JVM using partitioning a multi-threaded + execution is supported. [This is still work in progress] + +
+ +
+ + Batch Execution Container Hosted in J2EE + Container - managed environment + + The J2EE container model has fallen under fire over the + past few years for many valid reasons. There are some things that + the J2EE container do very well though that projects should + consider when planning for scalability with batch architectures. + Commercial and open source containers like WebSphere, BEA and + JBOSS typically: + + + + + + manage datasources effectively along with attendent + services like prepared statement caching. + + + + + + manage transactions effectively including many + configurable properties for long lived transactions. + + + + + + manage thread pools more effectively. + + + + + + supply robust implementations of JTA, a requirement + when batch jobs output to multiple XA resources like JMS and + JDBC. + + + + + + manage distribution effectively including domains, + clusters and cells + + + + + + provide robust JMX management for configuring, managing + and administering distributed applications. + + + + + + workload management facilities (clusters) provided by + J2EE vendors + + + + + + Projects are encouraged to deploy batch applications with + the simplest configuration possible, but when federated JVMs are + a requirement to process volumes of data within a batch window, + batch-in-container provides an effective way of distributing the + processing. Spring Batch supports this through a simple change in + configuration. [Work in progress on the exact implementation - + being released as part of M2]. + +
+
+ +
+ diff --git a/docs/src/site/docbook/reference/common-patterns.xml b/docs/src/site/docbook/reference/common-patterns.xml index f2e61800f..b834dfbc7 100644 --- a/docs/src/site/docbook/reference/common-patterns.xml +++ b/docs/src/site/docbook/reference/common-patterns.xml @@ -311,7 +311,7 @@ @@ -331,7 +331,7 @@ diff --git a/docs/src/site/docbook/reference/container-overview.xml b/docs/src/site/docbook/reference/container-overview.xml index 9076b5ef1..193ba2768 100644 --- a/docs/src/site/docbook/reference/container-overview.xml +++ b/docs/src/site/docbook/reference/container-overview.xml @@ -39,7 +39,7 @@ diff --git a/docs/src/site/docbook/reference/domain.xml b/docs/src/site/docbook/reference/domain.xml index 2a625148e..b57cbd98a 100644 --- a/docs/src/site/docbook/reference/domain.xml +++ b/docs/src/site/docbook/reference/domain.xml @@ -46,7 +46,7 @@ @@ -83,7 +83,7 @@ + fileref="images/job-heirarchy.png" /> @@ -178,7 +178,7 @@ + fileref="images/job-heirarchy.png" /> @@ -559,7 +559,7 @@ + fileref="images/jobHeirarchyWithSteps.png" /> diff --git a/docs/src/site/docbook/reference/execution.xml b/docs/src/site/docbook/reference/execution.xml index bd11d6102..d2fa94978 100644 --- a/docs/src/site/docbook/reference/execution.xml +++ b/docs/src/site/docbook/reference/execution.xml @@ -18,7 +18,7 @@ @@ -93,7 +93,7 @@ + fileref="images/run-tier.png" /> @@ -273,7 +273,7 @@ + fileref="images/jobTier.png" /> @@ -313,7 +313,7 @@ @@ -336,7 +336,7 @@ @@ -790,7 +790,7 @@ + fileref="images/application-tier.png" /> diff --git a/docs/src/site/docbook/reference/job.xml b/docs/src/site/docbook/reference/job.xml index e1fc41fcf..10ff2cf5b 100644 --- a/docs/src/site/docbook/reference/job.xml +++ b/docs/src/site/docbook/reference/job.xml @@ -15,7 +15,7 @@ @@ -352,7 +352,7 @@ @@ -374,7 +374,7 @@ @@ -596,7 +596,7 @@ @@ -619,7 +619,7 @@ diff --git a/docs/src/site/docbook/reference/readersAndWriters.xml b/docs/src/site/docbook/reference/readersAndWriters.xml index f77b298e5..1f8f87aa6 100644 --- a/docs/src/site/docbook/reference/readersAndWriters.xml +++ b/docs/src/site/docbook/reference/readersAndWriters.xml @@ -1521,7 +1521,7 @@ @@ -1548,7 +1548,7 @@ @@ -1863,7 +1863,7 @@ @@ -2355,7 +2355,7 @@ + fileref="images/errorOnFlush.png" /> If items are buffered before being written out, any errors encountered will not be thrown until the buffer is flushed just @@ -2381,7 +2381,7 @@ + fileref="images/errorOnWrite.jpg" /> diff --git a/docs/src/site/docbook/reference/schema-appendix.xml b/docs/src/site/docbook/reference/schema-appendix.xml index 9dbe2a36c..cc6b0ae1b 100644 --- a/docs/src/site/docbook/reference/schema-appendix.xml +++ b/docs/src/site/docbook/reference/schema-appendix.xml @@ -26,14 +26,14 @@ their relationships to one another: - + diff --git a/docs/src/site/docbook/reference/spring-batch-intro.xml b/docs/src/site/docbook/reference/spring-batch-intro.xml index 3628a8d6c..b67b3f70a 100644 --- a/docs/src/site/docbook/reference/spring-batch-intro.xml +++ b/docs/src/site/docbook/reference/spring-batch-intro.xml @@ -173,9 +173,9 @@ architecture that supports the extensibility and ease of use for end-user developers. - + @@ -201,4 +201,4 @@ ItemWriter) and the core framework itself. (retry) - \ No newline at end of file + diff --git a/docs/src/site/docbook/reference/step.xml b/docs/src/site/docbook/reference/step.xml index 2f297b0f4..3b2e766e6 100644 --- a/docs/src/site/docbook/reference/step.xml +++ b/docs/src/site/docbook/reference/step.xml @@ -24,7 +24,7 @@ @@ -50,7 +50,7 @@ @@ -988,7 +988,7 @@ @@ -1046,7 +1046,7 @@ diff --git a/docs/src/site/docbook/reference/whatsnew.xml b/docs/src/site/docbook/reference/whatsnew.xml index 66d751f6a..82112a0d0 100644 --- a/docs/src/site/docbook/reference/whatsnew.xml +++ b/docs/src/site/docbook/reference/whatsnew.xml @@ -89,7 +89,7 @@ @@ -163,7 +163,7 @@ @@ -237,7 +237,7 @@ @@ -254,7 +254,7 @@ @@ -277,7 +277,7 @@ @@ -341,7 +341,7 @@ @@ -367,7 +367,7 @@ @@ -382,7 +382,7 @@