From 2882420737996eba9b49198f47ea8a425e3e97e3 Mon Sep 17 00:00:00 2001 From: lucasward Date: Thu, 29 Jan 2009 22:38:25 +0000 Subject: [PATCH] Spelling and grammar corrections to the docs. --- docs/src/site/docbook/reference/domain.xml | 12 +-- .../images/job-repository-advanced.png | Bin 0 -> 36597 bytes .../reference/images/job-repository.png | Bin 0 -> 18766 bytes docs/src/site/docbook/reference/job.xml | 35 ++++--- .../docbook/reference/readersAndWriters.xml | 88 ++++++++-------- docs/src/site/docbook/reference/repeat.xml | 10 +- docs/src/site/docbook/reference/retry.xml | 97 +++++++++--------- .../docbook/reference/schema-appendix.xml | 4 +- docs/src/site/docbook/reference/step.xml | 16 +-- docs/src/site/docbook/reference/testing.xml | 10 +- 10 files changed, 137 insertions(+), 135 deletions(-) create mode 100644 docs/src/site/docbook/reference/images/job-repository-advanced.png create mode 100644 docs/src/site/docbook/reference/images/job-repository.png diff --git a/docs/src/site/docbook/reference/domain.xml b/docs/src/site/docbook/reference/domain.xml index d0d61bc6e..a25056af3 100644 --- a/docs/src/site/docbook/reference/domain.xml +++ b/docs/src/site/docbook/reference/domain.xml @@ -87,7 +87,7 @@ - In Spring Batch, a Job is simply a continer for Steps. It combines + In Spring Batch, a Job is simply a container 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: @@ -110,7 +110,7 @@ interface is provided by Spring Batch in the form of the SimpleJob class which creates some standard functionality on top of Job, however the batch - namespace abstracts away the need to instaniate it directly. Instead, the + namespace abstracts away the need to instantiate it directly. Instead, the <job> tag can be used: @@ -151,7 +151,7 @@ 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) + 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 @@ -756,7 +756,7 @@ schedule.Date - 2008-01-01 + 2008-01-01 @@ -917,7 +917,7 @@ As noted in the comment, ecStep will not equal ecJob, they are two different ExecutionContexts. The one scoped to the Step will be saved at every commit point in the - Step, wheras the one scoped to the + Step, whereas the one scoped to the Job will be saved in between every Step execution. @@ -995,4 +995,4 @@ that it's not valid, returning null indicates that it should not be written out. - \ No newline at end of file + diff --git a/docs/src/site/docbook/reference/images/job-repository-advanced.png b/docs/src/site/docbook/reference/images/job-repository-advanced.png new file mode 100644 index 0000000000000000000000000000000000000000..5f84bff96f7b65de74a68621e83e2d25eac267ad GIT binary patch literal 36597 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

