From 2be012fa4cb240a0ee7612f601c00a4f27d5d5c3 Mon Sep 17 00:00:00 2001 From: lucasward Date: Wed, 28 Jan 2009 05:31:40 +0000 Subject: [PATCH] BATCH-1035: Added section on Late binding. --- docs/src/site/docbook/reference/domain.xml | 61 ++++----- .../reference/images/meta-data-erd.png | Bin 37584 -> 44835 bytes docs/src/site/docbook/reference/job.xml | 14 ++- .../docbook/reference/readersAndWriters.xml | 116 ++++++++++++------ .../docbook/reference/schema-appendix.xml | 14 ++- docs/src/site/docbook/reference/step.xml | 109 ++++++++++------ 6 files changed, 201 insertions(+), 113 deletions(-) diff --git a/docs/src/site/docbook/reference/domain.xml b/docs/src/site/docbook/reference/domain.xml index d04a1bab8..d0d61bc6e 100644 --- a/docs/src/site/docbook/reference/domain.xml +++ b/docs/src/site/docbook/reference/domain.xml @@ -90,7 +90,7 @@ In Spring Batch, a Job is simply a continer for Steps. It combines multiple steps that belong logically together in a flow and allows for configuration of properties global to all steps, such as restartability. - The job configuration contains: + The job configuration contains: @@ -303,7 +303,7 @@ - JOB_INSTANCE_ID + JOB_INST_ID JOB_NAME @@ -323,7 +323,7 @@ - JOB_INSTANCE_ID + JOB_INST_ID TYPE_CD @@ -339,7 +339,7 @@ schedule.Date - 2008-01-01 00:00:00 + 2008-01-01 @@ -351,9 +351,9 @@ - JOB_EXECUTION_ID + JOB_EXEC_ID - JOB_INSTANCE_ID + JOB_INST_ID START_TIME @@ -367,9 +367,9 @@ 1 - 2008-01-01 21:00:23.571 + 2008-01-01 21:00 - 2008-01-01 21:30:17.132 + 2008-01-01 21:30 FAILED @@ -378,8 +378,8 @@ - extra columns in the tables have been removed for added - clarity. + column names may have been abbreviated or removed for clarity + and formatting Now that the job has failed, let's assume that it took the entire @@ -409,7 +409,7 @@ - JOB_INSTANCE_ID + JOB_INST_ID JOB_NAME @@ -435,7 +435,7 @@ - JOB_INSTANCE_ID + JOB_INST_ID TYPE_CD @@ -473,9 +473,9 @@ - JOB_EXECUTION_ID + JOB_EXEC_ID - JOB_INSTANCE_ID + JOB_INST_ID START_TIME @@ -522,6 +522,11 @@ + + + column names may have been abbreviated or removed for clarity + and formatting + @@ -717,7 +722,7 @@ - JOB_INSTANCE_ID + JOB_INST_ID JOB_NAME @@ -735,7 +740,7 @@ - JOB_INSTANCE_ID + JOB_INST_ID TYPE_CD @@ -751,7 +756,7 @@ schedule.Date - 2008-01-01 00:00:00 + 2008-01-01 @@ -761,9 +766,9 @@ - JOB_EXECUTION_ID + JOB_EXEC_ID - JOB_INSTANCE_ID + JOB_INST_ID START_TIME @@ -777,9 +782,9 @@ 1 - 2008-01-01 21:00:23.571 + 2008-01-01 21:00 - 2008-01-01 21:30:17.132 + 2008-01-01 21:30 FAILED @@ -791,9 +796,9 @@ - STEP_EXECUTION_ID + STEP_EXEC_ID - JOB_EXECUTION_ID + JOB_EXEC_ID STEP_NAME @@ -811,9 +816,9 @@ loadDate - 2008-01-01 21:00:23.571 + 2008-01-01 21:00 - 2008-01-01 21:30:17.132 + 2008-01-01 21:30 FAILED @@ -825,7 +830,7 @@ - STEP_EXECUTION_ID + STEP_EXEC_ID SHORT_CONTEXT @@ -945,8 +950,8 @@ public interface JobLauncher { - public JobExecution run(Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException, - JobRestartException; + public JobExecution run(Job job, JobParameters jobParameters) + throws JobExecutionAlreadyRunningException, JobRestartException; } diff --git a/docs/src/site/docbook/reference/images/meta-data-erd.png b/docs/src/site/docbook/reference/images/meta-data-erd.png index 2a7179068bac5ad0ca85fe82be3b0c9b440c765b..31771519e0170d291b539a34c7c87bc9eb556ef4 100755 GIT binary patch literal 44835 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%0DltGuf(ZZLT#dw{G}uBlGz~ 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 diff --git a/docs/src/site/docbook/reference/job.xml b/docs/src/site/docbook/reference/job.xml index 92efd3f85..138fa6a91 100644 --- a/docs/src/site/docbook/reference/job.xml +++ b/docs/src/site/docbook/reference/job.xml @@ -154,11 +154,12 @@ void afterJob(JobExecution jobExecution){ - if( jobExecution.getStatus = BatchStatus.COMPLETED ){ - //job success - } - else if(jobExecution.getStatus = BatchStatus.FAILED){ - //job failure + if( jobExecution.getStatus = BatchStatus.COMPLETED ){ + //job success + } + else if(jobExecution.getStatus = BatchStatus.FAILED){ + //job failure + } } @@ -379,7 +380,8 @@ that you just don't need to persist status for a particular job. Spring batch provides a solution: - <bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean" /> + <bean id="jobRepository" + class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean" /> diff --git a/docs/src/site/docbook/reference/readersAndWriters.xml b/docs/src/site/docbook/reference/readersAndWriters.xml index be82d6c85..c9bf6b77e 100644 --- a/docs/src/site/docbook/reference/readersAndWriters.xml +++ b/docs/src/site/docbook/reference/readersAndWriters.xml @@ -182,11 +182,14 @@ fields so that the fields may be accessed either by index or name as patterned after ResultSet: - String[] tokens = new String[]{"foo", "1", "true"}; + + String[] tokens = new String[]{"foo", "1", "true"}; FieldSet fs = new DefaultFieldSet(tokens); String name = fs.readString(0); int value = fs.readInt(1); - boolean booleanValue = fs.readBoolean(2); + boolean booleanValue = fs.readBoolean(2); + + There are many more options on the FieldSet interface, such as Date, long, @@ -217,7 +220,7 @@ guide will not go into the details of creating Resource objects. However, a simple example of a file system resource can be found below: - Resource resource = new FileSystemResource("resources/trades.csv"); + Resource resource = new FileSystemResource("resources/trades.csv"); In complex batch environments the directory structures are often @@ -320,10 +323,13 @@ As with RowMapper, which takes a low level construct such as ResultSet and returns an Object, flat file procesing requires the same construct to convert a String - line into an Object:public interface LineMapper<T> { + line into an Object: + public interface LineMapper<T> { - T mapLine(String line, int lineNumber) throws Exception; -} + T mapLine(String line, int lineNumber) throws Exception; + } + + The basic constract is that, given the current line, and the line number its associated with, return a resulting domain object. @@ -349,11 +355,14 @@ necessary. In Spring Batch, this is called a LineTokenizer: - public interface LineTokenizer { + + public interface LineTokenizer { FieldSet tokenize(String line); - } + } + + The contract of a LineTokenizer is such that, given a line of input (in theory the @@ -397,11 +406,14 @@ LineTokenizer to translate a line of data from a resource into an object of the desired type: - public interface FieldSetMapper<T> { + + public interface FieldSetMapper<T> { T mapFieldSet(FieldSet fieldSet); - } + } + + The pattern used is the same as RowMapper used by JdbcTemplate. @@ -459,7 +471,9 @@ public void setFieldSetMapper(FieldSetMapper<T> fieldSetMapper) { this.fieldSetMapper = fieldSetMapper; } -} + } + + The above functionality is provided in a default implementation, rather than being built into the reader itself (as was done in @@ -522,7 +536,8 @@ return player; } - } + } + The file can then be read by correctly constructing a FlatFileItemReader and calling @@ -583,7 +598,8 @@ return player; } - } + } +
@@ -599,14 +615,17 @@ FieldSetMapper configuration looks like the following: - <bean id="fieldSetMapper" + + <bean id="fieldSetMapper" class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper"> <property name="prototypeBeanName" value="player" /> </bean> <bean id="player" class="org.springframework.batch.sample.domain.Player" - scope="prototype" /> + scope="prototype" /> + + For each entry in the FieldSet, the mapper will look for a corresponding setter on a new instance of the @@ -680,7 +699,8 @@ ApplicationContext: - <bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer"> + <bean id="customEditorConfigurer" + class="org.springframework.beans.factory.config.CustomEditorConfigurer"> <property name="customEditors"> <map> <entry key="org.springframework.batch.item.file.transform.Range[]"> @@ -717,7 +737,8 @@ PrefixMatchingCompositeLineTokenizer makes this easier by matching the prefix in a line with a particular tokenizer: - <bean id="orderFileDescriptor" + + <bean id="orderFileDescriptor" class="org.springframework.batch.io.file.transform.PrefixMatchingCompositeLineTokenizer"> <property name="tokenizers"> <map> @@ -733,7 +754,9 @@ <entry key="" value-ref="defaultLineDescriptor" /> </map> </property> - </bean> + </bean> + + This ensures that the line will be parsed correctly, which is especially important for fixed length input. Any users of the @@ -863,11 +886,14 @@ writing to a file. In Spring Batch this is the LineAggregator: - public interface LineAggregator<T> { + + public interface LineAggregator<T> { public String aggregate(T item); - } + } + + The LineAggregator is the opposite of a LineTokenizer. @@ -927,20 +953,26 @@ FlatFileItemWriter expresses this in code: - public void write(T item) throws Exception { + + public void write(T item) throws Exception { write(lineAggregator.aggregate(item) + LINE_SEPARATOR); - } + } + + A simple configuration would look like the following: - <bean id="itemWriter" + + <bean id="itemWriter" class="org.springframework.batch.io.file.FlatFileItemWriter"> <property name="resource" value="file:target/test-outputs/20070122.testStream.multilineStep.txt" /> <property name="lineAggregator"> <bean class="org.springframework.batch.item.file.transform.PassThroughLineAggregator"/> </property> - </bean> + </bean> + +
@@ -1201,12 +1233,12 @@ + format="PNG" width="40%" /> + width="40%" /> Figure 3.1: XML Input @@ -1228,12 +1260,12 @@ + format="PNG" width="40%" /> + format="PNG" width="40%" /> Figure 3.2: OXM Binding @@ -2241,7 +2273,8 @@ <job id="ioSampleJob"> <step name="step1"> - <tasklet reader="fooReader" processor="fooProcessor" writer="compositeItemWriter" commit-interval="2"/> + <tasklet reader="fooReader" processor="fooProcessor" writer="compositeItemWriter" + commit-interval="2"/> <streams> <stream ref="barWriter" /> </streams> @@ -2357,11 +2390,14 @@ rather provides a very simple interface that can be implemented by any number of frameworks: - public interface Validator { + + public interface Validator { void validate(Object value) throws ValidationException; - } + } + + The contract is that the validate method will throw an exception if the object is invalid, and return normally if @@ -2381,9 +2417,14 @@ <value> <![CDATA[ { orderId : ? > 0 AND ? <= 9999999999 : 'Incorrect order ID' : 'error.order.id' } - { totalLines : ? = size(lineItems) : 'Bad count of order lines' : 'error.order.lines.badcount'} - { customer.registered : customer.businessCustomer = FALSE OR ? = TRUE : 'Business customer must be registered' : 'error.customer.registration'} - { customer.companyName : customer.businessCustomer = FALSE OR ? HAS TEXT : 'Company name for business customer is mandatory' :'error.customer.companyname'} + { totalLines : ? = size(lineItems) : 'Bad count of order lines' + : 'error.order.lines.badcount'} + { customer.registered : customer.businessCustomer = FALSE OR ? = TRUE + : 'Business customer must be registered' + : 'error.customer.registration'} + { customer.companyName : customer.businessCustomer = FALSE OR ? HAS TEXT + : 'Company name for business customer is mandatory' + :'error.customer.companyname'} ]]> </value> </property> @@ -2468,7 +2509,8 @@ basic contract of ItemReader, read: - public class CustomItemReader<T> implements ItemReader<T>{ + + public class CustomItemReader<T> implements ItemReader<T>{ List<T> items; @@ -2484,7 +2526,9 @@ } return null; } - } + } + + This very simple class takes a list of items, and returns one at a time, removing it from the list. When the list empty, it returns null, diff --git a/docs/src/site/docbook/reference/schema-appendix.xml b/docs/src/site/docbook/reference/schema-appendix.xml index ace579cfd..c7c1b28da 100644 --- a/docs/src/site/docbook/reference/schema-appendix.xml +++ b/docs/src/site/docbook/reference/schema-appendix.xml @@ -27,12 +27,14 @@ - + - + @@ -518,13 +520,13 @@ INSERT INTO BATCH_JOB_SEQ values(0); The framework will use the meta-data tables to determine if a particular JobInstance has been run before. If it has been run, and - the job is not restartable, then an exception will be thrown. + the job is not restartable, then an exception will be thrown. If an entry for a JobInstance is removed without having completed successfully, the framework will think that the job is new, - rather than a restart. + rather than a restart. @@ -536,4 +538,4 @@ INSERT INTO BATCH_JOB_SEQ values(0);
- + \ 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 fc0b9df9e..95cd4cca9 100644 --- a/docs/src/site/docbook/reference/step.xml +++ b/docs/src/site/docbook/reference/step.xml @@ -204,8 +204,8 @@ <step name="step1"> - <tasklet reader="itemReader" writer="itemWriter" commit-interval="10" allow-start-if-complete="true"/> + <tasklet reader="itemReader" writer="itemWriter" commit-interval="10" + allow-start-if-complete="true"/> </step> @@ -484,7 +484,8 @@ </tasklet> </step> - <beans:bean id="compositeWriter" class="org.springframework.batch.item.support.CompositeItemWriter"> + <beans:bean id="compositeWriter" + class="org.springframework.batch.item.support.CompositeItemWriter"> <beans:property name="delegates"> <beans:list> <beans:ref bean="fileItemWriter1" /> @@ -972,13 +973,13 @@ + scale="" width="40%" /> + width="40%" /> @@ -1019,13 +1020,13 @@ rather than causing failure? + scale="" width="40%" /> + width="40%" /> @@ -1237,7 +1238,7 @@
- Creating File Names at Runtime + Late binding of Job and Step Attributes Both the XML and Flat File examples above use the Spring Resource abstraction to obtain the file to read @@ -1246,11 +1247,14 @@ java.io.File. Both XML and Flat File resources can be configured using standard Spring constructs: - <bean id="flatFileItemReader" + + <bean id="flatFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader"> <property name="resource" value="file://outputs/20070122.testStream.CustomerReportStep.TEMP.txt" /> - </bean> + </bean> + + The above Resource will load the file from the file system, at the location specificied. Note that absolute @@ -1260,10 +1264,13 @@ may need to be determined at runtime as a parameter to the job. This could be solved using '-D' parameters, i.e. a system property: - <bean id="flatFileItemReader" + + <bean id="flatFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader"> <property name="resource" value="${input.file.name}" /> -</bean> + </bean> + + All that would be required for this solution to work would be a system argument (-Dinput.file.name="file://file.txt"). (Note that @@ -1275,35 +1282,63 @@ Often in a batch setting it is preferable to parameterize the file name in the JobParameters of the job, instead of through system properties, and access them that way. To allow for this, - Spring Batch provides the - StepExecutionResourceProxy. The proxy can use - either job name, step name, or any values from the - JobParameters, by surrounding them with %: + Spring Batch allows for the late binding of various Job and Step + attributes: - <bean id="inputFile" - class="org.springframework.batch.core.resource.StepExecutionResourceProxy" /> - <property name="filePattern" value="//%JOB_NAME%/%STEP_NAME%/%file.name%" /> - </bean> + + <bean id="flatFileItemReader" scope="step" + class="org.springframework.batch.item.file.FlatFileItemReader"> + <property name="resource" value="#{jobParameters[input.file.name]}" /> + </bean> - Assuming a job name of 'fooJob', and a step name of 'fooStep', and - the key-value pair of 'file.name="fileName.txt"' is in the - JobParameters the job is started with, the - following filename will be passed as the - Resource: - "//fooJob/fooStep/fileName.txt". It should be noted - that in order for the proxy to have access to the - StepExecution, it must be registered as a - StepListener: + - <bean id="fooStep" parent="abstractStep" - p:itemReader-ref="itemReader" - p:itemWriter-ref="itemWriter"> - <property name="listeners" ref="inputFile" /> - </bean> + Both the JobExecution and + StepExecution level + ExecutionContext can be access in the same + way: - The StepListener interface will be - discussed in more detail in Chapter 4. For now, it is sufficient to know - that the proxy must be registered. + + <bean id="flatFileItemReader" scope="step" + class="org.springframework.batch.item.file.FlatFileItemReader"> + <property name="resource" value="#{jobExecutionContext[input.file.name]}" /> + </bean> + + + + + <bean id="flatFileItemReader" scope="step" + class="org.springframework.batch.item.file.FlatFileItemReader"> + <property name="resource" value="#{stepExecutionContext[input.file.name]}" /> + </bean> + + + +
+ Step Scope + + All of the late binding examples from above have a scope of + "step" declared on the bean definition: + + + <bean id="flatFileItemReader" scope="step" + class="org.springframework.batch.item.file.FlatFileItemReader"> + <property name="resource" value="#{jobParameters[input.file.name]}" /> + </bean> + + + + Using a scope of Step is required in + order to use late binding, since the bean cannot actually be + instantiated until the Step starts, which + allows the attributes to be found. Because it is not part of the + Spring container by default, it must be added explicitely: + + + <bean class="org.springframework.batch.core.scope.StepScope" /> + + +
\ No newline at end of file