From 7d07ed59fc3c3f3196e4bf221a538880847e7fc3 Mon Sep 17 00:00:00 2001 From: lucasward Date: Sat, 31 Jan 2009 00:22:09 +0000 Subject: [PATCH] BATCH-1042: Added 'What's new in 2.0' chapter after introduction. --- .../docbook/reference/images/1-1-step.png | Bin 0 -> 13617 bytes .../images/composite-transformer.png | Bin 0 -> 24453 bytes .../images/item-oriented-processing.png | Bin 0 -> 23768 bytes .../simplified-chunk-oriented-processing.png | Bin 0 -> 22284 bytes docs/src/site/docbook/reference/index.xml | 2 + docs/src/site/docbook/reference/job.xml | 2 +- docs/src/site/docbook/reference/step.xml | 27 +- docs/src/site/docbook/reference/whatsnew.xml | 1350 ++++------------- 8 files changed, 349 insertions(+), 1032 deletions(-) create mode 100644 docs/src/site/docbook/reference/images/1-1-step.png create mode 100644 docs/src/site/docbook/reference/images/composite-transformer.png create mode 100644 docs/src/site/docbook/reference/images/item-oriented-processing.png create mode 100644 docs/src/site/docbook/reference/images/simplified-chunk-oriented-processing.png diff --git a/docs/src/site/docbook/reference/images/1-1-step.png b/docs/src/site/docbook/reference/images/1-1-step.png new file mode 100644 index 0000000000000000000000000000000000000000..5668d0fa4f28e40584b317075911d390824bd64c GIT binary patch literal 13617 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 F{}&}g)5ib+ literal 0 HcmV?d00001 diff --git a/docs/src/site/docbook/reference/images/composite-transformer.png b/docs/src/site/docbook/reference/images/composite-transformer.png new file mode 100644 index 0000000000000000000000000000000000000000..b82e38173f738a35219be951646b9ff4ed312549 GIT binary patch literal 24453 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 literal 0 HcmV?d00001 diff --git a/docs/src/site/docbook/reference/images/item-oriented-processing.png b/docs/src/site/docbook/reference/images/item-oriented-processing.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ffbb576ee6356b9ed335663961a84710c74c08 GIT binary patch literal 23768 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 z zR>qn@Lx{1DAVh$JTVaHpPFeXG@%XSOY|bEquVF| zj3|i^xO=I97oKhe8S@6%Cc4SfeIuYQp8<^;^c{dD0>Zac;QWGuHSPRmpZh}qpq!M^ zGMBV?UfXz4?9q|U%6C_=ja3exF+2m=*5Tpdo17GJ%GJX0vQ6izw7lr(H$-|iKBc*n`$m94o$7e7Aw^{PJw}y%hFD%6BU#x8)`7~T~VJozp4ZKTSMg$hJ zz?1IvXSlmL#3EdoAhxU60h+jy5);=Pi!`LM$l*LB+euNUYY<$T!&s8X0J9H&Ez)J~ zIVjZXyOm;gGAZNqUIrXgo%b69T&5o03jRYahIHZQXUT@+l6#W$eOc{iG-_bL^u80a z8Sl5{4>_HqNhcb!mT{yjF0r4!PDXG<7bFfdE89Z~hB57O3W<9e-(R%D+({|m{p{~I z!XjMO3c-&m2+d^d3hM%{CGbuW39eUWF1|WFlNEP>iibiWhbnIG*5_wQfS)y{9aE6# zL5$59#jIu^RZ`cysyeR7pO-W|E^LxfQ8|VpDgfwC@cd!x>9?(irP%-!y&?qQmIqs^ zi5LvK&o7+3{;+r}0Ot8+YcXG<*q{KveSorWHd!lh(ZbyTj2q{9A%v3}PWNR)vRP|S r2rosuFL2(?vSc0w#Yz*>gRcO+=adFNP7|=v8jQ4rym-0jmv8?Cjkekk literal 0 HcmV?d00001 diff --git a/docs/src/site/docbook/reference/images/simplified-chunk-oriented-processing.png b/docs/src/site/docbook/reference/images/simplified-chunk-oriented-processing.png new file mode 100644 index 0000000000000000000000000000000000000000..d173b15fa611461250aa836c7d70ba363e997d0c GIT binary patch literal 22284 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 IvQ^ms0OV~l0RR91 literal 0 HcmV?d00001 diff --git a/docs/src/site/docbook/reference/index.xml b/docs/src/site/docbook/reference/index.xml index 3df084390..686011f48 100644 --- a/docs/src/site/docbook/reference/index.xml +++ b/docs/src/site/docbook/reference/index.xml @@ -47,6 +47,8 @@ + + diff --git a/docs/src/site/docbook/reference/job.xml b/docs/src/site/docbook/reference/job.xml index 698541d5c..223154879 100644 --- a/docs/src/site/docbook/reference/job.xml +++ b/docs/src/site/docbook/reference/job.xml @@ -567,7 +567,7 @@ -
+
Advanced Meta-Data Usage So far, both the JobLauncher and JobRepository interfaces have been diff --git a/docs/src/site/docbook/reference/step.xml b/docs/src/site/docbook/reference/step.xml index 0ca66eb28..c8e6a9383 100644 --- a/docs/src/site/docbook/reference/step.xml +++ b/docs/src/site/docbook/reference/step.xml @@ -1,7 +1,7 @@ - + Configuring a Step As disucssed in , a @@ -453,6 +453,29 @@ settings such as isolation and propagation behaviour. More information on setting transaction attributes can be found in the spring core documentation. + +
+ Transactional readers + + The basic contract of the ItemReader is + that it is forward only. The step buffers reader input, so that in the + case of a rollback the items don't need to be re-read from the reader. + However, there are certain scenarios in which the reader is built on + top of a transactional resource, such as a JMS queue. In this case, + since the queue is tied to the transaction that is rolled back, the + messages that have been pulled from the queue will be put back on. For + this reason, the step can be configured to not buffer the items: + + + + <step name="step1"> + <tasklet reader="itemReader" writer="itemWriter" commit-interval="2" skip-limit="1" + is-reader-transactional-queue="true"> + </tasklet> + </step> + + +
@@ -954,7 +977,7 @@
-
+
Controlling Step Flow With the ability to group steps together within an owning job, comes diff --git a/docs/src/site/docbook/reference/whatsnew.xml b/docs/src/site/docbook/reference/whatsnew.xml index fc15f0f4d..fe4fcf4ca 100644 --- a/docs/src/site/docbook/reference/whatsnew.xml +++ b/docs/src/site/docbook/reference/whatsnew.xml @@ -1,185 +1,286 @@ - - The Domain Language of Batch + + What's new in Spring Batch 2.0 + + The Spring Batch 2.0 release has six major themes: + + + + Java 5 + + + + Non Sequential Step Execution + + + + Chunk oriented processing + + + + Meta Data enhancements + + + + Scalability + + + + Configuration + +
- Introduction + Java 5 - To any experienced batch architect, the overall concepts of batch - processing used in Spring Batch should be familiar and comfortable. There - are “Jobs” and “Steps” and developer supplied processing units called - ItemReaders and ItemWriters. However, because of the Spring patterns, - operations, templates, callbacks, and idioms, there are opportunities for - the following: - - significant improvement in adherence to a clear separation of - concerns - + The 1.x release of Spring Batch were all based on Java 1.4. This + prevented the framework from using many enhancements provided in Java 5 + such as generics, parameterized types, etc. The entire framework has been + updated to utilize these features. Java 1.4 is no + longer supported. Most of the interfaces developers work with + have been updated to support generic types. As an example, the ItemReader + interface from 1.1 is below: - - clearly delineated architectural layers and services provided - as interfaces - + + public interface ItemReader { - - simple and default implementations that allowed for quick - adoption and ease of use out-of-the-box - + Object read() throws Exception; - - significantly enhanced extensibility - - + void mark() throws MarkFailedException; + + void reset() throws ResetFailedException; + } - The diagram below is only a slight variation of the batch reference - architecture that has been used for decades. It provides an overview of - the high level components, technical services, and basic operations - required by a batch architecture. This architecture framework is a - blueprint that has been proven through decades of implementations on the - last several generations of platforms (COBOL/Mainframe, C++/Unix, and now - Java/anywhere). JCL and COBOL developers are likely to be as comfortable - with the concepts as C++, C# and Java developers. Spring Batch provides a - physical implementation of the layers, components and technical services - commonly found in robust, maintainable systems used to address the - creation of simple to complex batch applications, with the infrastructure - and extensions to address very complex processing needs. + + + As you can see, the read method returns an + Object. The 2.0 version is below: + + + public interface ItemReader<T> { + + T read() throws Exception, UnexpectedInputException, ParseException; + + } + + + + As you can see, ItemReader now supports the + generic type, T, which is returned from read. You may also notice that + mark and reset have been removed. This is due to step processing strategy + changes, which are discussed below. Many other interfaces have been + similarly updated.
- Batch Application Style Interactions and Services + Chunk Oriented Processing - - - - - - - - - - Figure 2.1: Batch Stereotypes - - - The above diagram highlights the interactions and key services - provided by the Spring Batch framework. The colors used are important to - understanding the responsibilities of a developer in Spring Batch. Grey - represents an external application such as an enterprise scheduler or a - database. It's important to note that scheduling is grey, and should thus - be considered separate from Spring Batch. Blue represents application - architecture services. In most cases these are provided by Spring Batch - with out of the box implementations, but an architecture team may make - specific implementations that better address their specific needs. Yellow - represents the pieces that must be configured by a developer. For example, - a job schedule needs to be configured so that the job is kicked off at the - appropriate time. A job configuration file also needs to be created, which - defines how a job will be run. It is also worth noting that the - ItemReader and ItemWriter - used by an application may just as easily be a custom one made by a - developer for their specific batch job, rather than one provided by Spring - Batch or an architecture team. - - The Batch Application Style is organized into four logical tiers, - which include Run, Job, Application, and Data. The primary goal for - organizing an application according to the tiers is to embed what is known - as "separation of concerns" within the system. These tiers can be - conceptual but may prove effective in mapping the deployment of the - artifacts onto physical components like Java runtimes and integration with - data sources and targets. Effective separation of concerns results in - reducing the impact of change to the system. The four conceptual tiers - containing batch artifacts are: - - - - Run Tier: The Run Tier is - concerned with the scheduling and launching of the application. A - vendor product is typically used in this tier to allow time-based - and interdependent scheduling of batch jobs as well as providing - parallel processing capabilities. - - - - Job Tier: The Job Tier is - responsible for the overall execution of a batch job. It - sequentially executes batch steps, ensuring that all steps are in - the correct state and all appropriate policies are enforced. - - - - Application Tier: The - Application Tier contains components required to execute the - program. It contains specific tasks that address required batch - functionality and enforces policies around execution (e.g., commit - intervals, capture of statistics, etc.) - - - - Data Tier: The Data Tier - provides integration with the physical data sources that might - include databases, files, or queues. - - -
- -
- Job Stereotypes - - This section describes stereotypes relating to the concept of a - batch job. A Job is an entity that encapsulates an - entire batch process. As is common with other Spring projects, a - Job will be wired together via an XML configuration - file. This file may be referred to as the "job configuration". However, - Job is just the top of an overall hierarchy: + Previously, the default processing strategy provided by Spring Batch + was item-oriented processing: - + + fileref="src/site/docbook/reference/images/item-oriented-processing.png" + width="50%" /> + In item-oriented processing, the ItemReader returns one Object (the + 'item) which is then handed to the ItemWriter, periodically committing + when the number of items hits the commit interval. For example, if the + commit interval is 5, ItemReader and ItemWriter will each be called 5 + times. This is illustrated in a simplified code example below: + + + for(int i = 0; i < commitInterval; i++){ + Object item = itemReader.read(); + itemWriter.write(item); + } + + + + Both the ItemReader and ItemWriter interfaces were completely geared + toward this approach: + + + public interface ItemReader { + + Object read() throws Exception; + + void mark() throws MarkFailedException; + + void reset() throws ResetFailedException; + } + + + + public interface ItemWriter { + + void write(Object item) throws Exception; + + void flush() throws FlushFailedException; + + void clear() throws ClearFailedException; + } + + + + Because the 'scope' of the processing was one item, supporting + rollback scenarios required additional methods, which is what mark, reset, + flush, and clear provided. If, after successfully reading and writing 2 + items, the third had an error while writing, the transaction would need to + be rolled back. In this case, the clear method on the writer would be + called, indicating that it should clear its buffer, and reset would be + called on the ItemReader, indicating that it should return back to the + last position it was at when mark was called. (Both mark and flush are + called on commit) + + In 2.0, this strategy has been changed to a chunk-oriented + approach: + + + + + + + + + + + + Using the same example from above, if the commit interval is five, + read will be called 5 times, and write once. The items read will be + aggregated into a list, that will ultimately be written out, as the + simplified example below illustrates: + + + List items = new Arraylist(); + for(int i = 0; i < commitInterval; i++){ + items.add(itemReader.read()); + } + itemWriter.write(items); + + + + This approach not only allows for much simpler processing and + scalability approaches, it also makes the ItemReader and ItemWriter + interfaces much cleaner: + + + public interface ItemReader<T> { + + T read() throws Exception, UnexpectedInputException, ParseException; + + } + + + + + public interface ItemWriter<T> { + + void write(List<? extends T> items) throws Exception; + + } + + + + As you can see, the interfaces no longer contain the mark, reset, + flush, and clear methods. This makes the creation of readers and writers + much more straightforward for developers. In the case of + ItemReader, the interface is now forward-only. The + framework will buffer read items for developers in the case of rollback. + (There are exceptions if the underlying resource is transactional see: + ) ItemWriter is also simplified, + since it gets the entire 'chunk' of items at once, rather than one at a + time, it can decide to flush any resources (such as a file or hibernate + session) before returning control to the Step. More + detailed information on chunk-oriented processing can be found in . Reader and writer implementation + information can be found in +
- Job + ItemProcessor - A job is represented by a Spring bean that implements the - Job interface and contains all of the information - necessary to define the operations performed by a job. A job - configuration is typically contained within a Spring XML configuration - file and the job's name is determined by the "id" attribute associated - with the job configuration bean. The job configuration contains + Previously, Steps had only two dependencies, + ItemReader and + ItemWriter: - - - The simple name of the job - + + + + - - Definition and ordering of Steps - + + + + - - Whether or not the job is restartable - - + The basic configuration above is fairly robust. However, there are + many cases where the item needs to be transformed before writing. In 1.x + this can be achieved using the composite pattern: - A default simple implementation of the Job - interface is provided by Spring Batch in the form of the - SimpleJob class which creates some standard - functionality on top of Job, namely a standard - execution logic that all jobs should utilize. In general, all jobs - should be defined using a bean of type - SimpleJob: + + + + - <bean id="footballJob" + + + + + + This approach works, however, it requires an extra layer between + either the reader or the writer and the Step. + Furthermore, the ItemWriter would need to be + registered separately as an ItemStream with the + Step. For this reason, the ItemTransfomer was + renamed to ItemProcessor and moved up to the same level as ItemReader + and ItemWriter: + + + + + + + + + + +
+
+ +
+ Configuration enhancements + + Until 2.0, the only option for configuring batch jobs has been + normal spring bean configuration. However, in 2.0 there is a new namespace + for configuration. For example, in 1.1, configuring a job looked like the + following: + + + <bean id="footballJob" class="org.springframework.batch.core.job.SimpleJob"> <property name="steps"> <list> @@ -189,915 +290,106 @@ <bean id="playerSummarization" parent="simpleStep" /> </list> </property> - <property name="restartable" value="true" /> - </bean> -
+ <property name="jobRepository" ref="jobRepository" /> + </bean> -
- JobInstance + - A JobInstance refers to the concept of a - logical job run. Let's consider a batch job that should be run once at - the end of the day, such as the 'EndOfDay' job from the diagram above. - There is one 'EndOfDay' Job, but each individual - run of the Job must be tracked separately. In the - case of this job, there will be one logical - JobInstance per day. For example, there will be a - January 1st run, and a January 2nd run. If the January 1st run fails the - first time and is run again the next day, it's still the January 1st - run. (Usually this corresponds with the data its processing as well, - meaning the January 1st run processes data for January 1st, etc) That is - to say, each JobInstance can have multiple - executions. (JobExecution is discussed in more - detail below) and only one JobInstance - corresponding to a particular Job can be running - at a given time. The definition of a JobInstance - has absolutely no bearing on the data the will be loaded. It is entirely - up to the ItemReader implementation used to - determine how data will be loaded. For example, in the EndOfDay - scenario, there may be a column on the data that indicates the - 'effective date' or 'schedule date' to which the data belongs. So, the - January 1st run would only load data from the 1st, and the January 2nd - run would only use data from the 2nd. Because this determination will - likely be a business decision, it is left up to the - ItemReader to decide. What using the same - JobInstance will determine, however, is whether - or not the 'state' (i.e. the ExecutionContext, which is discussed below) - from previous executions will be used. Using a new - JobInstance will mean 'start from the beginning' - and using an existing instance will generally mean 'start from where you - left off'. -
+ In 2.0, the equivalent would be: -
- JobParameters + + <job id="footballJob"> + <step name="playerload" next="gameLoad"/> + <step name="gameLoad" next="playerSummarization"/> + <step name="playerSummarization"/> + </job> - Having discussed JobInstance and how it - differs from Job, the natural question to ask is: - "how is one JobInstance distinguished from - another?" The answer is: JobParameters. - JobParameters are any set of parameters used to - start a batch job, which can be used for identification or even as - reference data during the run. In the example above, where there are two - instances, one for January 1st, and another for January 2nd, there is - really only one Job, one that was started with a job parameter of - 01-01-2008 and another that was started with a parameter of 01-02-2008. - Thus, the contract can be defined as: JobInstance - = Job + JobParameters. - This allows a developer to effectively control how you a - JobInstance is defined, since they control what - parameters are passed in. -
+ -
- JobExecution - - A JobExecution refers to the technical - concept of a single attempt to run a Job. An - execution may end in failure or success, but the - JobInstance corresponding to a given execution - will not be considered complete unless the execution completes - successfully. Using the EndOfDay Job described - above as an example, consider a JobInstance for 01-01-2008 that failed - the first time it was run. If it is ran again, with the same job - parameters as the first run (01-01-2008), a new JobExecution will be - created. However, there will still be only one - JobInstance. - - A Job defines what a job is and how it is - to be executed, and JobInstance is a purely - organizational object to group executions together, primarily to enable - correct restart semantics. A JobExecution, - however, is the primary storage mechanism for what actually happened - during a run, and as such contains many more properties that must be - controlled and persisted: - - - JobExecution properties - - - - - status - - A BatchStatus object that - indicates the status of the execution. While it's running, it's - BatchStatus.STARTED, if it fails it's BatchStatus.FAILED, and if - it finishes successfully it's BatchStatus.COMPLETED - - - - startTime - - A java.util.Date representing the - current system time when the execution was started. - - - - endTime - - A java.util.Date representing the - current system time when the execution finished, regardless of - whether or not it was successful. - - - - exitStatus - - The ExitStatus indicating the - result of the run. It is most important because it contains an - exit code that will be returned to the caller. See chapter 5 for - more details. - - - - createTime - - A java.util.Date representing the - current system time when the JobExecution was first persisted. - The job may not have been started yet (and thus has no start - time), but it will always have a createTime, which is required - by the framework for managing job level - ExecutionContexts. - - - - lastUpdated - - A java.util.Date representing the - last time a JobExecution was persisted. - - - - executionContext - - The 'property bag' containing any user data that needs to - be persisted between executions. - - - - failureExceptions - - The list of exceptions encountered during the execution - of a Job. These can be useful if more - than one exception is encountered during the failure of a - Job. - - - -
- - These properties are important because they will be persisted and - can be used to completely determine the status of an execution. For - example, if the EndOfDay job for 01-01 is executed at 9:00 PM, and fails - at 9:30, the following entries will be made in the batch meta data - tables: - - - BATCH_JOB_INSTANCE - - - - - JOB_INSTANCE_ID - - JOB_NAME - - - - 1 - - EndOfDayJob - - - -
- - - BATCH_JOB_PARAMS - - - - - JOB_INSTANCE_ID - - TYPE_CD - - KEY_NAME - - DATE_VAL - - - - 1 - - DATE - - schedule.Date - - 2008-01-01 00:00:00 - - - -
- - - BATCH_JOB_EXECUTION - - - - - JOB_EXECUTION_ID - - JOB_INSTANCE_ID - - START_TIME - - END_TIME - - STATUS - - - - 1 - - 1 - - 2008-01-01 21:00:23.571 - - 2008-01-01 21:30:17.132 - - FAILED - - - -
- - - extra columns in the tables have been removed for added - clarity. - - - Now that the job has failed, let's assume that it took the entire - course of the night for the problem to be determined, so that the 'batch - window' is now closed. Assuming the window starts at 9:00 PM, the job - will be kicked off again for 01-01, starting where it left off and - completing successfully at 9:30. Because it's now the next day, the - 01-02 job must be run as well, which is kicked off just afterwards at - 9:31, and completes in it's normal one hour time at 10:30. There is no - requirement that one JobInstance be kicked off - after another, unless there is potential for the two jobs to attempt to - access the same data, causing issues with locking at the database level. - It is entirely up to the scheduler to determine when a - Job should be run. Since they're separate - JobInstances, Spring Batch will make no attempt to stop them from being - run concurrently. (Attempting to run the same - JobInstance while another is already running will - result in a JobExecutionAlreadyRunningException - being thrown) There should now be an extra entry in both the - JobInstance and - JobParameters tables, and two extra entries in - the JobExecution table: - - - BATCH_JOB_INSTANCE - - - - - JOB_INSTANCE_ID - - JOB_NAME - - - - 1 - - EndOfDayJob - - - - 2 - - EndOfDayJob - - - -
- - - BATCH_JOB_PARAMS - - - - - JOB_INSTANCE_ID - - TYPE_CD - - KEY_NAME - - DATE_VAL - - - - 1 - - DATE - - schedule.Date - - 2008-01-01 00:00:00 - - - - 2 - - DATE - - schedule.Date - - 2008-01-02 00:00:00 - - - -
- - - BATCH_JOB_EXECUTION - - - - - JOB_EXECUTION_ID - - JOB_INSTANCE_ID - - START_TIME - - END_TIME - - STATUS - - - - 1 - - 1 - - 2008-01-01 21:00 - - 2008-01-01 21:30 - - FAILED - - - - 2 - - 1 - - 2008-01-02 21:00 - - 2008-01-02 21:30 - - COMPLETED - - - - 3 - - 2 - - 2008-01-02 21:31 - - 2008-01-02 22:29 - - COMPLETED - - - -
-
+ More information on how to configure Jobs and Steps with the new + namespace can be found in , and .
- Step Stereotypes + Meta Data access improvements - A Step is a domain object that encapsulates - an independent, sequential phase of a batch job. Therefore, every - Job is composed entirely of one or more steps. A - Step should be thought of as a unique processing - stream that will be executed in sequence. For example, if you have one - step that loads a file into a database, another that reads from the - database, validates the data, preforms processing, and then writes to - another table, and another that reads from that table and writes out to a - file. Each of these steps will be performed completely before moving on to - the next step. The file will be completely read into the database before - step 2 can begin. As with Job, a - Step has an individual - StepExecution that corresponds with a unique - JobExecution: + The JobRepository interface represents basic + CRUD operations with Job meta-data. However, it can + be useful to query the meta-data. For that reason, the + JobExplorer and JobOperator + interfaces have been created: - + + fileref="src/site/docbook/reference/images/job-repository-advanced.png" + scale="80" width="65%" /> -
- Step - - A Step contains all of the information - necessary to define and control the actual batch processing. This is a - necessarily vague description because the contents of any given - Step are at the discretion of the developer - writing a Job. A Step can be as simple or complex - as the developer desires. A simple Step might - load data from a file into the database, requiring little or no code. - (depending upon the implementations used) A more complex - Step may have complicated business rules that are - applied as part of the processing. - - Steps are defined by instantiating implementations of the - Step interface. Two step implementation classes - are available in the Spring Batch framework, and they are each discussed - in detail in Chatper 4 of this guide. For most situations, the - StepHandlerStep implementation is sufficient, but - for situations where only one call is needed, such as a stored procedure - call or a wrapper around existing script, a - TaskletStep may be a better option. -
- -
- StepExecution - - A StepExecution represents a single attempt - to execute a Step. A new - StepExecution will be created each time a Step is - run, similar to JobExecution. However, if a step - fails to execute because the step before it fails, there will be no - execution persisted for it. A StepExecution will - only be created when it's Step is actually - started. - - Step executions are represented by objects of the - StepExecution class. Each execution contains a - reference to its corresponding step and - JobExecution, and transaction related data such - as commit and rollback count and start and end times. Additionally, each - step execution will contain an ExecutionContext, - which contains any data a developer needs persisted across batch runs, - such as statistics or state information needed to restart. The following - is a listing of the properties for - StepExecution: - - - StepExecution properties - - - - - status - - A BatchStatus object that - indicates the status of the execution. While it's running, the - status is BatchStatus.STARTED, if it fails the status is - BatchStatus.FAILED, and if it finishes successfully the status - is BatchStatus.COMPLETED - - - - startTime - - A java.util.Date representing the - current system time when the execution was started. - - - - endTime - - A java.util.Date representing the - current system time when the execution finished, regardless of - whether or not it was successful. - - - - exitStatus - - The ExitStatus indicating the - result of the execution. It is most important because it - contains an exit code that will be returned to the caller. See - chapter 5 for more details. - - - - executionContext - - The 'property bag' containing any user data that needs to - be persisted between executions. - - - - readCount - - The number of items that have been successfully - read - - - - writeCount - - The number of items that have been successfully - written - - - - commitCount - - The number transactions that have been committed for this - execution - - - - rollbackCount - - The number of times the business transaction controlled - by the Step has been rolled back. - - - - readSkipCount - - The number of times read has - failed, resulting in a skipped item. - - - - processSkipCount - - The number of times process has failed, resulting in a - skipped item. - - - - filterCount - - The number of items that have been 'filtered' by the - ItemProcessor - - - - writeSkipCount - - The number of times write has - failed, resulting in a skipped item. - - - -
-
- -
- ExecutionContext - - An ExecutionContext represents a collection - of key/value pairs that are persisted and controlled by the framework in - order to allow developers a place to store persistent state that is - scoped to a StepExecution or - JobExecution. For those familiar with Quartz, it - is very similar to JobDataMap. The best usage - example is restart. Using flat file input as an example, while - processing individual lines, the framework periodically persists the - ExecutionContext at commit points. This allows - the ItemReader to store its state in case a fatal - error occurs during the run, or even if the power goes out. All that is - needed is to put the current number of lines read into the context, and - the framework will do the rest: - - executionContext.putLong(getKey(LINES_READ_COUNT), reader.getPosition()); - - Using the EndOfDay example from the Job Stereotypes section as an - example, assume there's one step: 'loadData', that loads a file into the - database. After the first failed run, the meta data tables would look - like the following: - - - BATCH_JOB_INSTANCE - - - - - JOB_INSTANCE_ID - - JOB_NAME - - - - 1 - - EndOfDayJob - - - -
- BATCH_JOB_PARAMS - - - - - JOB_INSTANCE_ID - - TYPE_CD - - KEY_NAME - - DATE_VAL - - - - 1 - - DATE - - schedule.Date - - 2008-01-01 00:00:00 - - - -
- BATCH_JOB_EXECUTION - - - - - JOB_EXECUTION_ID - - JOB_INSTANCE_ID - - START_TIME - - END_TIME - - STATUS - - - - 1 - - 1 - - 2008-01-01 21:00:23.571 - - 2008-01-01 21:30:17.132 - - FAILED - - - -
- BATCH_STEP_EXECUTION - - - - - STEP_EXECUTION_ID - - JOB_EXECUTION_ID - - STEP_NAME - - START_TIME - - END_TIME - - STATUS - - - - 1 - - 1 - - loadDate - - 2008-01-01 21:00:23.571 - - 2008-01-01 21:30:17.132 - - FAILED - - - -
- BATCH_EXECUTION_CONTEXT - - - - - EXECUTION_ID - - TYPE_CD - - KEY_NAME - - LONG_VAL - - - - 1 - - LONG - - piece.count - - 40321 - - - -
In this case, the Step ran for 30 - minutes and processed 40,321 'pieces', which would represent lines in a - file in this scenario. This value will be updated just before each - commit by the framework, and can contain multiple rows corresponding to - entries within the ExecutionContext. Being - notified before a commit requires one of the various StepListeners, or - an ItemStream, which are discussed in more detail - later in this guide. As with the previous example, it is assumed that - the Job is restarted the next day. When it is restarted, the values from - the ExecutionContext of the last run are - reconstituted from the database, and when the - ItemReader is opened, it can check to see if it - has any stored state in the context, and initialize itself from - there:
- - if (executionContext.containsKey(getKey(LINES_READ_COUNT))) { - log.debug("Initializing for restart. Restart data is: " + executionContext); - - long lineCount = executionContext.getLong(getKey(LINES_READ_COUNT)); - - LineReader reader = getReader(); - - Object record = ""; - while (reader.getPosition() < lineCount && record != null) { - record = readLine(); - } - } - - In this case, after the above code is executed, the current line - will be 40,322, allowing the Step to start again - from where it left off. The ExecutionContext can - also be used for statistics that need to be persisted about the run - itself. For example, if a flat file contains orders for processing that - exist across multiple lines, it may be necessary to store how many - orders have been processed (which is much different from than the number - of lines read) so that an email can be sent at the end of the - Step with the total orders processed in the body. - The framework handles storing this for the developer, in order to - correctly scope it with an individual - JobInstance. It can be very difficult to know - whether an existing ExecutionContext should be - used or not. For example, using the 'EndOfDay' example from above, when - the 01-01 run starts again for the second time, the framework recognizes - that it is the same JobInstance and on an - individual Step basis, pulls the - ExecutionContext out of the database and hands it - as part of the StepExecution to the - Step itself. Conversely, for the 01-02 run the - framework recognizes that it is a different instance, so an empty - context must be handed to the Step. There are - many of these types of determinations that the framework makes for the - developer to ensure the state is given to them at the correct time. It - is also important to note that exactly one - ExecutionContext exists per - StepExecution at any given time. Clients of the - ExecutionContext should be careful because this - creates a shared keyspace, so care should be taken when putting values - in to ensure no data is overwritten, however, the - Step stores absolutely no data in the context, so - there is no way to adversely affect the framework. -
+ More information on the new meta data features can be found in . It is also worth noting that Jobs can now + be stopped via the database, removing the requirement to maintain a handle + to the JobExecution on the JVM the job was launched + in.
- JobRepository + Non Sequential Step Execution - JobRepository is the persistence mechanism - for all of the Stereotypes mentioned above. When a job is first launched, - a JobExecution is obtained by calling the - repository's createJobExecution method, and - during the course of execution, StepExecution and - JobExecution are persisted by passing them to the - repository: + 2.0 has also seen improvements in how steps can be configured. + Rather than requiring that they solely be sequential: - public interface JobRepository { + + + + - public JobExecution createJobExecution(Job job, JobParameters jobParameters) - throws JobExecutionAlreadyRunningException, JobRestartException; + + + + - void add(StepExecution stepExecution); + They may now be conditional: - void update(JobExecution jobExecution); + + + + - void update(StepExecution stepExecution); + + + + - void updateExecutionContext(StepExecution stepExecution); + This new 'conditional flow' support is made easy to configure via + the new namespace: - StepExecution getLastStepExecution(JobInstance jobInstance, Step step); + + <job id="job"> + <step name="stepA"> + <next on="FAILED" to="stepB" /> + <next on="*" to="stepC" /> + </step> + <step name="stepB" next="stepC" /> + <step name="stepC" /> + </job> - int getStepExecutionCount(JobInstance jobInstance, Step step); - -} - -
- -
- JobLauncher - - JobLauncher represents a simple interface for - launching a Job with a given set of - JobParameters: - - public interface JobLauncher { - - public JobExecution run(Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException, - JobRestartException; -} - It is expected that implementations will obtain a valid - JobExecution from the - JobRepository and execute the - Job. + More details on how to configure non sequential steps can be found + in
- -
- JobLocator - - JobLocator represents an interface for - locating a Job: - - public interface JobLocator { - - Job getJob(String name) throws NoSuchJobException; - } - - This interface is very necessary due to the nature of Spring itself. - Because it can't be guaranteed that one - ApplicationContext equals one - Job, an abstraction is needed to obtain a - Job for a given name. It becomes especially useful - when launching jobs from within a Java EE application server. -
- -
- Item Reader - - ItemReader is an abstraction that represents - the retrieval of input for a Step, one item at a - time. When the ItemReader has exhausted the items - it can provide, it will indicate this by returning null. More details - about the ItemReader interface and its various - implementations can be found in Chapter 3. -
- -
- Item Writer - - ItemWriter is an abstraction that represents - the output of a Step, one item at a time. - Generally, an item writer has no knowledge of the input it will receive - next, only the item that was passed in its current invocation. More - details about the ItemWriter interface and it's - various implementations can be found in Chapter 3. -
- -
- Item Processor - - ItemProcessor is an abstraction that - represents the business processing of an item. While the - ItemReader reads one item, and the - ItemWriter writes them, the - ItemProcessor provides access to transform or apply - other business processing. If while processing the item it's determined - that it's not valid, returning null indicates that it should not be - written out. -
- -
- Tasklet - - A Tasklet represents the execution of a - logical unit of work, as defined by its implementation of the Spring Batch - provided Tasklet interface. A - Tasklet is useful for encapsulating processing - logic that is not natural to split into read-(transform)-write phases, - such as invoking a system command or a stored procedure. -
- \ No newline at end of file +