MiY>`ct&t*5X6rl7E-+N3B_7=R;Iq4${g)XB2 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 namespace defaults to referencing a repository with an id of 'jobRepository', which is a sensible default. However, this can be - overriden explicitely: + overridden explicitly: <job id="footballJob" job-repository="specialRepository"> @@ -64,12 +64,13 @@ One key concern when execution a batch job, is what happens when a failed job is restarted? A Job is considered to have been 'restarted' if - the same JobInstance has more than one JobExecution. Ideally, all jobs - should be able to start up where they left off, but there are scenarios - where this is not possible. It is entirely up to - the developer to ensure that a new instance is always created in this - scenario. However, Spring Batch does provide some help. If a - Job should never be restarted, but should always be run as part of a new + the same JobInstance has more than one + JobExecution. Ideally, all jobs should be able to start up where they + left off, but there are scenarios where this is not possible. It is entirely up to the developer to ensure that a new + instance is always created in this scenario. However, Spring + Batch does provide some help. If a Job should never be restarted, but + should always be run as part of a new JobInstance, then the restartable property may be set to 'false': @@ -196,7 +197,7 @@

Configuring a JobRepository - As described in Chatper 2, the JobRepository is used for basic CRUD + As described in Chapter 2, the JobRepository is used for basic CRUD operations of the various persisted domain objects within Spring Batch, such as JobExecution and StepExecution. It is required by many of the major framework features, such as the JobLauncher, @@ -236,7 +237,7 @@ to collide in this way. However, since a call to the create* method is quite short, it is unlikely that the SERIALIZED will cause problems, as long as the database - platform supports it. However, this can be overriden: + platform supports it. However, this can be overridden: <job-repository id="jobRepository" @@ -264,7 +265,7 @@ This fragment can be used as is, with almost no changes. Remember - also to include the appropiate namespace declarations and to make sure + also to include the appropriate namespace declarations and to make sure spring-tx and spring-aop (or the whole of spring) is on the classpath. @@ -274,11 +275,11 @@ Spring Batch provides DDL samples for the meta-data tables in the Core jar file for several common database platforms. Index declarations are not included in that DDL because there are too many - variations in how users may want to index dependeing on their precise + variations in how users may want to index depending on their precise platform, local conventions and also the business requirements of how the jobs will be operated. The table below provides some indication as to which columns are going to be used in a WHERE clause by the Dao - ipmlementations provided by Spring Batch, and how frequently they + implementations provided by Spring Batch, and how frequently they might be used, so that individual projects can make up their own minds about indexing. @@ -679,7 +680,7 @@ - The JobExplorer and JobOperatoer interfaces, which will be discussed + The JobExplorer and JobOperator interfaces, which will be discussed below, add additional functionality for querying and controlling the meta data. @@ -783,8 +784,8 @@ JobRepository, JobExplorer, and JobRegistry. For this reason, the provided - implementation of JobOperator, SimpleJobOperator, has many dependencies: - + implementation of JobOperator, SimpleJobOperator, has many + dependencies: <bean id="jobOperator" class="org.springframework.batch.core.launch.support.SimpleJobOperator"> @@ -850,7 +851,7 @@ In this example, the value with a key of 'run.id' is used to - descriminate between JobInstances. If the JobParameters passed in is + discriminate between JobInstances. If the JobParameters passed in is null, it can be assumed that the Job has never been run before and thus it's initial state can be returned. However, if not, the old value is obtained, incremented by one, and returned. An incrementer can be @@ -889,4 +890,4 @@ for the JobExecution before finishing.
- \ No newline at end of file + diff --git a/docs/src/site/docbook/reference/readersAndWriters.xml b/docs/src/site/docbook/reference/readersAndWriters.xml index c9bf6b77e..aace9cf7b 100644 --- a/docs/src/site/docbook/reference/readersAndWriters.xml +++ b/docs/src/site/docbook/reference/readersAndWriters.xml @@ -331,14 +331,14 @@
- The basic constract is that, given the current line, and the - line number its associated with, return a resulting domain object. - This is similiar to RowMapper in that each line - is associated with it's line number, just as each row in a resultset - is tied to the row number it belongs to. This allows for tying the - line number to the resulting domain object for identitiy comparison, - or for more informative logging. However, unlike - RowMapper, the + The basic contract is that, given the current line, and the line + number its associated with, return a resulting domain object. This is + similar to RowMapper in that each line is + associated with it's line number, just as each row in a + ResultSet is tied to the row number it belongs + to. This allows for tying the line number to the resulting domain + object for identity comparison, or for more informative logging. + However, unlike RowMapper, the LineMapper is given a raw line which, as discussed above, only gets you halfway there. What is needed is tokenization of the line into a FieldSet, which @@ -566,7 +566,7 @@ There is one additional functionality a LineTokenizer that is similar in function to a - JDBC ResultSet. The names of the fields can be + Jdbc ResultSet. The names of the fields can be injected into the LineTokenizer to increase the readability of the mapping function. First, the column names of all fields in the flat file are injected into the @@ -608,10 +608,10 @@ For many, having to write a specific FieldSetMapper is equally as cumbersome as writing a specific RowMapper for a - JdbcTemplate. Spring Batch makes this easier by providing a - FieldSetMapper that automatically maps fields - by matching a field name with a setter on the object using the - JavaBean specification. Again using the football example, the + JdbcTemplate. Spring Batch makes this easier by + providing a FieldSetMapper that automatically + maps fields by matching a field name with a setter on the object using + the JavaBean specification. Again using the football example, the FieldSetMapper configuration looks like the following: @@ -641,7 +641,7 @@ Fixed Length file formats So far only delimited files have been discussed in much detail, - however, they respresent only half of the file reading picture. Many + however, they represent only half of the file reading picture. Many organizations that use flat files use fixed length formats. An example fixed length file is below: @@ -689,8 +689,8 @@ This LineTokenizer will return the same - FieldSet as if a dlimiter had been used, - allowing the same approachs above to be used such as the + FieldSet as if a delimiter had been used, + allowing the same approach above to be used such as the BeanWrapperFieldSetMapper, in a way that is ignorant of how the actual line was parsed. @@ -907,7 +907,7 @@
PassThroughLineAggregator - The most basic implementation of the LineAggreagot interface + The most basic implementation of the LineAggregator interface is the PassThroughLineAggregator, which simply assumes that the object is already a string, or that it's string representation is acceptable for writing: @@ -1000,7 +1000,7 @@ - File writing has similiar, but inverse steps: + File writing has similar, but inverse steps: @@ -1145,9 +1145,9 @@ Fixed Width File Writing Example Delimited is not the only type of flat file format, many prefer - to use a set width for each column to deliniate between fields, which + to use a set width for each column to delineate between fields, which is usually referred to as 'fixed width'. Spring Batch supports this in - file writting via the FormatterLineAggregator. Using the same + file writing via the FormatterLineAggregator. Using the same CustomerCredit domain object described above, it can be configured as follows: @@ -1248,7 +1248,7 @@ above. Everything between '<trade>' and '</trade>' is considered one 'fragment'. Spring Batch uses Object/XML Mapping (OXM) to bind fragments to objects. However, Spring Batch is not tied to any - particular xml binding technology. Typical use is to delegate to Spring OXM, which provides uniform abstraction for the most popular OXM technologies. The dependency on Spring OXM is optional and you @@ -1446,7 +1446,7 @@ optionally sets the overwriteOutput=true, mentioned earlier in the chapter for specifying whether an existing file can be overwritten. It should be noted the marshaller used for the writer is the exact same as - the one used in the reading example from ealier in the chapter: + the one used in the reading example from earlier in the chapter: <bean id="customerCreditMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller"> @@ -1592,7 +1592,7 @@
JdbcCursorItemReader - JdbcCursorItemReader is the JDBC + JdbcCursorItemReader is the Jdbc implementation of the cursor based technique. It works directly with a ResultSet and requires a SQL statement to run against a connection obtained from a @@ -1650,7 +1650,7 @@ DataSource, the provided SQL will be run against it, and the mapRow method will be called for each row in the ResultSet. Let's - constrast this with the approach of the + contrast this with the approach of the JdbcCursorItemReader: @@ -1717,7 +1717,7 @@ fetchSize - Gives the JDBC driver a hint as to the number of rows + Gives the Jdbc driver a hint as to the number of rows that should be fetched from the database when more rows are needed by the ResultSet object used by the ItemReader. By default, no hint is given. @@ -1768,10 +1768,10 @@ driverSupportsAbsolute - Defaults to false. Indicates whether the JDBC driver + Defaults to false. Indicates whether the Jdbc driver supports setting the absolute row on a ResultSet. It is recommended that - this is set to true for JDBC drivers that supports + this is set to true for Jdbc drivers that supports ResultSet.absolute() as it may improve performance, especially if a step fails while working with a large data set. @@ -1795,8 +1795,8 @@ 'READ_ONLY' and 'HOLD_CUSORS_OVER_COMMIT' options. This allows holding the cursor open over transaction start and commits performed in the step processing. To use this - feature you need a database that supports this and a JDBC - driver supporting JDBC 3.0 or later. + feature you need a database that supports this and a Jdbc + driver supporting Jdbc 3.0 or later. @@ -1888,7 +1888,7 @@ JdbcPagingItemReader needs a PagingQueryProvider responsible for providing the SQL queries used to retrieve the rows making up a page. Since each - database has its own strategy for proviing paging support, we need to + database has its own strategy for providing paging support, we need to use a different PagingQueryProvider for each supported database type. There is also the SimpleDelegatingPagingQueryProvider that will @@ -1952,7 +1952,7 @@ ItemReader is the JpaPagingItemReader. JPA doesn't have a concept similar to the Hibernate StatelessSession so we - have to use other features provided by the JPA specification. SInce + have to use other features provided by the JPA specification. Since JPA supports paging, this is a natural choice when it comes to using JPA for batch processing. After each page is read the entities will become detached and the persistence context will be cleared in order @@ -2021,7 +2021,7 @@ IbatisPagingItemReader and there is also a _page variable that can be used if necessary. The syntax for the paging queries varies with the database used. Here - is an example for Oracle (unfortunatey we need to use CDATA for some + is an example for Oracle (unfortunately we need to use CDATA for some operators since this belongs in an XML document): <select id="getPagedCustomerCredits" resultMap="customerCreditResult"> @@ -2044,9 +2044,9 @@ for files because they must act as if they're transactional, keeping track of written items and flushing or clearing at the appropriate times. Databases have no need for this functionality, since the write is - already contained in a transaction. Users can create their own DAO's - that implement the ItemWriter interface or use - one from a custom ItemWriter that's written for + already contained in a transaction. Users can create their own DAOs that + implement the ItemWriter interface or use one + from a custom ItemWriter that's written for generic processing concerns, either way, they should work without any issues. One thing to look out for is the performance and error handling capabilities that are provided by batching the outputs. This is most @@ -2201,10 +2201,10 @@ } An ItemProcessor is very simple, given one - object, transorm it and return another. The object provided may or may not - be of the same type. The point is that business logic may be applied + object, transform it and return another. The object provided may or may + not be of the same type. The point is that business logic may be applied within process, and is completely up to the developer to create. An - ItemProcessor can be wired direclty into a step, + ItemProcessor can be wired directly into a step, For example, assuming an ItemReader provides a class of type Foo, and it needs to be converted to type Bar before being written out. An ItemTransformer can be written that @@ -2346,7 +2346,7 @@ itemProcessors.add(new BarTransformer()); compositeProcessor.setItemProcessors(itemProcessors); - Just as with the previous example, the compsite processor can be + Just as with the previous example, the composite processor can be configured into the Step: @@ -2453,7 +2453,7 @@ flipped from false to true. The SQL statement can then contain an extra statement in the where clause, such as: "where PROCESSED_IND = false", thereby insuring that only unprocessed records will be returned in the - case of a restart. In this scenario, it is prefereable to not store any + case of a restart. In this scenario, it is preferable to not store any state, such as the current row number, since it will be irrelevant upon restart. For this reason, all readers and writers include the 'saveState' property: @@ -2557,9 +2557,9 @@ actually valid in many scenarios, but it is sometimes preferable that a batch job starts off at where it left off. The key discriminant is often whether the reader is stateful or stateless. A stateless reader - does not need to worry about restartablility, but a stateful one has - to try and reconstitute its last known state on restart. For this - reason, we recommend that you keep custom readers stateless as far as + does not need to worry about restartability, but a stateful one has to + try and reconstitute its last known state on restart. For this reason, + we recommend that you keep custom readers stateless as far as possible, so you don't have to worry about restartability. If you do need to store state, then in Spring Batch, this is @@ -2696,4 +2696,4 @@
- \ No newline at end of file + diff --git a/docs/src/site/docbook/reference/repeat.xml b/docs/src/site/docbook/reference/repeat.xml index 1a15c52da..ff53841d7 100644 --- a/docs/src/site/docbook/reference/repeat.xml +++ b/docs/src/site/docbook/reference/repeat.xml @@ -8,7 +8,7 @@ RepeatTemplate Batch processing is about repetitive actions - either as a simple - optimisation, or as part of a job. To strategise and generalise the + optimisation, or as part of a job. To strategie and generalise the repetition, and provide what amounts to an iterator framework, Spring Batch has the RepeatOperations interface. The RepeatOperations interface looks like this: @@ -137,10 +137,10 @@ template.iterate(new RepeatCallback() { flexible, so that they can be created with any code and description the user needs. Spring Batch comes with some standard values out of the box, to support common use cases, but users are free to create their own - values, as long as the semantics of teh continuable + values, as long as the semantics of the continuable property are honoured.
- ExitStatus values can also be combined with valrious operators + ExitStatus values can also be combined with various operators built into the class as methods. You can add an exit code, or description, or combine the continuable values with logical AND using methods in ExitStatus. You can also combine two ExitStatus values with @@ -163,7 +163,7 @@ template.iterate(new RepeatCallback() { the loop in the iterate method is determined by a CompletionPolicy which is also a factory for the ReapeatContext. The - RepeatTemplate has the reponsibility to use the + RepeatTemplate has the responsibility to use the current policy to create a RepeatContext and pass that in to the RepeatCallback at every stage in the iteration. After a callback completes its @@ -319,4 +319,4 @@ template.iterate(new RepeatCallback() { ExceptionHandler in the provided RepeatTemplate. - \ No newline at end of file + diff --git a/docs/src/site/docbook/reference/retry.xml b/docs/src/site/docbook/reference/retry.xml index 09262c2c9..46be89dd4 100644 --- a/docs/src/site/docbook/reference/retry.xml +++ b/docs/src/site/docbook/reference/retry.xml @@ -17,27 +17,27 @@ RetryOperations strategy. The RetryOperations interface looks like this: - public interface RetryOperations { - T execute(RetryCallback retryCallback) throws Exception; + <T> T execute(RetryCallback<T> retryCallback) throws Exception; - T execute(RetryCallback retryCallback, RecoveryCallback recoveryCallback) + <T> T execute(RetryCallback<T> retryCallback, RecoveryCallback<T> recoveryCallback) throws Exception; - T execute(RetryCallback retryCallback, RetryState retryState) + <T> T execute(RetryCallback<T> retryCallback, RetryState retryState) throws Exception, ExhaustedRetryException; - T execute(RetryCallback retryCallback, RecoveryCallback recoveryCallback, + <T> T execute(RetryCallback<T> retryCallback, RecoveryCallback<T> recoveryCallback, RetryState retryState) throws Exception; -}]]>where the basic callback is a simple interface that - allows you to insert some business logic to be retried +}where the basic callback is a simple interface that allows + you to insert some business logic to be retried
- { + public interface RetryCallback<T> { T doWithRetry(RetryContext context) throws Throwable; -}]]>The callback is executed and if it fails (by throwing an +}The callback is executed and if it fails (by throwing an Exception), it will be retried until either it is successful, or the implementation decides to abort. There are a number of overloaded execute methods in the @@ -50,18 +50,18 @@ RetryOperations is RetryTemplate. It could be used like this - RetryTemplate template = new RetryTemplate(); template.setRetryPolicy(new TimeoutRetryPolicy(30000L)); -Foo result = template.execute(new RetryCallback() { +Foo result = template.execute(new RetryCallback<Foo>() { public Foo doWithRetry(RetryContext context) { // Do stuff that might fail, e.g. webservice operation return result; } -});]]> +}); In the example we execute a web service call and return the result to the user. If that call fails then it is retried until a timeout is @@ -90,17 +90,17 @@ Foo result = template.execute(new RetryCallback() { clients just pass in the callbacks together to the same method, for example: - () { + Foo foo = template.execute(new RetryCallback<Foo>() { public Foo doWithRetry(RetryContext context) { // business logic here }, - new RecoveryCallback() { + new RecoveryCallback<Foo>() { Foo recover(RetryContext context) throws Exception { // recover logic here } -});]]>If the business logic does not succeed before the - template decides to abort, then the client is given the chance to do - some alternate processing through the recovery callback. +});If the business logic does not succeed before the template + decides to abort, then the client is given the chance to do some + alternate processing through the recovery callback.
@@ -144,7 +144,7 @@ Foo result = template.execute(new RetryCallback() { RetryContextCache with a cluster cache of some sort (even in a clustered environment this might be overkill). - Part of the reponsibility of the + Part of the responsibility of the RetryOperations is to recognise the failed operations when they come back in a new execution (and usually wrapped in a new transaction). To facilitate this, Spring Batch provides the @@ -189,7 +189,7 @@ Foo result = template.execute(new RetryCallback() { or fail in the execute method is determined by a RetryPolicy which is also a factory for the RetryContext. The - RetryTemplate has the reponsibility to use the + RetryTemplate has the responsibility to use the current policy to create a RetryContext and pass that in to the RetryCallback at every attempt. After a callback fails the RetryTemplate has to @@ -210,8 +210,9 @@ Foo result = template.execute(new RetryCallback() { doesn't help to retry it. So don't retry on all exception types - try to focus on only those exceptions that you expect to be retryable. It's not usually harmful to the business logic to retry more aggressively, but - it's wasteful because if a failure is determinstic there could be a very - tight loop retrying something that you know in advance is fatal. + it's wasteful because if a failure is deterministic there could be a + very tight loop retrying something that you know in advance is + fatal. Spring Batch provides some simple general purpose implementations of @@ -226,7 +227,7 @@ Foo result = template.execute(new RetryCallback() { this list overrides the retryable list, so it can be used to give finer control over the retry behaviour, e.g. - SimpleRetryPolicy policy = new SimpleRetryPolicy(5); // Retry on all exceptions (this is the default) policy.setRetryableExceptions(new Class[] {Exception.class}); // ... but never retry IllegalStateException @@ -235,11 +236,11 @@ policy.setFatalExceptions(new Class[] {ILlegalStateException.class}); // Use the policy... RetryTemplate template = new RetryTemplate(); template.setRetryPolicy(policy); -template.execute(new RetryCallback() { +template.execute(new RetryCallback<Foo>() { public Foo doWithRetry(RetryContext context) { // business logic here } -});]]> +}); There is also a more flexible implementation called ExceptionClassifierRetryPolicy, which allows the @@ -265,20 +266,20 @@ template.execute(new RetryCallback() { RetryTemplate can pause execution according to the BackoffPolicy in place. - public interface BackoffPolicy { BackOffContext start(RetryContext context); void backOff(BackOffContext backOffContext) throws BackOffInterruptedException; -}]]>A BackoffPolicy is free to - implement the backOff in any way it chooses. The policies provided by - Spring Batch out of the box all use Object.wait(). A common - use case is to backoff with an exponentially increasing wait period, to - avoid two retries getting into lock step and both failing - this is a - lesson learned from the ethernet. For this purpose Spring Batch provides - the ExponentialBackoffPolicy. +}A BackoffPolicy is free to implement + the backOff in any way it chooses. The policies provided by Spring Batch + out of the box all use Object.wait(). A common use case is to + backoff with an exponentially increasing wait period, to avoid two retries + getting into lock step and both failing - this is a lesson learned from + the ethernet. For this purpose Spring Batch provides the + ExponentialBackoffPolicy.
@@ -295,15 +296,15 @@ template.execute(new RetryCallback() { The interface looks like this: - public interface RetryListener { - void open(RetryContext context, RetryCallback callback); + void open(RetryContext context, RetryCallback<T> callback); - void onError(RetryContext context, RetryCallback callback, Throwable e); + void onError(RetryContext context, RetryCallback<T> callback, Throwable e); - void close(RetryContext context, RetryCallback callback, Throwable e); + void close(RetryContext context, RetryCallback<T> callback, Throwable e); } -]]>The open and +The open and close callbacks come before and after the entire retry in the simplest case, and onError applies to the individual RetryCallback calls. The close @@ -334,20 +335,20 @@ template.execute(new RetryCallback() { remoteCall (for more detail on how to configure AOP interceptors see the Spring User Guide): - - - - + <aop:config> + <aop:pointcut id="transactional" + expression="execution(* com...*Service.remoteCall(..))" /> + <aop:advisor pointcut-ref="transactional" + advice-ref="retryAdvice" order="-1"/> +</aop:config> - -]]> +<bean id="retryAdvice" + class="org.springframework.batch.retry.interceptor.RetryOperationsInterceptor"/> + The example above uses a default RetryTemplate inside the interceptor. To change the - policies, listeners etc. you only need to inject an instance of + policies or listeners, you only need to inject an instance of RetryTemplate into the interceptor.
- \ No newline at end of file + diff --git a/docs/src/site/docbook/reference/schema-appendix.xml b/docs/src/site/docbook/reference/schema-appendix.xml index c7c1b28da..250bfaf5e 100644 --- a/docs/src/site/docbook/reference/schema-appendix.xml +++ b/docs/src/site/docbook/reference/schema-appendix.xml @@ -510,7 +510,7 @@ INSERT INTO BATCH_JOB_SEQ values(0);
Archiving - Because there are entries in multiple tables everytime a batch job + Because there are entries in multiple tables every time a batch job is run, it is common to create an archive strategy for the meta-data tables. The tables themselves are designed to show a record of what happened in the past, and generally won't affect the run of any job, with @@ -538,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 a792dbc4c..c361287f8 100644 --- a/docs/src/site/docbook/reference/step.xml +++ b/docs/src/site/docbook/reference/step.xml @@ -1257,12 +1257,12 @@ The above Resource will load the file from - the file system, at the location specificied. Note that absolute - locations have to start with a double slash ("//"). In most spring - applications, this solution is good enough because the names of these - are known at compile time. However, in batch scenarios, the file name - 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: + the file system, at the location specified. Note that absolute locations + have to start with a double slash ("//"). In most spring applications, + this solution is good enough because the names of these are known at + compile time. However, in batch scenarios, the file name 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" @@ -1332,7 +1332,7 @@ 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 explicitly: + Spring container by default, it must be added explicitly: <bean class="org.springframework.batch.core.scope.StepScope" /> @@ -1341,4 +1341,4 @@ - \ No newline at end of file + diff --git a/docs/src/site/docbook/reference/testing.xml b/docs/src/site/docbook/reference/testing.xml index 9fcab4f1e..1312e35d7 100644 --- a/docs/src/site/docbook/reference/testing.xml +++ b/docs/src/site/docbook/reference/testing.xml @@ -10,7 +10,7 @@ detail, so it won't be repeated here. It is important, however, to think about how to 'end to end' test a batch job, which is what this chapter will focus on. The spring-batch-test project includes classes that will help - factillitate this end-to-end test approach. + facilitate this end-to-end test approach.
Creating a Unit Test Class @@ -27,7 +27,7 @@ @ContextConfiguration(locations = {...}): - Indicates which xml files contain the ApplicationContext. + Indicates which XML files contain the ApplicationContext. @@ -93,9 +93,9 @@
Testing Individual Steps - For complex batch jobs, test cases in the end-to-end tesing approach - may become unmanageable. It these cases, it may be more useful to have - test cases to test individual steps on their own. The + For complex batch jobs, test cases in the end-to-end testing + approach may become unmanageable. It these cases, it may be more useful to + have test cases to test individual steps on their own. The AbstractJobTests class contains a method launchStep that takes a step name and runs just that particular Step. This approach allows for more