From 2bda9ff4d6ca7e8ce50c65e4b2ed466b1ad0ff06 Mon Sep 17 00:00:00 2001 From: David Follis Date: Wed, 4 Dec 2019 13:57:15 -0500 Subject: [PATCH 1/2] I began with the asciidoc version generated by Tim Fanelli from the Word document and after his significant cleanup work. That was located here: https://github.com/WASdev/standards.jsr352.batch-spec Below are the changes made from that point.. Issue numbers are from that copy --- Assorted formatting cleanup stuff Issue WASdev#4 - Missing section header 10.5 skews section number afterwards -> Fixed by putting a blank line before section header Issue WASdev#3 - Section numbers only go down 3 levels -> Fixed by specifying :sectnumlevels: 5 in the main doc. Note that this is an undocumented option Google found for me in a forum post from 2015 (https://discuss.asciidoctor.org/Section-Numbering-Levels-td3879.html) Section 1 - License - lettered bullet list items are all 'a' -> Fixed by changing to a,b,c,d Section 8.2.6 Partitioning - XML sample not formatted, "Syntax:" not on its own line -> Added blank lines before "Syntax:" and before the xml Section 8.4.1 Split Termination Processing Incomplete - "Incomplete" was not part of the title -> Removed line break between "Processing" and "Incomplete" Section 8.7.1 - Strikethrough sentence shouldn't be bolded -> changed asterisks around strikethrough text to pound signs (* to #) This was mentioned in issue WASdev#1 along with a reference to section 9.6 missing a space which was already fixed. Sections 8.6.1, 8.6.2, and 8.6.4 examples aren't formatted -> Either move the open '<' out of column one or add [source,xml] before XML delimited by four dashes '----' Under Section 8.8.81 in subsections "jobProperties Substitution Operator" and "partitionPlan Substitution Operator" -> Reformatted XML with better indention. -> Also removed an extraneous from the jobProperties example that had been there forever (in original) Section 8.8.2 - examples of property substitution -> formatting was honoring line breaks so name and value were on separate lines, merged 'em together so they fit on one line making it more readable Section 8.9.4 - paragraphs aren't numbered as an ordered list so references to rule WASdev#2 is meaningless -> Added ". " before paragraphs to trigger numbering and a ".. " before the note under item 2 to sublist as 'a'. Section 8.9.5 - the word 'Undefined' should have been part of the title but was on the next line -> removed line break -> Also cleaned up formatting of JSL Section 9.1.2 - At the end of the Batchlet interface there was an embedded image with text about batchlet stop processing -> The image had an unresolved reference in it and just looked silly. Made it into a TIP: with a link/ref to the Stop section. Section 9.3.1 (@BatchProperty) - A 'Note' paragraph was in a gray box for no reason -> Removed the space before 'Note' that made it an example Section 9.3.1 (@BatchProperty) - The MyItemReaderImpl sample code block has an extraneous '\' after the class name -> Removed it. Wasn't in the original.. Section 9.3.2 - 'Injection' should be part of the title but is on the next line -> Removed extraneous line break -> Also cleaned up XML sample indention Section 9.4.1.1 has an item list of JobContext and StepContext. StepContext had a '+' at the end -> put there to force a line break, there was no space between the 't' and the '+'. Added one. Section 9.5 - Partitioned/Concurrent sections need to be numbered with inner list ordered with letters -> Changed number to the '. ' and '.. ' syntax with a '+' on blank lines to continue list paragraphs. Section 10.9.9 (JobExecution) - getCreateTime has an extraneous 'updated' in the javadoc -> Removed it (this was in the original spec too), mentioned in Issue WASdev#1 Lifecycle flows have some errors -> In Partitioned Batchlet Processsing, in the original PDF steps 8, 10, and 12 are indented but numbered as part of the main sequence (showing they are part of the conditional in the line above). In the asciidoc in lines 8 and 10 we indented these with a '..' which threw off the numbering, so I removed the extra dot. This left things numbered right, but we lost the indentation for the conditional (this step is the 'then' of an 'if'). I used five non-blank-space elements ({nbsp}{nbsp}{nbsp}{nbsp}{nbsp}) to scoot it over a little. -> In Regular Chunk Processing step 9.b.i was missing a space after the dots so it got folded into 9.b. Added a space -> Note also that four layers in (9.b.i.1 in the original) uses letters so 9.b.i.A. Didn't try to fix this. -> In Partitioned Chunk Processing there's a comment after step 5 but the '+' to put it on a separate line was missing a leading space so it was taken literally. Added a space. -> Also items 5.e.v and vi were run into the prior item due to missing spaces after the dots, added a space -> And some more non-blank-spaces added to get indention -> In "Chunk with Listeners (except RetryListener)" a whole block was indented one too many levels..backed it out one -> In Chunk with RetryListener one line split throwing the count off, merged that..and then a lot of the nbsp stuff to try to get the indentations right -> In Chunk with Custom Checkpoint Processing more indentation level problems Throughout - numerous reuses of the app-listing block identifier -> Tacked on the name of the block it was identifying (e.g. app-listing.ItemReader.java) -> Also fixed the PartitionAnalyzer block name which mis-identified it as a PartitionCollector Throughout - XML sample indention needs tidying up -> Some are specified above, but touched up a bunch of other ones Throughout - XML blocks aren't tagged that way..seems to default properly -> but thought I'd be complete and mark 'em all... Sign off Signed-off-by: David Follis --- spec/README.md | 1 + spec/src/main/asciidoc/acknowledgements.adoc | 13 + spec/src/main/asciidoc/applicability.adoc | 2 + spec/src/main/asciidoc/batch-spec.adoc | 142 +- spec/src/main/asciidoc/batch-spec.html | 9469 +++++++++++++++++ spec/src/main/asciidoc/batch-spec.pdf | Bin 0 -> 2576141 bytes spec/src/main/asciidoc/batch.adoc | 15 - .../asciidoc/batch_programming_model.adoc | 1773 +++ .../src/main/asciidoc/batch_runtime_spec.adoc | 1252 +++ spec/src/main/asciidoc/batch_xml_xsd.adoc | 23 + spec/src/main/asciidoc/domain_language.adoc | 194 + spec/src/main/asciidoc/forward.adoc | 2 + spec/src/main/asciidoc/images/image003.png | Bin 0 -> 18298 bytes spec/src/main/asciidoc/images/image005.png | Bin 0 -> 21277 bytes spec/src/main/asciidoc/images/image007.png | Bin 0 -> 15339 bytes spec/src/main/asciidoc/images/image009.png | Bin 0 -> 27392 bytes spec/src/main/asciidoc/introduction.adoc | 6 + .../main/asciidoc/job_runtime_lifecycle.adoc | 409 + .../asciidoc/job_specification_language.adoc | 2205 ++++ .../job_specification_language_xml.adoc | 440 + 20 files changed, 15923 insertions(+), 23 deletions(-) create mode 100644 spec/src/main/asciidoc/acknowledgements.adoc create mode 100644 spec/src/main/asciidoc/applicability.adoc create mode 100644 spec/src/main/asciidoc/batch-spec.html create mode 100644 spec/src/main/asciidoc/batch-spec.pdf delete mode 100644 spec/src/main/asciidoc/batch.adoc create mode 100644 spec/src/main/asciidoc/batch_programming_model.adoc create mode 100644 spec/src/main/asciidoc/batch_runtime_spec.adoc create mode 100644 spec/src/main/asciidoc/batch_xml_xsd.adoc create mode 100644 spec/src/main/asciidoc/domain_language.adoc create mode 100644 spec/src/main/asciidoc/forward.adoc create mode 100644 spec/src/main/asciidoc/images/image003.png create mode 100644 spec/src/main/asciidoc/images/image005.png create mode 100644 spec/src/main/asciidoc/images/image007.png create mode 100644 spec/src/main/asciidoc/images/image009.png create mode 100644 spec/src/main/asciidoc/introduction.adoc create mode 100644 spec/src/main/asciidoc/job_runtime_lifecycle.adoc create mode 100644 spec/src/main/asciidoc/job_specification_language.adoc create mode 100644 spec/src/main/asciidoc/job_specification_language_xml.adoc diff --git a/spec/README.md b/spec/README.md index 38e50c8..c5faedc 100644 --- a/spec/README.md +++ b/spec/README.md @@ -6,6 +6,7 @@ This project generates the Jakarta Batch Specification. Building -------- + Prerequisites: * JDK8+ diff --git a/spec/src/main/asciidoc/acknowledgements.adoc b/spec/src/main/asciidoc/acknowledgements.adoc new file mode 100644 index 0000000..07e2be7 --- /dev/null +++ b/spec/src/main/asciidoc/acknowledgements.adoc @@ -0,0 +1,13 @@ +== Acknowledgements +A number of individuals deserve special recognition for their contributions to forming this specification: + +* Kevin Conner +* Tim Fanelli +* Cheng Fang +* Mahesh Kannan +* Scott Kurz +* Wayne Lund +* Simon Martinelli +* Michael Minella +* Kaushik Mukherjee +* Joe Pullen diff --git a/spec/src/main/asciidoc/applicability.adoc b/spec/src/main/asciidoc/applicability.adoc new file mode 100644 index 0000000..e6d574f --- /dev/null +++ b/spec/src/main/asciidoc/applicability.adoc @@ -0,0 +1,2 @@ +== Applicability of Specification +This specification applies to Java SE and Java EE environments. It requires Java 6 or higher. diff --git a/spec/src/main/asciidoc/batch-spec.adoc b/spec/src/main/asciidoc/batch-spec.adoc index 6b5d37b..0563875 100644 --- a/spec/src/main/asciidoc/batch-spec.adoc +++ b/spec/src/main/asciidoc/batch-spec.adoc @@ -9,19 +9,145 @@ :license: Eclipse Foundation Specification License v1.0 :source-highlighter: coderay :toc: left -:toclevels: 4 -:sectnumlevels: 4 +:toclevels: 9 +:toc: macro +:tocplacement: manual +:sectnums: +:sectnumlevels: 5 :sectanchors: ifdef::backend-pdf[] :pagenums: :numbered: -:title-logo-image: image:jakarta_ee_logo_schooner_color_stacked_default.png[pdfwidth=4.25in,align=right] +:title-logo-image: image:images/jakarta_ee_logo_schooner_color_stacked_default.png[pdfwidth=4.25in,align=right] endif::[] -// == License -:sectnums!: +== License include::license-efsl.adoc[] -// == Wombat -:sectnums: -include::batch.adoc[] +include::acknowledgements.adoc[] + +include::forward.adoc[] + +== Table of Contents + +toc::[] + +include::introduction.adoc[] + +include::applicability.adoc[] + +include::domain_language.adoc[] + +include::job_specification_language.adoc[] + +include::batch_programming_model.adoc[] + +include::batch_runtime_spec.adoc[] + +include::job_runtime_lifecycle.adoc[] + +include::batch_xml_xsd.adoc[] + +include::job_specification_language_xml.adoc[] + +== Credits + +Section 7 Domain Language of Batch, was adapted from Spring Batch +Reference Documentation: + +http://static.springsource.org/spring-batch/trunk/reference/html-single/index.html[http://static.springsource.org/spring-batch/trunk/reference/html-single/index.html] + +== Change Log + +=== Version 1.0 Revision A - Maintenance Release + +==== Issues List + +Following these links will show each original issue on our official spec +issues tracking list. In most cases the bug report contains the complete +text of the spec delta or addition, but not in every single case. + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|https://java.net/bugzilla/show_bug.cgiid=5389[5389] |In Sec. xref:_job_parameters_on_restart[10.7.1], +should we have said we require a "no-arg" explicit or implicit +constructor rather than a "default constructor" + +|https://java.net/bugzilla/show_bug.cgiid=4827[4827] |SPEC: Misspoke on +collector role on exit status + +|https://java.net/bugzilla/show_bug.cgiid=5490[5490] |Clarify +JobContext/StepContext properties; fix TCK to not depend on writable +Properties + +|https://java.net/bugzilla/show_bug.cgiid=5431[5431] +|ItemProcessListener#onProcessError has javadoc from +ItemProcessListener#afterProcess + +|https://java.net/bugzilla/show_bug.cgiid=5498[5498] |Add "mark FAILED" +to BatchStatus state transitions + +|https://java.net/bugzilla/show_bug.cgiid=5370[5370] |Spec is unclear +whether JobOperator methods may/must execute synchronously or not (with +TCK implications) + +|https://java.net/bugzilla/show_bug.cgiid=5583[5583] +|CheckpointAlgorithm needs to specify timeunit (seconds) and other +javadoc fixes + +|https://java.net/bugzilla/show_bug.cgiid=5372[5372] |Evaluation order +of multiple transition elements + +|https://java.net/bugzilla/show_bug.cgiid=5691[5691] |"Looping" should +be clarified + +|https://java.net/bugzilla/show_bug.cgiid=5690[5690] |Flow/Split +transitioning & termination not fully defined + +|https://java.net/bugzilla/show_bug.cgiid=5374[5374] |Details of +exception handling (by container) + +|https://java.net/bugzilla/show_bug.cgiid=4830[4830] |xref:_next_element[8.6.1] Transition +Next Element + +|https://java.net/bugzilla/show_bug.cgiid=4865[4865] |SPEC Partition +Plan example confusing + +|https://java.net/bugzilla/show_bug.cgiid=5533[5533] |stop/end/fail +exit-status should affect job exit status, not step (as claimed in +spec). + +|https://java.net/bugzilla/show_bug.cgiid=5780[5780] |Spec should +clarify StepExecution values passed to Decider on a restart + +|https://java.net/bugzilla/show_bug.cgiid=5373[5373] |Co-existence of +transition elements with @next attribute PLUS behavior if no transition +element @on is matched + +|https://java.net/bugzilla/show_bug.cgiid=5375[5375] |Spec contradicts +itself when talking about uninitialized exit status (TCK assumes 'null') + +|https://java.net/bugzilla/show_bug.cgiid=4866[4866] |SPEC Partition +Properties example has a invalid tag + +|https://java.net/bugzilla/show_bug.cgiid=5746[5746] |@Inject +@BatchProperty should work for job level properties + +|https://java.net/bugzilla/show_bug.cgiid=5911[5911] |Clarify partition +restart processing, PartitionPlan properties, and persistent user data +for partitioned steps. + +|https://java.net/bugzilla/show_bug.cgiid=5873[5873] |Clarify when +CheckpointAlgorithm#beginCheckpoint is invoked + +|https://java.net/bugzilla/show_bug.cgiid=5919[5919] |Spec doesn't fully +describe PartitionPlan override and the use of PartitionMapper + +|https://java.net/bugzilla/show_bug.cgiid=5875[5875] |When the first +readItem() in a chunk return 'null', is this a zero-item chunk or is +this not a new chunk after all + +|https://java.net/bugzilla/show_bug.cgiid=5403[5403] |Spec unclear on +skipping part of an Exception hierarchy +|======================================================================= + diff --git a/spec/src/main/asciidoc/batch-spec.html b/spec/src/main/asciidoc/batch-spec.html new file mode 100644 index 0000000..c7762df --- /dev/null +++ b/spec/src/main/asciidoc/batch-spec.html @@ -0,0 +1,9469 @@ + + + + + + + + +Jakarta Batch + + + + + +
+
+

1. License

+
+
+
+
Specification: Jakarta Batch
+
+Version: {revnumber}
+
+Status: Final Release
+
+Release: {revdate}
+
+
+
+

Copyright (c) 2019 Eclipse Foundation.

+
+
+

1.1. Eclipse Foundation Specification License

+
+

By using and/or copying this document, or the Eclipse Foundation +document from which this statement is linked, you (the licensee) agree +that you have read, understood, and will comply with the following +terms and conditions:

+
+
+

Permission to copy, and distribute the contents of this document, or +the Eclipse Foundation document from which this statement is linked, in +any medium for any purpose and without fee or royalty is hereby +granted, provided that you include the following on ALL copies of the +document, or portions thereof, that you use:

+
+
+
    +
  • +

    link or URL to the original Eclipse Foundation document.

    +
  • +
  • +

    All existing copyright notices, or if one does not exist, a notice +(hypertext is preferred, but a textual representation is permitted) +of the form: "Copyright (c) [$date-of-document] +Eclipse Foundation, Inc. [url to this license]"

    +
  • +
+
+
+

Inclusion of the full text of this NOTICE must be provided. We +request that authorship attribution be provided in any software, +documents, or other items or products that you create pursuant to the +implementation of the contents of this document, or any portion +thereof.

+
+
+

No right to create modifications or derivatives of Eclipse Foundation +documents is granted pursuant to this license, except anyone may +prepare and distribute derivative works and portions of this document +in software that implements the specification, in supporting materials +accompanying such software, and in documentation of such software, +PROVIDED that all such works include the notice below. HOWEVER, the +publication of derivative works of this document for use as a technical +specification is expressly prohibited.

+
+
+

The notice is:

+
+
+

"Copyright (c) 2018 Eclipse Foundation. This software or +document includes material copied from or derived from [title and URI +of the Eclipse Foundation specification document]."

+
+
+

1.1.1. Disclaimers

+
+

THIS DOCUMENT IS PROVIDED "AS IS," AND THE COPYRIGHT +HOLDERS AND THE ECLIPSE FOUNDATION MAKE NO REPRESENTATIONS OR +WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +NON-INFRINGEMENT, OR TITLE; THAT THE CONTENTS OF THE DOCUMENT ARE +SUITABLE FOR ANY PURPOSE; NOR THAT THE IMPLEMENTATION OF SUCH CONTENTS +WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR +OTHER RIGHTS.

+
+
+

THE COPYRIGHT HOLDERS AND THE ECLIPSE FOUNDATION WILL NOT BE LIABLE +FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT +OF ANY USE OF THE DOCUMENT OR THE PERFORMANCE OR IMPLEMENTATION OF THE +CONTENTS THEREOF.

+
+
+

The name and trademarks of the copyright holders or the Eclipse +Foundation may NOT be used in advertising or publicity pertaining to +this document or its contents without specific, written prior +permission. Title to copyright in this document will at all times +remain with copyright holders.

+
+
+
+
+
+
+

2. Acknowledgements

+
+
+

A number of individuals deserve special recognition for their contributions to forming this specification:

+
+
+
    +
  • +

    Kevin Conner

    +
  • +
  • +

    Tim Fanelli

    +
  • +
  • +

    Cheng Fang

    +
  • +
  • +

    Mahesh Kannan

    +
  • +
  • +

    Scott Kurz

    +
  • +
  • +

    Wayne Lund

    +
  • +
  • +

    Simon Martinelli

    +
  • +
  • +

    Michael Minella

    +
  • +
  • +

    Kaushik Mukherjee

    +
  • +
  • +

    Joe Pullen

    +
  • +
+
+
+
+
+

3. Foreword

+
+
+

This specification describes the job specification language, Java programming model, and runtime environment for batch applications for the Java platform. It is designed for use on both the Java SE and Java EE platforms. Additionally, it is designed to work with dependency injection (DI) containers without prescribing a particular DI implementation.

+
+
+
+
+

4. Table of Contents

+
+
+
Table of Contents
+ +
+
+
+
+

5. Introduction to JSR 352

+
+
+

Batch processing is a pervasive workload pattern, expressed by a distinct application organization and execution model. It is found across virtually every industry, applied to such tasks as statement generation, bank postings, risk evaluation, credit score calculation, inventory management, portfolio optimization, and on and on. Nearly any bulk processing task from any business sector is a candidate for batch processing.

+
+
+

Batch processing is typified by bulk-oriented, non-interactive, background execution. Frequently long-running, it may be data or computationally intensive, execute sequentially or in parallel, and may be initiated through various invocation models, including ad hoc, scheduled, and on-demand.

+
+
+

Batch applications have common requirements, including logging, checkpointing, and parallelization. Batch workloads have common requirements, especially operational control, which allow for initiation of, and interaction with, batch instances; such interactions include stop and restart.

+
+
+
+
+

6. Applicability of Specification

+
+
+

This specification applies to Java SE and Java EE environments. It requires Java 6 or higher.

+
+
+
+
+

7. Domain Language of Batch

+
+
+

To any experienced batch architect, the overall concepts of batch +processing used by JSR 352 should be familiar and comfortable. There are +"Jobs" and "Steps" and developer supplied processing units called +ItemReaders and ItemWriters. However, because of the JSR 352 operations, +callbacks, and idioms, there are opportunities for the following:

+
+
+
    +
  1. +

    significant improvement in adherence to a clear separation of +concerns

    +
  2. +
  3. +

    clearly delineated architectural layers and services provided as +interfaces

    +
  4. +
  5. +

    significantly enhanced extensibility

    +
  6. +
+
+
+

The diagram below is a simplified version of the batch reference +architecture that has been used for decades. It provides an overview of +the components that make up the domain language of batch processing. +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. JSR 352 specifies the layers, components and +technical services commonly found in robust, maintainable systems used +to address the creation of simple to complex batch applications.

+
+
+
+image +
+
+
+

The diagram above highlights the key concepts that make up the domain +language of batch. A Job has one to many steps, which has no more than +one ItemReader, ItemProcessor, and ItemWriter. A job needs to be +launched (JobOperator), and meta data about the currently running +process needs to be stored (JobRepository).

+
+
+

7.1. Job

+
+

A Job is an entity that encapsulates an entire batch process. A Job +will be wired together via a Job Specification Language. However, Job is +just the top of an overall hierarchy:

+
+
+
+http://static.springsource.org/spring-batch/trunk/reference/html-single/images/job-heirarchy.png +
+
+
+

With JSR 352, 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:

+
+
+
    +
  1. +

    The simple name of the job

    +
  2. +
  3. +

    Definition and ordering of Steps

    +
  4. +
  5. +

    Whether or not the job is restartable

    +
  6. +
+
+
+

7.1.1. 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 is still +the January 1st run. Usually this corresponds with the data it is +processing as well, meaning the January 1st run processes data for +January 1st, etc. Therefore, each JobInstance can have multiple +executions (JobExecution is discussed in more detail below); one or many +JobInstances corresponding to a particular Job can be running at a given +time.

+
+
+

The definition of a JobInstance has absolutely no bearing on the data +that 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' from previous executions will be available to +the new run. Using a new JobInstance will mean 'start from the +beginning' and using an existing instance will generally mean 'start +from where you left off'.

+
+
+
+

7.1.2. JobParameters

+
+

Job parameters can be specified each time a job is started or restarted. +Job parameters are keyword/value string pairs. The JobOperator start and +restart operations support the specification of job parameters. See +section 10.4 for further details on JobOperator.

+
+
+
+

7.1.3. JobExecution

+
+

A JobExecution refers to the technical concept of a single attempt to +run a Job. Each time a job is started or restarted, a new JobExecution +is created, belonging to the same JobInstance.

+
+
+
+
+

7.2. Step

+
+

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 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 it. 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. As with Job, a Step +has an individual StepExecution that corresponds with a unique +JobExecution:

+
+
+
+http://static.springsource.org/spring-batch/trunk/reference/html-single/images/jobHeirarchyWithSteps.png +
+
+
+

7.2.1. 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 its Step is actually started.

+
+
+
+
+

7.3. JobOperator

+
+

JobOperator provides an interface to manage all aspects of job +processing, including operational commands, such as start, restart, and +stop, as well as job repository related commands, such as retrieval of +job and step executions. See section 10.4 for more details about +JobOperator.

+
+
+
+

7.4. Job Repository

+
+

A job repository holds information about jobs currently running and +jobs that have run in the past. The JobOperator interface provides +access to this repository. The repository contains job instances, job +executions, and step executions. For further information on this +content, see sections 10.9.8, 10.9.9, 10.9.10, respectively.

+
+
+

Note the implementation of the job repository is outside the scope of +this specification.

+
+
+
+

7.5. ItemReader

+
+

ItemReader is an abstraction that represents the retrieval of input for +a Step, one item at a time. An ItemReader provides an indicator when it +has exhausted the items it can supply. See section 9.1.1.1 for more +details about ItemReaders.

+
+
+
+

7.6. ItemWriter

+
+

ItemWriter is an abstraction that represents the output of a Step, one +batch or chunk of items 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. See section 9.1.1.3 for more details +about ItemWriters.

+
+
+
+

7.7. ItemProcessor

+
+

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. See section 9.1.1.2 for more details about +ItemProcessors.

+
+
+
+

7.8. Chunk-oriented Processing

+
+

JSR 352 specifies a 'Chunk Oriented' processing style as its primary +pattern. Chunk oriented processing refers to reading the data one item +at a time, and creating 'chunks' that will be written out, within a +transaction boundary. One item is read in from an ItemReader, handed to +an ItemProcessor, and aggregated. Once the number of items read equals +the commit interval, the entire chunk is written out via the ItemWriter, +and then the transaction is committed.

+
+
+
+http://static.springsource.org/spring-batch/trunk/reference/html-single/images/chunk-oriented-processing.png +
+
+
+
+

7.9. Batch Checkpoints

+
+

For data intensive batch applications - particularly those that may run +for long periods of time - checkpoint/restart is a common design +requirement. Checkpoints allow a step execution to periodically bookmark +its current progress to enable restart from the last point of +consistency, following a planned or unplanned interruption.

+
+
+

Checkpoints work naturally with chunk-oriented processing. The end of +processing for each chunk is a natural point for taking a checkpoint.

+
+
+

JSR 352 specifies runtime support for checkpoint/restart in a generic +way that can be exploited by any chunk-oriented batch step that has this +requirement.

+
+
+

Since progress during a step execution is really a function of the +current position of the input/output data, natural placement of function +suggests the knowledge for saving/restoring current position is a +reader/writer responsibility.

+
+
+

Since managing step execution is a runtime responsibility, the batch +runtime must necessarily understand step execution lifecycle, including +initial start, execution end states, and restart.

+
+
+

Since checkpoint frequency has a direct effect on lock hold times, for +lockable resources, tuning checkpoint interval size can have a direct +bearing on overall system throughput.

+
+
+
+
+
+

8. Job Specification Language

+
+
+

Job Specification Language (JSL) specifies a job, its steps, and +directs their execution. The JSL for JSR 352 is implemented with XML and +will be henceforth referred to as "Job XML".

+
+
+

8.1. Job

+
+

The 'job' element identifies a job.

+
+
+

Syntax:

+
+
+
+
 <job id="{name}" restartable="{true|false}">
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

id

Specifies the logical name of the job and is used for +identification purposes. It must be a valid XML string value. This is a +required attribute.

restartable

Specifies whether or not this job is restartable . It must +specify true or false. This is an optional attribute. The default is +true.

+
+

8.1.1. Job Level Listeners

+
+

Job level listeners may be configured to a job in order to intercept job +execution. The listener element may be specified as child element of the +job element for this purpose. Job listener is the only listener type +that may be specified as a job level listener.

+
+
+

Multiple listeners may be configured on a job. However, there is no guarantee of the order in which they are invoked.

+
+
+

Syntax:

+
+
+
+
 <listeners>
+  <listener ref="{name}">
+  ...
+ </listeners>
+
+
+
+

Where:

+
+ ++++ + + + + + + +

ref

Specifies the name of a batch artifact.

+
+
+

8.1.2. Job Level Exception Handling

+
+

Any unhandled exception thrown by a job-level listener causes the job to +terminate with a batch status of FAILED. In this context, "unhandled" +simply means an exception thrown by the listener back to the runtime +implementation.

+
+
+
+

8.1.3. Job Level Properties

+
+

The 'properties' element may be specified as a child element of the job +element. It is used to expose properties to any batch artifact belonging +to the job and also to the batch runtime. Any number of properties may +be specified. Job level properties are available through the JobContext +runtime object. See section 9.4 for further information about Job +Context.

+
+
+

Syntax:

+
+
+
+
 <properties>
+   <property name="{property-name}" value="{name-value}"/>
+ </properties>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

name

Specifies a unique property name within the current scope. It +must be a valid XML string value. This is a required attribute.

value

Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute.

+
+
+
+

8.2. Step

+
+

The 'step' element identifies a job step and its characteristics. Step +is a child element of job. A job may contain any number of steps. Each +step may be either a chunk type step or batchlet type step. See section +8.2.1 for information on chunk type steps and section 8.2.2 for +information on batchlet type steps.

+
+
+

Syntax:

+
+
+
+
 <step id="{name}"
+       start-limit="{integer}"
+       allow-start-if-complete ="{true|false}"
+       next="{flow-id|step-id|split-id|decision-id}">
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + + + + + + + + + +

id

Specifies the logical name of the step and is used for +identification purposes. It must be a valid XML string value. This is a +required attribute.

start-limit

Specifies the number of times this step may be started or +restarted. It must be a valid XML integer value. This is an optional +attribute. The default is 0, which means no limit. If the limit is +exceeded, the job is placed in the FAILED state.

allow-start-if-complete

Specifies whether this step is allowed to +start during job restart, even if the step completed in a previous +execution. It must be true or false. A value of true means the +step is allowed to restart. This is an optional attribute. The default +is false.

next

Specifies the next step, flow, split, or decision to run after +this step is complete. It must be a valid XML string value. This is an +optional attribute. The default is this step is the last step in the job +or flow. Note: next attributes cannot be specified such that a loop +occurs among steps.

+
+

8.2.1. Chunk

+
+

The 'chunk' element identifies a chunk type step. It is a child element +of the step element. A chunk type step is periodically checkpointed by +the batch runtime according to a configured checkpoint policy. Items +processed between checkpoints are referred to as a "chunk". A single +call is made to the ItemWriter per chunk. Each chunk is processed in a +separate transaction. See section 9.7 for more details on +transactionality. A chunk that is not complete is restartable from its +last checkpoint. A chunk that is complete and belongs to a step +configured with allow-start-if-complete=true runs from the beginning +when restarted.

+
+
+

Syntax:

+
+
+
+
 <chunk checkpoint-policy="\{item|custom}"
+  item-count="{value}"
+  time-limit="{value}"
+  skip-limit="{value}"
+  retry-limit="{value}" />
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + + + + + + + + + + + + + +

checkpoint-policy

Specifies the checkpoint policy that governs commit +behavior for this chunk. Valid values are: "item" or "custom". The +"item" policy means the chunk is checkpointed after a specified number +of items are processed. The "custom" policy means the chunk is +checkpointed according to a checkpoint algorithm implementation. +Specifying "custom" requires that the checkpoint-algorithm element is +also specified. See section 8.2.1.5 for checkpoint-algorithm. It is an +optional attribute. The default policy is "item".

item-count

Specifies the number of items to process per chunk when +using the item checkpoint policy. It must be valid XML integer. It is an +optional attribute. The default is 10. The item-count attribute is +ignored for "custom" checkpoint policy.

time-limit

Specifies the amount of time in seconds before taking a +checkpoint for the item checkpoint policy. It must be valid XML integer. +It is an optional attribute. The default is 0, which means no limit. +When a value greater than zero is specified, a checkpoint is taken when +time-limit is reached or item-count items have been processed, whichever +comes first. The time-limit attribute is ignored for "custom" checkpoint +policy.

skip-limit

Specifies the number of exceptions a step will skip if any +configured skippable exceptions are thrown by chunk processing. It must +be a valid XML integer value. It is an optional attribute. The default +is no limit.

retry-limit

Specifies the number of times a step will retry if any +configured retryable exceptions are thrown by chunk processing. It must +be a valid XML integer value. It is an optional attribute. The default +is no limit.

+
+
8.2.1.1. Reader
+
+

The 'reader' element specifies the item reader for a chunk step. It is a +child element of the 'chunk' element. A chunk step must have one and +only one item reader.

+
+
+

Syntax:

+
+
+
+
 <reader ref="{name}"/>
+
+
+
+

Where:

+
+ ++++ + + + + + + +

ref

Specifies the name of a batch artifact.

+
+
8.2.1.1.1. Reader Properties
+
+

The 'properties' element may be specified as a child element of the +reader element. It is used to pass property values to a item reader. Any +number of properties may be specified.

+
+
+

Syntax:

+
+
+
+
  <properties>
+    <property name="{property-name}" value="{name-value}"/>
+  </properties>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

name

Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute.

value

Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute.

+
+
+
+
8.2.1.2. Processor
+
+

The 'processor' element specifies the item processor for a chunk step. +It is a child element of the 'chunk' element. The processor element is +optional on a chunk step. Only a single processor element may be +specified.

+
+
+

Syntax:

+
+
+
+
 <processor ref="{name}"/>
+
+
+
+

Where:

+
+ ++++ + + + + + + +

ref

Specifies the name of a batch artifact.

+
+
8.2.1.2.1. Processor Properties
+
+

The 'properties' element may be specified as a child element of the +processor element. It is used to pass property values to a item +processor. Any number of properties may be specified.

+
+
+

Syntax:

+
+
+
+
 <properties>
+  <property name="{property-name}" value="{name-value}"/>
+ </properties>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

name

Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute.

value

Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute.

+
+
+
+
8.2.1.3. Writer
+
+

The 'writer' element specifies the item writer for a chunk step. It is a +child element of the 'chunk' element. A chunk type step must have one +and only one item writer.

+
+
+

Syntax:

+
+
+
+
 <writer ref="{name}"/>
+
+
+
+

Where:

+
+ ++++ + + + + + + +

ref

Specifies the name of a batch artifact.

+
+
8.2.1.3.1. Writer Properties
+
+

The 'properties' element may be specified as a child element of the +writer element. It is used to pass property values to a item writer. Any +number of properties may be specified.

+
+
+

Syntax:

+
+
+
+
 <properties>
+  <property name="{property-name}" value="{name-value}"/>
+ </properties>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

name

Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute.

value

Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute.

+
+
+
+
8.2.1.4. Chunk Exception Handling
+
+

By default, when any batch artifact that is part of a chunk type step +throws an exception to the Batch Runtime, the job execution ends with a +batch status of FAILED. The default behavior can be overridden for a +reader, processor, or writer artifact by configuring exceptions to skip +or to retry. The default behavior can be overridden for the entire step +by configuring a transition element that matches the step’s exit +status.

+
+
+
8.2.1.4.1. Skipping Exceptions
+
+

The skippable-exception-classes element specifies a set of exceptions +that chunk processing will skip. This element is a child element of the +chunk element. It applies to exceptions thrown from the reader, +processor, and writer batch artifacts of a chunk type step. It also applies +to exceptions thrown during checkpoint commit processing. A failed +commit will be treated the same as a failed write. The total number of +skips is set by the skip-limit attribute on the chunk element. See +section 8.2.1 for details on the chunk element.

+
+
+

A given exception will be skipped if it "matches" an include child +element of the skippable-exception-classes element, though this might be +negated (and the exception not skipped) if it also "matches" an exclude +child element of skippable-exception-classes.

+
+
+

The behavior is determined by the "nearest superclass" in the class +hierarchy.

+
+
+

To elaborate, in this context, "matches" means the following: For an +include (or exclude) element C with @class attribute value T, an +exception E "matches" C when either E is of type T or E’s type is a +subclass of T.

+
+
+

When an exception E "matches" both one or more include and one or more +exclude elements, then there will be one type T1 among all the matching +include/exclude elements such that all other distinct matching element +types are superclasses of T1 (because of Java’s single inheritance). If +T1 only occurs in a matching include element then include (skip) this +exception. If T1 appears in a matching exclude element (even if it also +appears in a matching include element), then exclude (don’t skip) this +exception.

+
+
+

Optional Skip Listener batch artifacts can be configured to the step. A +Skip Listener receives control after a skippable exception is thrown by +the reader, processor, or writer. See section 9.2.7 for details on the +Skip Listener batch interfaces.

+
+
+

Syntax:

+
+
+
+
 <skippable-exception-classes>
+  <include class="{class name}"/>
+  <exclude class="{class name}"/>
+ </skippable-exception-classes>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

include class

Specifies the class name of an exception or exception +superclass to skip. It must be a fully qualified class name. Multiple +instances of the include element may be specified. The include child +element is optional. However, when specified, the class attribute is +required.

exclude class

Specifies a class name of an exception or exception +superclass to not skip. 'Exclude class' reduces the number of exceptions +eligible to skip as specified by 'include class'. It must be a fully +qualified class name. Multiple instances of the exclude element may be +specified. The exclude child element is optional. However, when +specified, the class attribute is required.

+
+

Example:

+
+
+
+
 <skippable-exception-classes>
+  <include class="java.lang.Exception"/>
+  <exclude class="java.io.FileNotFoundException"/>
+ </skippable-exception-classes>
+
+
+
+

The preceding example would skip all exceptions except +java.io.FileNotFoundException, (along with any subclasses of +java.io.FileNotFoundException).

+
+
+
+
8.2.1.4.2. Retrying Exceptions
+
+

The retryable-exception-classes element specifies a set of exceptions +that chunk processing will retry. This element is a child element of the +chunk element. It applies to exceptions thrown from the reader, +processor, or writer batch artifacts of a chunk type step. It also +applies to exceptions thrown by checkpoint commit processing. The total +number of retry attempts is set by the retry-limit attribute on the +chunk element. See section 8.2.1 for details on the chunk element.

+
+
+

The list of exceptions that will be retried (or not retried) is +specified in the retryable-exception-classes element on the child +include element. This list, however, may be modified using one or more +child exclude elements. The rules for deciding whether to retry or not +retry a given exception when a combination of include and exclude +elements are used are analogous to the rules described in the discussion +in section 8.2.1.4.1 for skipping exceptions.

+
+
+

Optional Retry Listener batch artifacts can be configured on the step. A +Retry Listener receives control after a retryable exception is thrown by +the reader, processor, or writer. See section 9.2.8 for details on the +Retry Listener batch artifact.

+
+
+

Syntax:

+
+
+
+
 <retryable-exception-classes>
+  <include class="{class name}"/>
+  <exclude class="{class name}"/>
+ </retryable-exception-classes>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

include class

Specifies a class name of an exception or exception +superclass to retry. It must be a fully qualified class name. Multiple +instances of the include element may be specified. The include child +element is optional. However, when specified, the class attribute is +required.

exclude class

Specifies a class name of an exception or exception +superclass to not retry. 'Exclude class' reduces the number of +exceptions eligible for retry as specified by 'include class'. It must +be a fully qualified class name. Multiple instances of the include +element may be specified. The exclude child element is optional. +However, when specified, the class attribute is required.

+
+

Example:

+
+
+
+
 <retryable-exception-classes>
+  <include class="java.io.IOException"/>
+  <exclude class="java.io.FileNotFoundException"/>
+ </retryable-exception-classes>
+
+
+
+

The result is that all IOExceptions except FileNotFoundException (and +its subclasses) would be retried.

+
+
+
+
8.2.1.4.3. Retry and Skip the Same Exception
+
+

When the same exception is specified as both retryable and skippable, +retryable takes precedence over skippable during regular processing of +the chunk. While the chunk is retrying, skippable takes precedence over +retryable since the exception is already being retried.

+
+
+

This allows an exception to initially be retried for the entire chunk +and then skipped if it recurs. When retrying with default retry behavior +(see section 8.2.1.4.4) the skips can occur for individual items, since +the retry is done with an item-count of 1.

+
+
+
+
8.2.1.4.4. Default Retry Behavior - Rollback
+
+

When a retryable exception occurs, the default behavior is for the batch +runtime to rollback the current chunk and re-process it with an +item-count of 1 and a checkpoint policy of item. If the optional +ChunkListener is configured on the step, the onError method is called +before rollback. The default retry behavior can be overridden by +configuring the no-rollback-exception-classes element. See section +8.2.1.4.5 for more information on specifying no-rollback exceptions.

+
+
+
+
8.2.1.4.5. Preventing Rollback During Retry
+
+

The no-rollback-exception-classes element specifies a list of exceptions +that override the default behavior of rollback for retryable exceptions. +This element is a child element of the chunk element. If a retryable +exception is thrown the default behavior is to rollback before retry. If +an exception is specified as both a retryable and a no-rollback +exception, then no rollback occurs and the current operation is retried. +Retry Listeners, if configured, are invoked. See section 9.2.8 for +details on the Retry Listener batch artifact.

+
+
+

The rules for determining whether a combination of include and exclude +child elements of no-rollback-exception-classes results in the "no +rollback" behavior or not are analogous to the rules described in the +discussion in section 8.2.1.4.1 for skipping exceptions.

+
+
+

Syntax:

+
+
+
+
 <no-rollback-exception-classes>
+  <include class="{class name}"/>
+  <exclude class="{class name}"/>
+ </no-rollback-exception-classes>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

include class

Specifies a class name of an exception or exception +superclass for which rollback will not occur during retry processing. It +must be a fully qualified class name. Multiple instances of the include +element may be specified. The include child element is optional. +However, when specified, the class attribute is required.

exclude class

Specifies a class name of an exception or exception +superclass for which rollback will occur during retry processing. It +must be a fully qualified class name. Multiple instances of the include +element may be specified. The exclude child element is optional. +However, when specified, the class attribute is required.

+
+
+
+
8.2.1.5. Checkpoint Algorithm
+
+

The checkpoint-algorithm element specifies an optional custom checkpoint +algorithm. It is a child element of the chunk element. It is valid when +the chunk element checkpoint-policy attribute specifies the value +'custom'. A custom checkpoint algorithm may be used to provide a +checkpoint decision based on factors other than only number of items, or +amount of time. See section 9.1.1.4 for further information about custom +checkpoint algorithms.

+
+
+

Syntax:

+
+
+
+
 <checkpoint-algorithm ref="{name}"/>
+
+
+
+

Where:

+
+ ++++ + + + + + + +

ref

Specifies the name of a batch artifact.

+
+
8.2.1.5.1. Checkpoint Algorithm Properties
+
+

The 'properties' element may be specified as a child element of the +checkpoint algorithm element. It is used to pass property values to a +checkpoint algorithm. Any number of properties may be specified.

+
+
+

Syntax:

+
+
+
+
 <properties>
+  <property name="{property-name}" value="{name-value}"/>
+ </properties>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

Name

Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute.

Value

Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute.

+
+
+
+
+

8.2.2. Batchlet

+
+

The batchlet element specifies a task-oriented batch step. It is +specified as a child element of the step element. It is mutually +exclusive with the chunk element. See 9.1.2 for further details about +batchlets. Steps of this type are useful for performing a variety of +tasks that are not item-oriented, such as executing a command or doing +file transfer.

+
+
+

Syntax:

+
+
+
+
 <batchlet ref="{name}"/>
+
+
+
+

Where:

+
+ ++++ + + + + + + +

Ref

Specifies the name of a batch artifact.

+
+
8.2.2.1. Batchlet Exception Handling
+
+

This section is superseded by section 8.2.7.

+
+
+
+
8.2.2.2. Batchlet Properties
+
+

The 'properties' element may be specified as a child element of the +batchlet element. It is used to pass property values to a batchlet. Any +number of properties may be specified.

+
+
+

Syntax:

+
+
+
+
 <properties>
+  <property name="{property-name}" value="{name-value}"/>
+ </properties>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

Name

Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute.

value

Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute.

+
+
+
+

8.2.3. Step Level Properties

+
+

The 'properties' element may be specified as a child element of the step +element. It is used to expose properties to any step level batch +artifact and also to the batch runtime. Any number of properties may be +specified. Step level properties are available through the StepContext +runtime object. See section 9.4 for further information about +StepContext.

+
+
+

Syntax:

+
+
+
+
 <properties>
+  <property name="{property-name}" value="{name-value}"/>
+ </properties>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

name

Specifies a unique property name within the current scope. It +must be a valid XML string value. This is a required attribute.

value

Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute.

+
+
+

8.2.4. Step Level Listeners

+
+

Step level listeners may be configured to a job step in order to +intercept step execution. The listener element may be specified as child +element of the step element for this purpose. The following listener +types may be specified according to step type:

+
+
+
    +
  • +

    chunk step - step listener, item read listener, item process listener, +item write listener, chunk listener, skip listener, and retry listener

    +
  • +
  • +

    batchlet step - step listener

    +
  • +
+
+
+

Multiple listeners may be configured on a step. However, there is no +guarantee of the order in which they are invoked.

+
+
+

Syntax:

+
+
+
+
 <listeners>
+  <listener ref="{name}">
+  ...
+ </listeners>
+
+
+
+

Where:

+
+ ++++ + + + + + + +

ref

Specifies the name of a batch artifact.

+
+
8.2.4.1. Step Level Listener Properties
+
+

The 'properties' element may be specified as a child element of the +step-level listeners element. It is used to pass property values to a +step listener. Any number of properties may be specified.

+
+
+

Syntax:

+
+
+
+
 <properties>
+  <property name="{property-name}" value="{name-value}"/>
+ </properties>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

name

Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute.

value

Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute.

+
+

Example:

+
+
+
+
 <listener ref="{name}">
+  <properties>
+   <property name="Property1" value="Property1-Value"/>
+  </properties>
+ </listener>
+
+
+
+
+
+

8.2.5. Step Sequence

+
+

The first step, flow, or split defines the first step (flow or split) to +execute for a given Job XML. "First" means first according to order of +occurrence as the Job XML document is parsed from beginning to end. The +'next' attribute on the step, flow, or split defines what executes next. +The next attribute may specify a step, flow, split, or decision. For the +purpose of discussing transitioning it is convenient to group these four +with the term "execution elements". The next attribute is supported on +step, flow, and split elements. Steps, flows, and decisions may also + use the "next" element to specify what executes +next. The next attribute and next element may not be used in a way that +allows for looping among job execution elements.

+
+
+

Syntax:

+
+
+
+
 <next on="{exit status}" to="{id}" />
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

on

Specifies an exit status to match to the current next element. It +must be a valid XML string value. Wildcards of "" and "" may be used. +"" matches zero or more characters. "" matches exactly one character. +It must match an exit status value in order to have effect. This is a +required attribute.

to

Specifies the id of another step, split, flow, or decision, which +will execute next. It must be a valid XML string value. It must match an +id of another step, split, flow, or decision in the same job. For a step +inside a flow, the id must match another step in the same flow. This is +a required attribute.

+
+

See section 8.6 for more details about transition +elements and section 8.9 for details on transitioning rules.

+
+
+
+

8.2.6. Step Partitioning

+
+

A batch step may run as a partitioned step. A partitioned step runs as +multiple instances of the same step definition across multiple threads, +one partition per thread. The number of partitions and the number of +threads is controlled through either a static specification in the Job +XML or through a batch artifact called a partition mapper. Each +partition needs the ability to receive unique parameters to instruct it +which data on which to operate. Properties for each partition may be +specified statically in the Job XML or through the optional partition +mapper. Since each thread runs a separate copy of the step, chunking and +checkpointing occur independently on each thread for chunk type steps.

+
+
+

There is an optional way to coordinate these separate units of work in a +partition reducer so that backout is possible if one or more partitions +experience failure. The PartitionReducer batch artifact provides a way +to do that. A PartitionReducer provides programmatic control over +logical unit of work demarcation that scopes all partitions of a +partitioned step.

+
+
+

The partitions of a partitioned step may need to share results with a +control point to decide the overall outcome of the step. The +PartitionCollector and PartitionAnalyzer batch artifact pair provide for +this need.

+
+
+

The 'partition' element specifies that a step is a partitioned step. The +partition element is a child element of the 'step' element. It is an +optional element.

+
+
+

Syntax:

+
+
+
+
 <partition>
+
+
+
+

Example:

+
+
+

The following Job XML snippet shows how to specify a partitioned step:

+
+
+
+
 <step id="Step1">
+  <chunk .../> or <batchlet ... />
+  <partition .../>
+ </step>
+
+
+
+
8.2.6.1. Partition Plan
+
+

A partition plan defines several configuration attributes that affect +partitioned step execution. A partition plan specifies the number of +partitions, the number of partitions to execute concurrently, and the +properties for each partition. A partition plan may be defined in a Job +XML declaratively or dynamically at runtime with a partition mapper.

+
+
+

The 'plan' element is a child element of the 'partition' element. The +'plan' element is mutually exclusive with partition mapper element. See +section 9.5.1 for further details on partition mapper.

+
+
+

Note the specification does not attempt to guarantee order of partition +execution with respect to the order within a statically or +dynamically-defined plan.

+
+
+

Syntax:

+
+
+
+
 <plan partitions="{number}" threads="{number}"/>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

Partitions

Specifies the number of partitions for this partitioned +step. This is a an optional attribute. The default is 1.

threads

Specifies the maximum number of threads on which to execute +the partitions of this step. Note the batch runtime cannot guarantee the +requested number of threads are available; it will use as many as it can +up to the requested maximum. This is an optional attribute. The default +is the number of partitions.

+
+

Example:

+
+
+

The following Job XML snippet shows how to specify a step partitioned +into 3 partitions on 2 threads:

+
+
+
+
 <step id="Step1">
+   <chunk .../>
+   <partition>
+     <plan partitions="3" threads="2"/>
+   </partition>
+ </step>
+
+
+
+
+
8.2.6.2. Partition Properties
+
+

When defining a statically partitioned step, it is possible to specify +unique property values to pass to each partition directly in the Job XML +using the property element. See section 9.5.1 for further information on +partition mapper.

+
+
+

Syntax:

+
+
+
+
 <properties partition="_partition-number_">
+  <property name="{property-name}" value="{name-value}"/>
+ </properties>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + + + + + +

partition

Specifies the logical partition number to which the +specified properties apply. This must be a non-negative integer value, +starting at 0.

name

Specifies a unique property name within the current +scope . It must be a valid XML string value. If +it matches a named property in the associated batch artifact, its value +is assigned to that property. If not, it is ignored. This is a required +attribute.

value

Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute.

+
+

Example:

+
+
+

The following Job XML snippet shows a step of 2 partitions with a unique +value for the property named "filename" for each partition:

+
+
+
+
 <partition>
+  <plan partitions="2">
+   <properties partition="0">
+    <property name="filename" value="/tmp/file1.txt"/>
+   </properties>
+   <properties partition="1">
+    <property name="filename" value="/tmp/file2.txt"/>
+   </properties>
+  </plan>
+ </partition>
+
+
+
+
+
8.2.6.3. Partition Mapper
+
+

The partition mapper provides a programmatic means for calculating the +number of partitions and threads for a partitioned step. The partition +mapper also specifies the properties for each partition. The mapper +element specifies a reference to a PartitionMapper batch artifact; see +section 9.5.1 for further information. Note the mapper element is +mutually exclusive with the plan element.

+
+
+

Syntax:

+
+
+
+
 <mapper ref="{name}">
+
+
+
+

Where:

+
+ ++++ + + + + + + +

ref

Specifies the name of a batch artifact.

+
+

Example:

+
+
+
+
 <partition>
+  <mapper ref="MyStepPartitioner"/>
+ </partition>
+
+
+
+
8.2.6.3.1. Mapper Properties
+
+

The 'properties' element may be specified as a child element of the +mapper element. It is used to pass property values to a PartitionMapper +batch artifact. Any number of properties may be specified.

+
+
+

Syntax:

+
+
+
+
 <properties>
+  <property name="{property-name}" value="{name-value}"/>
+ </properties>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

name

Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute.

value

Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute.

+
+
+
+
8.2.6.4. Partition Reducer
+
+

A partitioned step may execute with an optional partition reducer. A +partition reducer provides a kind of unit of work demarcation around the +processing of the partitions. Programmatic interception of the +partitioned step’s lifecycle is possible through the partition reducer. +The reducer element specifies a reference to a PartitionReducer batch +artifact; see section 9.5.2 for further information.

+
+
+

The 'reducer' element is a child element of the 'partition' element.

+
+
+

Syntax:

+
+
+
+
 <reducer ref="{name}">
+
+
+
+

Where:

+
+ ++++ + + + + + + +

ref

Specifies the name of a batch artifact.

+
+

Example:

+
+
+
+
 <partition>
+ <reducer ref="MyStepPartitionReducer"/>
+ </partition>
+
+
+
+
8.2.6.4.1. Partition Reducer Properties
+
+

The 'properties' element may be specified as a child element of the +PartitionReducer element. It is used to pass property values to a +PartitionReducer batch artifact. Any number of properties may be +specified.

+
+
+

Syntax:

+
+
+
+
 <properties>
+  <property name="{property-name}" value="{name-value}"/>
+ </properties>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

name

Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute.

value

Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute.

+
+
+
+
8.2.6.5. Partition Collector
+
+

A Partition Collector is useful for sending intermediary results for +analysis from each partition to the step’s Partition Analyzer. A +separate Partition Collector instance runs on each thread executing a +partition of the step. The collector is invoked at the conclusion of +each checkpoint for chunking type steps and again at the end of +partition; it is invoked once at the end of partition for batchlet type +steps. A collector returns a Java Serializable object, which is +delivered to the step’s Partition Analyzer. See section 9.5.4 for +further information about the Partition Analyzer. The collector element +specifies a reference to a PartitionCollector batch artifact; see +section 9.5.3 for further information.

+
+
+

The 'collector' element is a child element of the 'partition' element.

+
+
+

Syntax:

+
+
+
+
 <collector ref="{name}">
+
+
+
+

Where:

+
+ ++++ + + + + + + +

ref

Specifies the name of a batch artifact.

+
+

Example:

+
+
+
+
 <partition>
+  <collector ref="MyStepCollector"/>
+ </partition>
+
+
+
+
8.2.6.5.1. Partition Collector Properties
+
+

The 'properties' element may be specified as a child element of the +collector element. It is used to pass property values to a +PartitionCollector batch artifact. Any number of properties may be +specified.

+
+
+

Syntax:

+
+
+
+
 <properties>
+  <property name="{property-name}" value="{name-value}"/>
+ </properties>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

name

Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute.

value

Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute.

+
+
+
+
8.2.6.6. Partition Analyzer
+
+

A Partition Analyzer receives intermediary results from each partition +sent via the step’s Partition Collector. A Partition analyzer runs on +the step main thread and serves as a collection point for this data. The +PartitionAnalyzer also receives control with the partition exit status +for each partition, after that partition ends. An analyzer can be used +to implement custom exit status handling for the step, based on the +results of the individual partitions. The analyzer element specifies a +reference to a PartitionAnalyzer batch artifact; see section 9.5.4 for +further information.

+
+
+

Syntax:

+
+
+
+
 <analyzer ref="{name}">
+
+
+
+

Where:

+
+ ++++ + + + + + + +

ref

Specifies the name of a batch artifact.

+
+

Example:

+
+
+
+
 <partition>
+  <analyzer ref="MyStepAnalyzer"/>
+ </partition>
+
+
+
+
8.2.6.6.1. Partition Analyzer Properties
+
+

The 'properties' element may be specified as a child element of the +analyzer element. It is used to pass property values to a +PartitionAnalyzer batch artifact. Any number of properties may be +specified.

+
+
+

Syntax:

+
+
+
+
 <properties>
+  <property name="{property-name}" value="{name-value}"/>
+ </properties>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

name

Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute.

value

Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute.

+
+
+
+
+

8.2.7. Step Exception Handling

+
+

Any unhandled exception thrown by any step-level artifact during step +processing causes the step to terminate with a batch status of FAILED. +In this context, "unhandled" means an exception thrown by the execution +of the artifact back to the runtime implementation which does not result +in a skip or a retry as described in section 8.2.1.4. + See section 8.9.2 for complete details on +transitioning after an unhandled exception.

+
+
+
+
+

8.3. Flow

+
+

A flow defines a sequence of execution elements that execute together as +a unit. When the flow is finished, it is the entire flow that +transitions to the next execution element. A flow may transition to a +step, split, decision, or another flow. A flow may contain step, flow, +decision, and split execution elements. See section 8.5 for more on +decisions. See section 8.4 for more on splits. The execution elements +within a flow may only transition among themselves; they may not +transition to elements outside of the flow. A flow may also contain the +transition elements next, stop, fail, and end. See section 8.6 for more +on transition elements.

+
+
+

Syntax:

+
+
+
+
 <flow id="{name}"next="{flow-id|step-id|split-id|decision-id}">
+  <step> ... </step> ...
+ </flow>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

id

Specifies the logical name of the flow and is used for +identification purposes. It must be a valid XML string value. This is a +required attribute.

next

Specifies the next step, flow, split, or decision to run after +this step is complete. It must be a valid XML string value. This is an +optional attribute. The default is this flow is the last execution +element in the job. Note: next attributes cannot be specified such that +a loop occurs among steps.

+
+
+

8.4. Split

+
+

A split defines a set of flows that execute concurrently. A split may +include only flow elements as children. See section 8.3 for more on +flows. Each flow runs on a separate thread. The split is finished after +all flows complete. When the split is finished, it is the entire split +that transitions to the next execution element. A split may transition +to a step, flow, decision, or another split.

+
+
+

Syntax:

+
+
+
+
 <split id="{name}"next="{flow-id|step-id|split-id|decision-id}">
+  <flow> ... </flow>
+  ...
+ </split>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

id

Specifies the logical name of the split and is used for +identification purposes. It must be a valid XML string value. This is a +required attribute.

next

Specifies the next step, flow, split, or decision to run after +this step is complete. It must be a valid XML string value. This is an +optional attribute. The default is this split is the last execution +element in the job. Note: next attributes cannot be specified such that +a loop occurs among steps.

+
+

8.4.1. Split Termination Processing Incomplete

+
+

The effort of the initial 1.0 final release specification to define +split termination processing is recognized as incomplete. This is +related to the recognition that flow transitioning is incomplete +(section 8.9.5).

+
+
+

As such, there is no well-defined mechanism for "passing back" status +from the individual child flows of a split and aggregating them into a +status at the split level. There is, accordingly, no termination based +on the status of the constituent flows performed after a split +execution.

+
+
+

However, the implementor must be aware that a split may have a child +flow where the flow itself or a flows child (step, decision, etc.) +causes the job execution to terminate. This could be via an end, stop, +or fail transition element, or via an unhandled exception.

+
+
+

In such a case the job should then cease execution before transitioning +past the current, containing split, on to the next execution element.

+
+
+

Typically only one such element (in one single flow) would terminate job +execution, with a corresponding batch and exit status that would then be +set by the implementation as the job-level batch status and exit status, +since typically the whole split would be intended to complete.

+
+
+

The spec does not make an effort, then, to define the outcome if more +than one flow within a split produced a terminating status. A +suggestion, though, is that a FAILED batch status should be given +preference to STOPPED, which should be given preference to COMPLETED +status, and a natural corollary might be to bubble up the associate exit +status as the job-level exit status as well.

+
+
+
+
+

8.5. Decision

+
+

A decision provides a customized way of determining sequencing among +steps, flows, and splits. The decision element may follow a step, flow, +or split. A job may contain any number of decision elements. A decision +element is the target of the "next" attribute from a job-level step, +flow, split, or another decision. A decision must supply a decider batch +artifact (see section 9.6). The decider’s purpose is to decide the next +transition. The decision uses any of the transition elements, stop, +fail, end, and next elements to select the next transition. See section +8.6 for further information on transition elements. The decider return +value will also be set as the current value of the job exit status, in +addition to being matched against the decisions own child transition +elements to decide the next transition.

+
+
+

Syntax:

+
+
+
+
 <decision id="{name}" ref="{ref_-_name}">
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

id

Specifies the logical name of the decision and is used for +identification purposes. It must be a valid XML string value. This is a +required attribute.

ref

Specifies the name of a batch artifact.

+
+

Example:

+
+
+
+
 <decision id="AfterFlow1" ref="MyDecider">
+ ...
+ </decision>
+
+
+
+

8.5.1. Decision Properties

+
+

The 'properties' element may be specified as a child element of the +decision element. It is used to pass property values to a decider. Any +number of properties may be specified.

+
+
+

Syntax:

+
+
+
+
 <properties>
+  <property name="{property-name}" value="{name-value}"/>
+ </properties>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

name

Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute.

value

Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute.

+
+
+

8.5.2. Decision Exception Handling

+
+

Any exception thrown by a batch artifact invoked during decision +handling will end the job with a batch status of FAILED. This exception +is visible to job-level listeners.

+
+
+
+
+

8.6. Transition Elements

+
+

Transition elements may be specified in the containment scope of a step, +flow, or decision (but not a split) to direct job execution sequence or +to terminate job execution. There are fo ur +transition elements:

+
+
+
    +
  1. +

    next - directs execution flow to the next execution element.

    +
  2. +
  3. +

    fail - causes a job to end with FAILED batch status.

    +
  4. +
  5. +

    end - causes a job to end with COMPLETED batch status.

    +
  6. +
  7. +

    stop - causes a job to end with STOPPED batch status.

    +
  8. +
+
+
+

Fail, end, and stop are considered "terminating elements" because they +cause a job execution to terminate.

+
+
+

8.6.1. Next Element

+
+

The next element is used to transition execution to the next execution element. +Multiple next elements may be specified in the current containment +scope. +Syntax:

+
+
+
+
 <next on="{exit status}" to="{step id_|_flow id_|_split id}"/>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

on

Specifies the exit status value that activates this end element. It +must be a valid XML string value. Wildcards of "" and "" may be used. +"" matches zero or more characters. "" matches exactly one character. +It must match an exit status value in order to have effect. This is a +required attribute.

to

Specifies the execution element to which +to transition after this decision. It must be a valid XML string value. +This is a required attribute. Note: the to value cannot specify the next +execution element such that a loop occurs in the batch job.

+
+

Example:

+
+
+
+
<step id="Step1">
+ <next on="*" to="Step2"/>
+</step>
+
+
+
+
+

8.6.2. Fail Element

+
+

The fail element is used to terminate the job at the conclusion of the +current step or flow. The job batch status is +set to FAILED. This does not, however, directly affect the batch status +of the step containing the fail element. + Multiple fail elements may be specified in the +current containment scope. The fail element is supported as a child of +the step, flow, and decision elements.

+
+
+

Syntax:

+
+
+
+
 <fail on="{exit status}" exit-status="{exit status}"/>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

on

Specifies the exit status value that activates this fail element. +It must be a valid XML string value. Wildcards of "" and "" may be +used. "" matches zero or more characters. "" matches exactly one +character. It must match an exit status value in order to have effect. +This is a required attribute.

exit-status

Specifies the new exit status for the job. It + must be a valid XML string value. This is an +optional attribute. If not specified, the job-level exit status is +unchanged. This attribute does not directly change any step exit status +(particularly the step which contains this +fail element).

+
+

Example:

+
+
+
+
<step id="Step1">
+ <fail on="FAILED" exit-status="EARLY COMPLETION"/>
+</step>
+
+
+
+
+

8.6.3. End Element

+
+

The end element is used to terminate the job at the current step. The +job batch status is set to COMPLETED. This does +not, however, directly affect the batch status of the step containing +the end element. Multiple end elements may be +specified in the current containment scope. The end element is supported +as a child of the step, flow, and decision elements.

+
+
+

Syntax:

+
+
+
+
 <end on="{exit status}" exit-status="{exit status}"/>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

on

Specifies the exit status value that activates this end element. It +must be a valid XML string value. Wildcards of "" and "" may be used. +"" matches zero or more characters. "" matches exactly one character. +It must match an exit status value in order to have effect. This is a +required attribute.

exit-status

Specifies the new exit status for the job. It + must be a valid XML string value. This is an +optional attribute. If not specified, the job-level exit status is +unchanged. This attribute does not directly change any step exit status +(particularly the step which contains this end +element).

+
+

Example:

+
+
+
+
 <step id="Step1">
+  <end on="COMPLETED" exit-status="EARLY COMPLETION">
+ </step>
+
+
+
+
+

8.6.4. Stop Element

+
+

The stop element is used to terminate the job after the current step or +flow. If the stop element matches the exit status, the job-level batch +status is then set to STOPPED. This does not, however, directly affect +the batch status of the step containing the + . +Multiple stop elements may be specified in the current containment +scope. The stop element is supported as a child of step, flow, and +decision elements.

+
+
+
+
<stop on="{exit status}" exit-status="{exit status}" restart="{step id_|_flow id_|_split id}"/>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + + + + + +

on

Specifies the exit status value that activates this end element. It +must be a valid XML string value. Wildcards of "" and "" may be used. +"" matches zero or more characters. "" matches exactly one character. +It must match an exit status value in order to have effect. This is a +required attribute.

exit-status

Specifies the exit status for the job. It + must be a valid XML string value. This is an +optional attribute. If not specified, the job-level exit status is +unchanged. This attribute does not directly change any step exit status +(particularly the step which contains this +stop element).

restart

Specifies the job-level step, flow, or split at which to +restart when the job is restarted. It must be a valid XML string value. +This is an optional attribute.

+
+

Example:

+
+
+
+
 <step id="Step1">
+  <stop on="COMPLETED" restart="step2"/>
+ </step>
+
+
+
+
+
+

8.7. Batch and Exit Status

+
+

Batch execution reflects a sequence of state changes, culminating in an +end state after a job has terminated. These state changes apply to the +entire job as a whole, as well as to each step within the job. These +state changes are exposed through the programming model as status +values. There is both a runtime status value, called "batch status", as +well as a user-defined value, called "exit status".

+
+
+

A job and each step in a job end with a batch status and exit status +value. Batch status is set by the batch runtime; exit status may be set +through the Job XML or by the batch application. The exit status for a +job and a step will be initially set to null. +At the time that the job or step completes execution, if the exit status +is equal to null, it will then be set by the runtime implementation + to the string value of the batch status, which +will be its final value. The batch and exit status values are available +in the JobContext and StepContext runtime objects, and the exit status +can be set explicitly via any batch artifact. The overall batch and exit +status for the job are available through the JobOperator interface. +Batch and exit status values are strings. The following batch status +values are defined:

+
+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Value

Meaning

STARTING

Batch job has been passed to the batch runtime for execution through the JobOperator interface start or restart operation. A step has a status of STARTING before it actually begins execution.

STARTED

Batch job has begun execution by the batch runtime. A step has a status of STARTED once it has begun execution.

STOPPING

Batch job has been requested to stop through the JobOperator interface +stop operation or by a <stop> element in the Job XML. A step has a +status of STOPPING as soon as JobOperator.stop receives control.

STOPPED

Batch job has been stopped through the JobOperator interface stop +operation or by a <stop> element in the Job XML. A step has a status of +STOPPED once it has actually been stopped by the batch runtime.

FAILED

Batch job has ended due to an unresolved exception or by a <fail> +element in the Job XML. A step has a status of FAILED under the same +conditions.

COMPLETED

Batch job has ended normally or by an <end> element in the Job XML. A +step has a status of COMPLETED under the same conditions.

ABANDONED

Batch job has been marked abandoned through the JobOperator interface +abandon operation. An abandoned job is still visible through the +JobOperator interface, but is not running, nor can it be restarted. It +exists only as a matter of history.

+
+

A job execution will end under the following conditions:

+
+
+
    +
  1. +

    A job-level execution element (step, flow, or split) finishes +execution, without specifying a "next" attribute and without the exit +status matching any transition elements. (See section 8.9.2 for +details). In this case, the batch status is set +to COMPLETED.

    +
  2. +
  3. +

    A step throws an exception to the batch runtime that does not match +skip or retry criteria, with the exit status not matching any transition +elements. In this case, the batch status is set to FAILED. (See section +8.9.2 for details). In the case of partitioned +or concurrent (split) step execution, all other still-running parallel +instances are allowed to complete before the job ends with FAILED batch +status.

    +
  4. +
  5. +

    A step, flow, or decision terminates execution with a stop, end, or +fail element. In this case, the batch status is STOPPED, COMPLETED, or +FAILED, respectively .

    +
  6. +
+
+
+

The batch and exit status of the job is set as follows:

+
+
+
    +
  1. +

    Batch status is initially set to STARTING by the batch runtime. +Immediately before starting the first step, the batch runtime sets the +batch status to STARTED .

    +
  2. +
  3. +

    Exit status can be overridden by any artifact by invoking the exit +status setter method on the JobContext object.

    +
  4. +
  5. +

    Exit status can be overridden by a decision element.

    +
  6. +
  7. +

    Exit status can be overridden by a terminating transition element on +a step, flow, or split. See section 8.6.

    +
  8. +
  9. +

    Final batch status is set by the batch runtime depending on the +outcome of the job. See table above. Exit status is set to the final +batch status if it was not overridden by any of the override means +described earlier in this list. Note the last override to set exit +status during the course of job execution takes precedence over all +others.

    +
  10. +
+
+
+

In addition to these conditions and events +which are well-defined by this specification, it is also recognized that +the runtime may be forced to make another transition of job and step +batch status.

+
+
+

For example, a JVM hang may cause a job to appear in STARTED state even +though it is no longer running. The specification forbids running +multiple executions of a given job instance at the same time. In order +to recover and allow restart it is expect that a batch runtime +implementation might provide a mechanism to automatically or through +user intervention mark the appropriate job and step execution(s) as +FAILED (i.e. set the batch status as FAILED).

+
+
+

The details are left entirely to the implementation, we are just +recognizing here that this is a valid state transition.

+
+
+

8.7.1. Batch and Exit Status for Steps

+
+

Step batch status is set initially, and then again at the conclusion of +the step, by the batch runtime. Step exit status is +initially set to the same value as batch +status. Step exit status may be set by any +batch artifact configured to the step by invoking the exit status setter +method in the StepContext object. See section 9.4 for further +information about the StepContext object. Setting the step exit status +does not alter the execution of the current step, but rather, is +available to influence the execution of subsequent steps via transition +elements (see 8.6) and deciders (see 9.6). If no batch artifact sets the +exit status, the batch runtime will default the value to the string form +of the batch status value of the step when step execution completes. +An important point to note is that transition elements do not affect the +batch and exit status of their containing step (for a step with one or +more child transition elements), but only potentially affect the batch +and exit status of the job.

+
+
+

Example:

+
+
+
+
<step id="FS1">
+ <batchlet >
+  <next on="RC0" />
+  <fail on="RC4" exit-status="BAD"/>
+  <fail on="RC8" />
+</step>
+
+
+
+

Suppose for the above example JSL snippet, FS1s batchlet executes +normally with an exit status of "RC4". Then step FS1s batch status will +end up as COMPLETED, and FS1s exit status will end up as "RC4". The jobs +batch status will end up as FAILED and the jobs exit status will end up +as "BAD". Likewise, if the batchlet completes with an exit status of +"RC8" the steps batch and exit status will be COMPLETED and "RC8", +respectively, while the jobs batch and exit status will be FAILED and +"FAILED" (assuming the job exit status hasnt been set and defaults in +this case).

+
+
+

Note the implications for restart processing. For example, a completed +step wont re-run just because the step includes a transition element +failing the job on the original step executions exit status. See section +10.8 for more on restart processing.

+
+
+
+

8.7.2. Exit Status for Partitioned Steps

+
+

The exit status for a partitioned step follows the same rules as for a +regular step except for an exit status set by batch artifacts processing +individual partitions . This means any batch +artifact running on the main thread of the partitioned step can set the +steps exit status via the exit status setter method on the StepContext +object , the same as for a non-partitioned step.E.g. a steps partition +analyzer, partition reducer, or step listener could each potentially set +the steps exit status in this simple manner (since each of these +artifacts run on the initial thread, not the threads processing an +individual partition). If the exit status is not set it defaults to +batch status at the end of step execution , the +same as for a non-partitioned step.

+
+
+

For a partitioned batchlet, each thread processing a partition may +return a separate exit status. However, these exit status values are +ignored unless a partition analyzer is used to coalesce these separate +exit status values into a final exit status value for the step.

+
+
+

The batch runtime maintains a StepContext clone per partition. For a +partitioned batchlet or chunk, any batch artifact running on any of the +threads processing a partition would merely set a separate exit status +through the StepContext clone. These exit status values are ignored +unless a partition analyzer is used to coalesce these separate exit +status values into a final exit status value for the step.

+
+
+
+
+

8.8. Job XML Substitution

+
+

Job XML supports substitution as part of any attribute value. The +following expression language is supported on all attributes:

+
+
+
+
<attribute-value> ::= ' " ' <principle-value-expression>[<default-expression>] ' " '
+
+<principle-value-expression> ::= <value-expression>
+
+<value-expression> ::= "#\{"<operator-expression>"}" | <string-literal>[ <value-expression> ]
+
+<default-expression> ::= ":" <value-expression> ";"
+
+<operator-expression> ::= <operator1> | <operator2> | <operator3> |<operator4> | <operator5>
+
+<operator1> ::= "jobParameters" "[" <target-name> "]"
+
+<operator2> ::= "jobProperties" "[" <target-name> "]"
+
+<operator3> ::= "systemProperties" "[" <target-name> "]"
+
+<operator4> ::= "partitionPlan" "[" <target-name> "]"
+
+<target-name> ::= " ' " <string-literal> " ' "
+
+<string-literal> is a valid XML string value.
+
+
+
+

8.8.1. Substitution Processing Rules

+
+

Substitution expressions are processed for both initial job start and on +job restart. All substitution expressions must be resolved before the +job can be started or restarted, except for the partitionPlan operator, +which has deferred resolution - see section 8.8.1.4 for more on that. +After substitution expression resolution, the resultant XML document +must be checked for validity, according to the guidelines outlined in +section 13, Job Specification Language XSD.

+
+
+

A substitution expression may reference a job parameter or a job +property by specifying the name of the parameter or property through a +substitution expression operator. This name is referred to generally in +substitution expression syntax as a "target name". There are four +substitution operators:

+
+
+
    +
  1. +

    jobParameters - specifies to use a named parameter from the job +parameters.

    +
  2. +
  3. +

    jobProperties - specifies to use a named property from among the +job’s properties.

    +
  4. +
  5. +

    systemProperties - specifies to use a named property from the system +properties.

    +
  6. +
  7. +

    partitionPlan - specifies to use a named property from the partition +plan of a partitioned step.

    +
  8. +
+
+
+
8.8.1.1. jobParameters Substitution Operator
+
+

The jobParameters substitution operator resolves to the value of the +job parameter with the specified target name.

+
+
+
+
8.8.1.2. jobProperties Substitution Operator
+
+

The jobProperties substitution operator resolves to the value of the +job property with the specified target name. This property is found by +recursively searching from the innermost containment scope (this +includes earlier properties within the current scope) to the outermost +scope until a property with the specified target name is found.

+
+
+

E.g. The batch runtime would attempt resolution of the jobProperties +operator specification in each of the two following reader property +definitions by first searching for earlier property definitions within +the reader properties collection, then the step properties collection +(there are none in this example), then the job properties collection (if +any). The search stops at the first occurrence of the specified target +name.

+
+
+
+
 <job id="job1">
+  <properties>
+   <property name="filestem" value="postings"/>
+   <property name="outputlog" value="jobmessages"/>
+ </properties>
+ <step id="step1">
+  <chunk>
+    <reader ref="MyReader">
+     <properties>
+      <property name="infile.name" value="#\{jobProperties['filestem']}.txt"/>
+      <property name="outputlog" value="readermessages"/>
+      <property name="outfile.name" value="#\{jobProperties['outputlog']}.txt"/>
+     </properties>
+    </reader>
+  </chunk>
+ </step>
+</job>
+
+
+
+

The resolved value for reader property "infile.name" would be +"postings.txt".

+
+
+

The resolved value for reader property "outfile.name" would be +"readermessages.txt".

+
+
+
+
8.8.1.3. systemProperties Substitution Operator
+
+

The systemProperties substitution operator resolves to the value of the +system property with the specified target name.

+
+
+
+
8.8.1.4. partitionPlan Substitution Operator
+
+

The partitionPlan substitution operator resolves to the value of the +partition plan property with the specified target name from the +PartitionPlan returned by the PartitionMapper. Partition plan properties +are in scope only for the step to which the partition plan is defined. +The partitionPlan operator is resolved separately for each partition +before the partition execution begins.

+
+
+

E.g. Given job, job1:

+
+
+
+
<job id="job1">
+ <step id="step1">
+  <chunk>
+   <reader  ref="MyReader>
+    <properties>
+     <property name="infile.name" value="file#\{partitionPlan['myPartitionNumber']}.txt"/>
+     <property name="outfile.name" value="#\{partitionPlan['outFile']}"/>
+    </properties>
+   </reader>
+   <writer ref="MyWriter"/>
+  </chunk>
+  <partition>
+   <mapper ref="MyMapper "/>
+  </partition>
+ </step>
+</job>
+
+
+
+

And MyMapper implementation:

+
+
+
+
public class MyMapper implements PartitionMapper \{
+  public PartitionPlan mapPartitions() \{
+    PartitionPlanImpl pp= new PartitionPlanImpl();
+    pp.setPartitions(2);
+
+    Properties p0= new Properties();
+    p0.setProperty("myPartitionNumber", "0");
+    p0.setProperty("outFile", "outFileA.txt");
+
+    Properties p1= new Properties();
+    p1.setProperty("myPartitionNumber", "1");
+    p1.setProperty("outFile", "outFileB.txt");
+
+    Properties[] partitionProperties= new Properties[2];
+    partitionProperties[0]= p0;
+    partitionProperties[1]= p1;
+    pp.setPartitionProperties(partitionProperties);
+
+    return pp;
+  }
+}
+
+
+
+

The step1 chunk would run as two partitions, with the itemReader +property "infile.name" resolved to "file0.txt" and "file1.txt" for +partitions 0 and 1, respectively. Also, itemReader property +"outfile.name" would resolve to "outFileA.txt", and "outFileB.txt" for +partitions 0 and 1, respectively.

+
+
+
+
8.8.1.5. Substitution Expression Default
+
+

Substitutions expressions may include a default value using the ":" +operator. The default is applied if the substitution’s principle value +expression resolves to the empty string "".

+
+
+
+
8.8.1.6. Property Resolution Rule
+
+

Properties specified by a substitution operator must be defined before +they can be used in a substitution expression.

+
+
+

Examples:

+
+
+

Resolvable Property Reference

+
+
+

The batch runtime will resolve a substitution reference to a property +that occurs before it is referenced. In the following example, property +"infile.name" is defined before it is used to form the value of property +"tmpfile.name". This is a resolvable reference.E.g.

+
+
+
+
 <property name="infile.name" value="in.txt" />
+ <property name="tmpfile.name" value="#\{jobProperties['infile.name']}.tmp" />
+
+
+
+

The batch runtime resolves a resolvable reference with the resolved +value of the specified property reference.

+
+
+

Unresolvable Property Reference

+
+
+

The batch runtime will not resolve a substitution reference to a +property whose first occurrence is after it is referenced. In the +following example, property "infile.name" is defined after it is used to +form the value of property "tmpfile.name". This is a unresolvable +reference.E.g.

+
+
+
+
 <property name="tmpfile.name" value="in.txt#\{jobProperties[infile.name]}" />
+ <property name="infile.name" value="in.txt" />
+
+
+
+

The batch runtime resolves an unresolvable reference in XML to the +empty string "".

+
+
+
+
8.8.1.7. Undefined Target Name Rule
+
+

A substitution expression operator that specifies an undefined target +name is assigned the empty string in XML.

+
+
+
+
8.8.1.8. Job Restart Rule
+
+

Job Parameters may be specified on job restart. Substitution expression +resolution occurs on each restart. This makes it possible for new values +to be used in Job XML attributes during job restart. While all +substitution expressions resolve the same way on restart as on initial +start, there is a special rule for the number of partitions in a +partitioned step:

+
+
+

The number of partitions in a partition plan

+
+
+

The batch runtime determines the number of partitions in a partitioned +step the first time the step is attempted. The batch runtime remembers +that decision and applies it to that step on the next job execution, +once the previous job execution is restarted. The decision cannot be +altered by a substitution expression. The decision can be altered, +however, through a PartitionMapper artifact by specifying the "override" +option in the PartitionPlan object. See section 10.9.4 for details on +the PartitionPlan class.

+
+
+
+
+

8.8.2. Examples

+
+
+
       <property name="infile.name" value="in.txt" />
+
+
+
+

Resolved property: infile.name="in.txt"

+
+
+
+
       <property name="infile.name" value="#\{jobParameters['infile.name']}" />
+
+
+
+

Resolved property: infile.name= value of infile.name job parameter

+
+
+
+
       <property name="infile.name" value="#\{systemProperties['infile.name']}" />
+
+
+
+

Resolved property: infile.name= value of infile.name system property

+
+
+
+
       <property name="infile.name" value="#\{jobProperties['infile.name']}" />
+
+
+
+

Resolved property: infile.name= value of infile.name job property

+
+
+
+
       <property name="infile.name" value="#\{partitionPlan['infile.name']}" />
+
+
+
+

Resolved property: infile.name= value of infile.name from partition +plan for the current partition

+
+
+
+
       <property name="infile.name" value="#\{jobParameters['infile.name']}:in.txt;" />
+
+
+
+

Resolved property: infile.name = value of infile.name job parameter or +"in.txt" if infile.name job parameter is unspecified.

+
+
+
+
+

8.9. Transitioning Rules

+
+

8.9.1. Combining Transition Elements

+
+

Any combination of transition elements can be included at the end of a +step, flow, or decision definition. Combinations can include zero, one, +or more than one instance of a single type of execution element,E.g. +next.

+
+
+

Transition elements are evaluated in sequential order as they occur +within the JSL document. I.e. the appropriate exit status is compared +with the on attribute value of the first transition element in the +sequence and, if it matches, then the corresponding transition is +perfomed, and the rest of the transition elements are ignored. If not, +the second transition element is evaluated, etc.

+
+
+

Example:

+
+
+
+
<step id="Step1">
+ <next on="RC0" to="Step2"/>
+ <next on="RC4" to="Step3"/>
+ <end on="RC4" exit-status="DONE"/>
+ <fail on="*"/> <!-- Matches anything, so only makes sense as last transition element-->
+</step>
+
+
+
+
+

8.9.2. Transitioning Precedence Rules

+
+

The transition elements are always "evaluated" first, and if a match is +found, execution transitions accordingly (either to another execution +element or the job is stopped or failed).

+
+
+

If a match is not found among the transition elements (which would +always be the case if there are no transition elements), then transition +proceeds as follows:

+
+
+
    +
  1. +

    If execution resulted in an unhandled exception, then the job ends +with batch status of FAILED.

    +
  2. +
  3. +

    If execution ended normally, and the execution element whose +execution is completing contains a next attribute, then execution +transitions to the element named by this next attribute value.

    +
  4. +
  5. +

    If execution ended normally, and the execution element whose +execution is completing does not contain a next attribute, then the job +ends normally (with COMPLETED batch status). For transitioning from a +step within a flow, this statement doesnt apply. See section 8.9.4 for +details.

    +
  6. +
+
+
+

The following examples illustrate how the above rules might be employed:

+
+
+

Example 1: Transition to Step2, unless exit status of RC_ABORT seen, in +which case fail the job

+
+
+
+
<step id="Step1" next="Step2">
+ <fail on="RC_ABORT" exit-status="ABORTED"/>
+</step>
+
+
+
+

Example 2: Transition to Step2, but if exception thrown, transition to +RecoveryStep.

+
+
+
+
<step id="Step1" next="Step2">
+<!-- Assumes step exit status defaults to step batch status (FAILED)-->
+ <next on="FAILED" to="RecoveryStep"/>
+ <fail on="*"/>
+</step>
+
+
+
+

Note that the second example shows it is possible for a job to executed +to COMPLETED status, even though a constituent step ends with FAILED +batch status (See section 8.2.7).

+
+
+
+

8.9.3. Loop definition

+
+

The specification prohibits next and to attribute values that result in +a "loop". More precisely, this means that no execution element can be +transitioned to twice within a single job execution.

+
+
+

This wording is purposely written this way rather than merely saying no +execution element can be executed twice within a single job execution. +Say "step1" executed to completion during an initial execution which +ultimately failed, and upon restart we transitioned past "step1" without +executing it since it had already completed, but we subsequently +transitioned (back) to "step1". This may only be a single execution of +"step1" during a single job execution, but it still violates the looping +prohibition.

+
+
+

The runtime may detect potential loops in an initial validation phase, +as described in section 13.1, or may only detect loops once they occur.

+
+
+
+

8.9.4. Transitioning From Within Flows

+
+
    +
  1. +

    As mentioned in section 8.3, an execution element which is a child of a +flow may only transition to another execution element within the same +flow. The flows transition elements, however, would transition execution +to the next execution element at the level of the execution scope +containing the flow ,E.g. the job.

    +
  2. +
  3. +

    For terminating transitions (stop, end, fail) as well as failures caused +by unhandled exceptions, it is the entire job execution which is +terminated. It is not just the case that the flow alone is somehow +failed or ended yet with another level of transitioning occurring at the +containing (e.g. job) level.

    +
    +
      +
    1. +

      Note: transition via next outside of the flow is not permitted. If +this is not detected during job validation (see section 13.1), then at +runtime the job execution will end at this point with batch status of +FAILED.

      +
    2. +
    +
    +
  4. +
  5. +

    When a child of a flow completes normally, and when there are no +matching transition elements as well as no next attribute at the level +of this child of a flow, then the flow ends.

    +
  6. +
+
+
+

Another way of stating rules #2 and #3 in this section would be to say +that all the rules in section 8.9.2 apply to transitions within flows +(i.e. among children of flows) and are effective at the job level, +except for rule #3 in section 8.9.2 (this case does not necessarily end +the job).

+
+
+

See the example at the end of section 8.9.5 for further clarification.

+
+
+
+

8.9.5. Flow-level Transitions Undefined

+
+

It is recognized that the specification is incomplete with respect to +how exactly flow transition elements are evaluated. Though the list in +section 10.8.4 has an assertion in rule 3.e. that suggests using the +exit status of the last contained execution element as a flow-level exit +status, this does not seem to be a complete definition. For example, +what if the last execution element within the flow is a split

+
+
+

This might be rectified in a later revision of this specification. In +the meantime it is suggested to avoid using flow-level transition +elements in light of this ambiguity.

+
+
+

On the other hand, a transition from a flow via the next attribute of +the flow element is well-defined at the current spec level, and is +suggested.

+
+
+

Example:

+
+
+
+
<flow id="Flow1" next="StepX">
+ <step id="FS1">
+ <next on="RC1" to="FS2A"/>
+ <next on="RC2" to="FS2B"/>
+ <!-- ILLEGAL - would be illegal, since one can only transition within the flow
+ <next on="RC3" to="StepX"/>
+ -->
+ </step>
+ <step id="FS2A" >
+  <fail on="FAILED"/> <!-- FAILS job, doesn't "fail flow"-->
+ </step>
+ <step id="FS2B" >
+  <fail on="FAILED"/> <!-- FAILS job, doesn't "fail flow"-->
+ </step>
+ <next on="F*" to="StepY"/> <!-- UNDEFINED -->
+</flow>
+<step id="StepX">
+
+
+
+

As noted in the comments inline, this example makes the following +points:

+
+
+
    +
  • +

    that a child of a flow can only transition to another child of +the same flow (Item 1. in section 8.9.4)

    +
  • +
  • +

    that a terminating transition terminates the job, not just the +flow somehow (Item 2. in section 8.9.4)

    +
  • +
  • +

    that a transition element which is a direct child of the flow +itself is currently UNDEFINED (section 8.9.5)

    +
  • +
+
+
+
+
+
+
+

9. Batch Programming Model

+
+
+

The batch programming model is described by interfaces, abstract +classes, and field annotations. Interfaces define the essential contract +between batch applications and the batch runtime. Most interfaces have a +corresponding abstract class that provides default implementations of +certain methods for developer convenience.

+
+
+

9.1. Steps

+
+

A batch step is either chunk or batchlet.

+
+
+

9.1.1. Chunk

+
+

A chunk type step performs item-oriented processing using a +reader-processor-writer batch pattern and does checkpointing.

+
+
+
9.1.1.1. ItemReader Interface
+
+

An ItemReader is used to read items for a chunk step. ItemReader is one +of the three batch artifact types that comprise a chunk type step. The +other two are ItemProcessor and ItemWriter.

+
+
+

The ItemReader interface may be used to implement an ItemReader batch +artifact:

+
+
+
ItemReader.java
+
+
package javax.batch.api.chunk;
+
+import java.io.Serializable;
+
+/*
+ * ItemReader defines the batch artifact that reads
+ * items for chunk processing.
+ */
+public interface ItemReader {
+  /**
+   * The open method prepares the reader to read items
+   * The input parameter represents the last checkpoint
+   * for this reader in a given job instance. The
+   * checkpoint data is defined by this reader and is
+   * provided by the checkpointInfo method. The checkpoint
+   * data provides the reader whatever information it needs
+   * to resume reading items upon restart. A checkpoint value
+   * of null is passed upon initial start.
+   *
+   * @param checkpoint specifies the last checkpoint
+   * @throws Exception is thrown for any errors.
+   */
+  public void open(Serializable checkpoint) throws Exception;
+
+  /**
+   * The close method marks the end of use of the
+   * ItemReader. The reader is free to do any cleanup
+   * necessary.
+   * @throws Exception is thrown for any errors.
+   */
+  public void close() throws Exception;
+
+  /**
+   * The readItem method returns the next item
+   * for chunk processing.
+   * It returns null to in dicate no more items, which
+   * also means the current chunk will be committed and
+   * the step will end.
+   * *@return* next item or null
+   * @throws Exception is thrown for any errors.
+   */
+  public Object readItem() throws Exception;
+
+  /**
+   * The checkpointInfo method returns the current
+   * checkpoint data for this reader. It is
+   * called before a chunk checkpoint is committed.
+   * *@return* checkpoint data
+   * @throws Exception is thrown for any errors.
+   */
+  public Serializable checkpointInfo() throws Exception;
+}
+
+
+
+
AbstractItemReader.java
+
+
package javax.batch.api.chunk;
+import java.io.Serializable;
+public abstract class AbstractItemReader implements ItemReader
+{
+    @Override
+    public void open(Serializable checkpoint)throws Exception {
+    }
+
+    @Override
+    public void close()throws Exception {
+    }
+
+    @Override
+    public abstract Object readItem() throws Exception;
+
+    @Override
+    public Serializable checkpointInfo() throws Exception {
+        return null;
+    }
+}
+
+
+
+
+
9.1.1.2. ItemProcessor Interface
+
+

An ItemProcessor is used to process items for a chunk step. +ItemProcessor is one of the three batch artifact types that comprise a +chunk type step. An ItemProcessor is an optional artifact on a chunk +type step. The other two are ItemReader and ItemWriter.

+
+
+

The ItemProcessor interface may be used to implement an ItemProcessor +batch artifact:

+
+
+
ItemProcessor.java
+
+
package javax.batch.api.chunk;
+/**
+* ItemProcessor is used in chunk processing
+* to operate on an input item and produce
+* an output item.
+*
+*/
+public interface ItemProcessor {
+    /**
+    * The processItem method is part of a chunk
+    * step. It accepts an input item from an
+    * item reader and returns an item that gets
+    * passed onto the item writer. Returning null
+    * indicates that the item should not be continued
+    * to be processed. This effectively enables processItem
+    * to filter out unwanted input items.
+    * @param item specifies the input item to process.
+    * *@return* output item to write.
+    * @throws Exception thrown for any errors.
+    */
+    public Object processItem(Object item) throws Exception;
+}
+
+
+
+
+
9.1.1.3. ItemWriter Interface
+
+

An ItemWriter is used to write a list of output items for a chunk step. +ItemWriter is one of the three batch artifact types that comprise a +chunk type step. The other two are ItemProcessor and ItemReader.

+
+
+

The ItemWriter interface may be used to implement an ItemWriter batch +artifact:

+
+
+
ItemWriter.java
+
+
package javax.batch.api.chunk;
+import java.io.Serializable;
+import java.util.List;
+/**
+*
+* ItemWriter defines the batch artifact that writes to a
+* list of items for chunk processing.
+*
+*/
+public interface ItemWriter {
+    /**
+    * The open method prepares the writer to write items.
+    *
+    * The input parameter represents the last checkpoint
+    * for this writer in a given job instance. The
+    * checkpoint data is defined by this writer and is
+    * provided by the checkpointInfo method. The checkpoint
+    * data provides the writer whatever information it needs
+    * to resume writing items upon restart. A checkpoint value
+    * of null is passed upon initial start.
+    *
+    * @param checkpoint specifies the last checkpoint
+    * @throws Exception is thrown for any errors.
+    */
+    public void open(Serializable checkpoint) throws Exception;
+    /**
+    * The close method marks the end of use of the
+    * ItemWriter. The writer is free to do any cleanup
+    * necessary.
+    * @throws Exception is thrown for any errors.
+    */
+    public void close() throws Exception;
+    /**
+    * The writeItems method writes a list of item
+    * for the current chunk.
+    * @param items specifies the list of items to write.
+    * This may be an empty list (e.g. if all the
+    * items have been filtered out by the
+    * ItemProcessor).
+    * @throws Exception is thrown for any
+    errors.
+    */
+    public void writeItems(List<Object> items) throws Exception;
+    /**
+    * The checkpointInfo method returns the current
+    * checkpoint data for this writer. It is
+    * called before a chunk checkpoint is committed.
+    * *@return* checkpoint data
+    * @throws Exception is thrown for any errors.
+    */
+    public Serializable checkpointInfo() throws Exception;
+}
+
+
+
+
AbstractItemWriter.java
+
+
package javax.batch.api.chunk;
+import java.io.Serializable;
+import java.util.List;
+/**
+* The AbstractItemWriter provides default implementations
+* of not commonly implemented methods.
+*/
+public abstract class AbstractItemWriter implements ItemWriter
+{
+    /**
+    * Override this method if the ItemWriter requires
+    * any open time processing.
+    * The default implementation does nothing.
+    *
+    * @param last checkpoint for this ItemReader
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void open(Serializable checkpoint) throws Exception {
+    }
+    /**
+    * Override this method if the ItemWriter requires
+    * any close time processing.
+    * The default implementation does nothing.
+    *
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void close() throws Exception {
+    }
+    /**
+    * Implement write logic for the ItemWriter in this
+    * method.
+    *
+    * @param items specifies the list of items to write.
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public abstract void writeItems(List<Object> items) throws
+    Exception;
+    /**
+    * Override this method if the ItemWriter supports
+    * checkpoints.
+    * The default implementation returns null.
+    *
+    * *@return* checkpoint data
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public Serializable checkpointInfo() throws Exception {
+        return null;
+    }
+}
+
+
+
+
+
9.1.1.4. CheckpointAlgorithm Interface
+
+

A CheckpointAlgorithm implements a custom checkpoint policy for a chunk +step. The CheckpointAlgorithm interface may be used to implement an +CheckpointAlgorithm batch artifact:

+
+
+
CheckpointAlgorithm.java
+
+
package javax.batch.api.chunk;
+/**
+* CheckpointAlgorithm provides a custom checkpoint
+* policy for chunk steps.
+*
+*/
+public interface CheckpointAlgorithm {
+    /**
+    * The checkpointTimeout is invoked at the beginning of a new
+    * checkpoint interval for the purpose of establishing the checkpoint
+    * timeout.
+    * It is invoked before the next chunk transaction begins. This
+    * method returns an integer value, which is the timeout value
+    * (expressed in seconds) which will be used for the next chunk
+    * transaction.
+    * This method is useful to automate the setting of the
+    * checkpoint timeout based on factors known outside the job
+    * definition.
+    * A value of '0' signifies no maximum established by this
+    * CheckpointAlgorithm, i.e. the maximum permissible timeout allowed by
+    * the runtime environment.
+    * @return the timeout interval (expressed in seconds)
+    * to use for the next checkpoint interval
+    * @throws Exception thrown for any errors.
+    */
+    public int checkpointTimeout() throws Exception;
+    /**
+    * The beginCheckpoint method is invoked before the
+    * next checkpoint interval begins (before the next
+    * chunk transaction begins).
+    * @throws Exception thrown for any errors.
+    */
+    public void beginCheckpoint() throws Exception;
+    /**
+    * The isReadyToCheckpoint method is invoked by
+    * the batch runtime after each item is processed
+    * to determine if now is the time to checkpoint
+    * the current chunk.
+    * *@return* boolean indicating whether or not
+    * to checkpoint now.
+    * @throws Exception thrown for any errors.
+    */
+    public boolean isReadyToCheckpoint() throws Exception;
+    /**
+    * The endCheckpoint method is invoked after the
+    * last checkpoint is taken (after the chunk
+    * transaction is committed).
+    * @throws Exception thrown for any errors.
+    */
+    public void endCheckpoint() throws Exception;
+}
+
+
+
+
AbstractCheckpointAlgorithm.java
+
+
package javax.batch.api.chunk;
+/**
+* The AbstractCheckpointAlgorithm provides default
+* implementations of less commonly implemented
+* methods.
+*/
+public abstract class AbstractCheckpointAlgorithm implements
+CheckpointAlgorithm {
+    /**
+    * Override this method if the CheckpointAlgorithm
+    * establishes a checkpoint timeout.
+    * The default implementation returns 0, which means
+    * the maximum permissible timeout allowed by the
+    * runtime environment.
+    *
+    * @return the timeout interval (expressed in seconds)
+    * to use for the next checkpoint interval
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public int checkpointTimeout() throws Exception {
+        return 0;
+    }
+    /**
+    * Override this method for the CheckpointAlgorithm
+    * to do something before a checkpoint interval
+    * begins (before the next chunk transaction begins).
+    * The default implementation does nothing.
+    *
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void beginCheckpoint() throws Exception {
+    }
+    /**
+    * Implement logic in this method
+    * to decide if a checkpoint should be taken now.
+    *
+    * *@return* boolean indicating whether or not
+    * to checkpoint now.
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public abstract boolean isReadyToCheckpoint() throws Exception;
+    /**
+    * Override this method for the CheckpointAlgorithm
+    * to do something after a checkpoint is taken (after
+    * the chunk transaction is committed).
+    * The default implementation does nothing.
+    *
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void endCheckpoint() throws Exception {
+    }
+}
+
+
+
+
+
+

9.1.2. Batchlet Interface

+
+

A Batchlet-type step implements a roll your own batch pattern. This +batch pattern is invoked once, runs to completion, and returns an exit +status.

+
+
+

The Batchlet interface may be used to implement a Batchlet batch +artifact:

+
+
+
Batchlet.java
+
+
package javax.batch.api;
+/**
+*
+* A batchlet is type of batch step
+* that can be used for any type of
+* background processing that does not
+* explicitly call for a chunk oriented
+* approach.
+* <p>
+* A well-behaved batchlet responds
+* to stop requests by implementing
+* the stop method.
+*
+*/
+public interface Batchlet {
+    /**
+    * The process method does the work
+    * of the batchlet. If this method
+    * throws an exception, the batchlet
+    * step ends with a batch status of
+    * FAILED.
+    * *@return* exit status string
+    * @throws Exception if an error occurs.
+    */
+    public String process() throws Exception;
+    /**
+    * The stop method is invoked by the batch
+    * runtime as part of JobOperator.stop()
+    * method processing. This method is invoked
+    * on a thread other than the thread on which
+    * the batchlet process method is running.
+    *
+    * @throws Exception if an error occurs.
+    */
+    public void stop() throws Exception;
+}
+
+
+
+
AbstractBatchlet.java
+
+
package javax.batch.api;
+/**
+* The AbstractBatchlet provides default
+* implementations of less commonly implemented methods.
+*/
+public abstract class AbstractBatchlet implements Batchlet {
+    /**
+    * Implement process logic for the Batchlet in this
+    * method.
+    *
+    * *@return* exit status string
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public abstract String process() throws Exception;
+    /**
+    * Override this method if the Batchlet will
+    * end in response to the JobOperator.stop()
+    * operation.
+    * The default implementation does nothing.
+    *
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void stop() throws Exception {
+    }
+}
+
+
+
+ + + + + +
+
Tip
+
+A well designed batchlet stops gracefully when the JobOperator.stop operation is invoked. +See section 11.13 for further information about stop processing. +
+
+
+
+
+

9.2. Listeners

+
+

Use Listeners to interpose on batch execution.

+
+
+

9.2.1. JobListener Interface

+
+

A job listener receives control before and after a job execution runs, +and also if an exception is thrown during job processing. The +JobListener interface may be used to implement an JobListener batch +artifact:

+
+
+
JobListener.java
+
+
package javax.batch.api.listener;
+/**
+* JobListener intercepts job execution.
+*
+*/
+public interface JobListener {
+    /**
+    * The beforeJob method receives control
+    * before the job execution begins.
+    * @throws Exception throw if an error occurs.
+    */
+    public void beforeJob() throws Exception;
+    /**
+    * The afterJob method receives control
+    * after the job execution ends.
+    * @throws Exception throw if an error occurs.
+    */
+    public void afterJob() throws Exception;
+}
+
+
+
+
AbstractJobListener.java
+
+
package javax.batch.api.listener;
+/**
+* The AbstractJobListener provides default
+* implementations of less commonly implemented methods.
+*/
+public abstract class AbstractJobListener implements JobListener
+{
+    /**
+    * Override this method if the JobListener
+    * will do something before the job begins.
+    * The default implementation does nothing.
+    *
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void beforeJob() throws Exception {
+    }
+    /**
+    * Override this method if the JobListener
+    * will do something after the job ends.
+    * The default implementation does nothing.
+    *
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void afterJob() throws Exception {
+    }
+}
+
+
+
+
+

9.2.2. StepListener Interface

+
+

A step listener can receive control before and after a step runs, and +also if an exception is thrown during step processing. The StepListener +interface may be used to implement an StepListener batch artifact:

+
+
+
StepListener.java
+
+
package javax.batch.api.listener;
+/**
+* StepListener intercepts step execution.
+*
+*/
+public interface StepListener {
+    /**
+    * The beforeStep method receives control
+    * before a step execution begins.
+    * @throws Exception throw if an error occurs.
+    */
+    public void beforeStep() throws Exception;
+    /**
+    * The afterStep method receives control
+    * after a step execution ends.
+    * @throws Exception throw if an error occurs.
+    */
+    public void afterStep() throws Exception;
+}
+
+
+
+
AbstractStepListener.java
+
+
package javax.batch.api.listener;
+/**
+* The AbstractStepListener provides default
+* implementations of less commonly implemented methods.
+*/
+public abstract class AbstractStepListener implements
+StepListener {
+    /**
+    * Override this method if the StepListener
+    * will do something before the step begins.
+    * The default implementation does nothing.
+    *
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void beforeStep() throws Exception {
+    }
+    /**
+    * Override this method if the StepListener
+    * will do something after the step ends.
+    * The default implementation does nothing.
+    *
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void afterStep() throws Exception {
+    }
+}
+
+
+
+
+

9.2.3. ChunkListener Interface

+
+

A chunk listener can receive control at the beginning and the end of +chunk, and upon an exception thrown back to the runtime implementation. +The ChunkListener interface may be used to implement a ChunkListener +batch artifact:

+
+
+
ChunkListener.java
+
+
package javax.batch.api.chunk.listener;
+/**
+* ChunkListener intercepts chunk processing.
+*
+*/
+public interface ChunkListener {
+    /**
+    * The beforeChunk method receives control
+    * before processing of the next
+    * chunk begins. This method is invoked
+    * in the same transaction as the chunk
+    * processing.
+    * @throws Exception throw if an error occurs.
+    */
+    public void beforeChunk() throws Exception;
+    /**
+    * The onError method receives control
+    * before the chunk transaction is rolled back.
+    * Note afterChunk is not invoked in this case.
+    * @param ex specifies the exception that
+    * caused the roll back.
+    * @throws Exception throw if an error occurs.
+    */
+    public void onError(Exception ex) throws Exception;
+    /**
+    * The afterChunk method receives control
+    * after processing of the current
+    * chunk ends. This method is invoked
+    * in the same transaction as the chunk
+    * processing.
+    * @throws Exception throw if an error occurs.
+    */
+    public void afterChunk() throws Exception;
+}
+
+
+
+
AbstractChunkListener.java
+
+
package javax.batch.api.chunk.listener;
+/**
+* The AbstractChunkListener provides default
+* implementations of less commonly implemented methods.
+*/
+public abstract class AbstractChunkListener implements
+ChunkListener {
+    /**
+    * Override this method if the ChunkListener
+    * will do something before the chunk begins.
+    * The default implementation does nothing.
+    *
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void beforeChunk() throws Exception {
+    }
+    /**
+    * Override this method if the ChunkListener will do
+    * something before the chunk transaction is rolled back.
+    * Note afterChunk is not invoked in this case.
+    * @param ex specifies the exception that
+    * caused the roll back.
+    * @throws Exception (or subclass) throw if an error occurs.
+    */
+    @Override
+    public void onError(Exception ex) throws Exception {
+    }
+    /**
+    * Override this method if the ChunkListener
+    * will do something after the chunk ends.
+    * The default implementation does nothing.
+    *
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void afterChunk() throws Exception {
+    }
+}
+
+
+
+
+

9.2.4. ItemReadListener Interface

+
+

An item read listener can receive control before and after an item is +read by an item reader, and also if the reader throws an exception. The +ItemReadListener interface may be used to implement an ItemReadListener +batch artifact:

+
+
+
ItemReadListener.java
+
+
package javax.batch.api.chunk.listener;
+/**
+* ItemReadListener intercepts item reader
+* processing.
+*
+*/
+public interface ItemReadListener {
+    /**
+    * The beforeRead method receives control
+    * before an item reader is called to read the next item.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void beforeRead() throws Exception;
+    /**
+    * The afterRead method receives control after an item
+    * reader reads an item. The method receives the item read as
+    * an input.
+    * @param item specifies the item read by the item reader.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void afterRead(Object item) throws Exception;
+    /**
+    * The onReadError method receives control after an item reader
+    * throws an exception in the readItem method.
+    * This method receives the exception as an input.
+    * @param ex specifies the exception that occurred in the item reader.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void onReadError(Exception ex) throws Exception;
+}
+
+
+
+
AbstractItemReadListener.java
+
+
package javax.batch.api.chunk.listener;
+/**
+* The AbstractItemReadListener provides default
+* implementations of less commonly implemented methods.
+*/
+public abstract class AbstractItemReadListener implements
+ItemReadListener {
+    /**
+    * Override this method if the ItemReadListener
+    * will do something before the item is read.
+    * The default implementation does nothing.
+    *
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void beforeRead() throws Exception {
+    }
+    /**
+    * Override this method if the ItemReadListener
+    * will do something after the item is read.
+    * The default implementation does nothing.
+    *
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void afterRead(Object item) throws Exception {
+    }
+    /**
+    * Override this method if the ItemReadListener
+    * will do something when the ItemReader readItem
+    * method throws an exception.
+    * The default implementation does nothing.
+    *
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void onReadError(Exception ex) throws Exception {
+    }
+}
+
+
+
+
+

9.2.5. ItemProcessListener Interface

+
+

An item processor listener can receive control before and after an item +is processed by an item processor, and also if the processor throws an +exception. The ItemProcessListener interface may be used to implement an +ItemProcessListener batch artifact:

+
+
+
ItemProcessListener.java
+
+
package javax.batch.api.chunk.listener;
+/**
+* ItemProcessListener intercepts item processing.
+*
+*/
+public interface ItemProcessListener {
+    /**
+    * The beforeProcess method receives control before
+    * an item processor is called to process the next item.
+    * The method receives the item to be processed as an input.
+    * @param item specifies the item about to be processed.
+    * @throws Exception if an error occurs.
+    */
+    public void beforeProcess(Object item) throws Exception;
+    /**
+    * The afterProcess method receives control after an item
+    * processor processes an item. The method receives the item processed
+    * and the result item as an input.
+    * @param item specifies the item processed by the item processor.
+    * @param result specifies the item to pass to the item writer.
+    * @throws Exception if an error occurs.
+    */
+    public void afterProcess(Object item, Object result) throws
+    Exception;
+    /**
+    * The onProcessError method receives control after an
+    * item processor processItem throws an exception. The method
+    * receives the item sent to the item processor as input.
+    * @param item specifies the item the processor attempted to process.
+    * @param ex specifies the exception thrown by the item processor.
+    * @throws Exception if an error occurs
+    */
+    public void onProcessError(Object item, Exception ex) throws
+    Exception;
+}
+
+
+
+
AbstractItemProcessListener.java
+
+
package javax.batch.api.chunk.listener;
+/**
+* The AbstractItemProcessListener provides default
+* implementations of less commonly implemented methods.
+*
+*/
+public abstract class AbstractItemProcessListener implements
+ItemProcessListener {
+    /**
+    * Override this method if the ItemProcessListener
+    * will do something before the item is processed.
+    * The default implementation does nothing.
+    *
+    * @param item specifies the item about to be processed.
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void beforeProcess(Object item) throws Exception {
+    }
+    /**
+    * Override this method if the ItemProcessListener
+    * will do something after the item is processed.
+    * The default implementation does nothing.
+    *
+    * @param item specifies the item about to be processed.
+    * @param result specifies the item to pass to the item writer.
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void afterProcess(Object item, Object result) throws
+    Exception {
+    }
+    /**
+    * Override this method if the ItemProcessListener
+    * will do something when the ItemProcessor processItem
+    * method throws an exception.
+    * The default implementation does nothing.
+    *
+    * @param item specifies the item about to be processed.
+    * @param ex specifies the exception thrown by the item processor.
+    * @throws Exception (or subclass) if an error occurs.
+    */
+    @Override
+    public void onProcessError(Object item, Exception ex) throws
+    Exception {
+    }
+}
+
+
+
+
+

9.2.6. ItemWriteListener Interface

+
+

A item write listener can receive control before and after an item is +written by an item writer, and also if the writer throws an exception. +The ItemWriteListener interface may be used to implement an +ItemWriteListener batch artifact:

+
+
+
ItemWriteListener.java
+
+
package javax.batch.api.chunk.listener;
+import java.util.List;
+/**
+* ItemWriteListener intercepts item writer
+* processing.
+*
+*/
+public interface ItemWriteListener {
+    /**
+    * The beforeWrite method receives control before
+    * an item writer is called to write its items. The
+    * method receives the list of items sent to the item
+    * writer as an input.
+    * @param items specifies the items about to be
+    * written.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void beforeWrite(List<Object> items) throws Exception;
+    /**
+    * The afterWrite method receives control after an
+    * item writer writes its items. The method receives the
+    * list of items sent to the item writer as an input.
+    * @param items specifies the items written by the item writer.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void afterWrite(List<Object> items) throws Exception;
+    /**
+    * The onWriteError method receives control after an
+    * item writer writeItems throws an exception. The method
+    * receives the list of items sent to the item writer as input.
+    * @param items specifies the items which the item writer
+    * attempted to write.
+    * @param ex specifies the exception thrown by the item
+    * writer.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void onWriteError(List<Object> items, Exception ex) throws
+    Exception;
+}
+
+
+
+
+

9.2.7. Skip Listener Interfaces

+
+

A skip listener can receive control when a skippable exception is +thrown from an item reader, processor, or writer. Three interfaces are +provided to implement these listeners:

+
+
+
SkipReadListener.java
+
+
package javax.batch.api.chunk.listener;
+/**
+* SkipReadListener intercepts skippable
+* itemReader exception handling.
+*/
+public interface SkipReadListener {
+    /**
+    * The onSkipReadItem method receives control
+    * when a skippable exception is thrown from an
+    * ItemReader readItem method. This method receives the
+    * exception as an input.
+    * @param ex specifies the exception thrown by the ItemReader.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void onSkipReadItem(Exception ex) throws Exception;
+}
+
+
+
+
SkipProcessListener.java
+
+
package javax.batch.api.chunk.listener;
+/**
+* SkipProcessListener intercepts skippable
+* itemProcess exception handling.
+*/
+public interface SkipProcessListener {
+    /**
+    * The onSkipProcessItem method receives control when
+    * a skippable exception is thrown from an ItemProcess
+    * processItem method.
+    * This method receives the exception and the item to process
+    * as an input.
+    * @param item specifies the item passed to the ItemProcessor.
+    * @param ex specifies the exception thrown by the
+    * ItemProcessor.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void onSkipProcessItem(Object item, Exception ex) throws
+    Exception;
+}
+
+
+
+
SkipWriteListener.java
+
+
package javax.batch.api.chunk.listener;
+import java.util.List;
+/**
+* SkipWriteListener intercepts skippable
+* itemWriter exception handling.
+*/
+public interface SkipWriteListener {
+    /**
+    * The onSkipWriteItems method receives control when a
+    * skippable exception is thrown from an ItemWriter
+    * writeItems method. This
+    * method receives the exception and the items that were
+    * skipped as an input.
+    * @param items specifies the list of item passed to the
+    * item writer.
+    * @param ex specifies the exception thrown by the
+    * ItemWriter.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void onSkipWriteItem(List<Object> items, Exception ex)
+    throws Exception;
+}
+
+
+
+
+

9.2.8. RetryListener Interface

+
+

A retry listener can receive control when a retryable exception is +thrown from an item reader, processor, or writer. Three interfaces are +provided to implement these listeners:

+
+
+
RetryReadListener.java
+
+
package javax.batch.api.chunk.listener;
+/**
+* RetryReadListener intercepts retry processing for
+* an ItemReader.
+*/
+public interface RetryReadListener {
+    /**
+    * The onRetryReadException method receives control
+    * when a retryable exception is thrown from an ItemReader
+    * readItem method.
+    * This method receives the exception as input. This method
+    * receives control in the same checkpoint scope as the
+    * ItemReader. If this method throws a an exception, the job
+    * ends in the FAILED state.
+    * @param ex specifies the exception thrown by the item
+    * reader.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void onRetryReadException(Exception ex) throws Exception;
+}
+
+
+
+
RetryProcessListener.java
+
+
package javax.batch.api.chunk.listener;
+/**
+* RetryProcessListener intercepts retry processing for
+* an ItemProcessor.
+*
+*/
+public interface RetryProcessListener {
+    /**
+    * The onRetryProcessException method receives control
+    * when a retryable exception is thrown from an ItemProcessor
+    * processItem method. This method receives the exception and the item
+    * being processed as inputs. This method receives control in same
+    * checkpoint scope as the ItemProcessor. If this method
+    * throws a an exception, the job ends in the FAILED state.
+    * @param item specifies the item passed to the ItemProcessor.
+    * @param ex specifies the exception thrown by the ItemProcessor.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void onRetryProcessException(Object item, Exception ex)
+    throws Exception;
+}
+
+
+
+
RetryWriteListener.java
+
+
package javax.batch.api.chunk.listener;
+import java.util.List;
+/**
+* RetryWriteListener intercepts retry processing for
+* an ItemWriter.
+*
+*/
+public interface RetryWriteListener {
+    /**
+    * The onRetryWriteException method receives control when a
+    * retryable exception is thrown from an ItemWriter writeItems
+    * method. This method receives the exception and the list of items
+    * being written as inputs.
+    * This method receives control in same checkpoint scope as the
+    * ItemWriter. If this method throws a an exception, the job ends
+    * in the FAILED state.
+    * @param items specify the items passed to an item writer.
+    * @param ex specifies the exception thrown by an item
+    * writer.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void onRetryWriteException(List<Object> items, Exception ex)
+    throws Exception;
+}
+
+
+
+
+
+

9.3. Batch Properties

+
+

Batch applications need a way to receive parameters when a job is +initiated for execution. Properties can be defined by batch programming +model artifacts, then have values passed to them when a job is +initiated. Batch properties are string values.

+
+
+

Note batch properties are visible only in the scope in which they are +defined (see Section 9.3.2). However batch properties values can be +formed from other properties according to Job XML Substitution Rules. +See section 8.8 for further information on substitution.

+
+
+

9.3.1. @BatchProperty

+
+

The @BatchProperty annotation identifies a class field injection as a +batch property. A batch property has a name (name) and default value. +The @BatchProperty may be used on a class field for any class identified +as a batch programming model artifact -E.g. ItemReader, ItemProcessor, +JobListener, etc..

+
+
+

@BatchProperty must be used with the standard @Inject annotation +(javax.inject.Inject). @BatchProperty is used to assign batch artifact +property values from Job XML to the batch artifact itself.

+
+
+

A field annotated with the @BatchProperty annotation must not be static +and must not be final.

+
+
+

Note: the batch runtime must ensure @Inject works with @BatchProperty, +whether or not the execution environment includes an implementation of +JSR 299 or 330. This means the batch properties may always be injected. +Whether or not other injections are supported is dependent upon the +batch runtime implementation.

+
+
+

Syntax:

+
+
+
+
 package: javax.batch.api
+
+ @Inject @BatchProperty(name="<property-name>") String <field-name>;
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

<property-name>

is the optional name of this batch property. The +default is the Java field name.

<field-name>

is the field name of the batch property.

+
+
BatchProperty.java
+
+
package javax.batch.api;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import javax.enterprise.util.Nonbinding;
+import javax.inject.Qualifier;
+/**
+* Annotation used by batch artifacts to declare a
+* field which is injectable via a JSL-defined value
+* (possibly leveraging Job XML substitutions).
+*
+*/
+@Qualifier
+@Target({
+    ElementType._FIELD_, ElementType._METHOD_,
+    ElementType._PARAMETER_
+}
+)
+@Retention(RetentionPolicy._RUNTIME_)
+public @interface BatchProperty {
+    @Nonbinding
+    public String name() default "";
+}
+
+
+
+

The value of the annotated field is assigned by the batch runtime if a +corresponding property element with a matching name is specified in the +JSL in the scope that applies to the batch artifact in question. If the +JSL property value resolves to the empty string (either explicitly set +to the empty string literal or resolving to an empty string via property +substitution – see section 8.8), no assignment is made and the resulting +value is undefined by the batch specification. The resulting value might +simply be the Java default value, however using various dependency +injection technologies may produce different results. The resultant +behavior may be defined by the particular dependency injection +technology used in the runtime environment and so is outside the scope +of this specification. +Example:

+
+
+
+
 import javax.inject.Inject;
+ import javax.batch.api.BatchProperty;
+ public class MyItemReaderImpl {
+
+@Inject @BatchProperty String fname;
+
+}
+
+
+
+

Behavior:

+
+
+

When the batch runtime instantiates the batch artifact (item reader in +this example), it assigns the

+
+
+

value of the property with name equal to fname provided in the job XML +to the corresponding @BatchProperty field named fname. If no value is +defined in JSL, the Java default (null) is assigned or some other +default is provided by a particular dependency injection technology.

+
+
+
+

9.3.2. Scope of property definitions for @BatchProperty Injection

+
+

The rules governing the definition of properties for injection via +@BatchProperty deserve some extra explanation and an example.

+
+
+

For a given artifact, the only properties that are injectable via +@BatchProperty are those which are defined at the level of the artifact +itself (i.e. as children of the "properties" element which is in turn a +child of the very element defining the artifact: batchlet, reader, +listener, etc.).

+
+
+

In particular, just because an artifact definition is contained (at some +level of nesting) within a job element and (for most artifacts) within a +step element as well, it is NOT the case that the job properties and +step properties are themselves injectable into that artifact via +@BatchProperty. This is the case even though these job and step +properties are available for resolving the artifact-level property +definitions via the jobProperties substitution mechanism (see section +8.8.1.2) .

+
+
+

The following example should make this more clear:

+
+
+
Example JSL
+
+
<job>
+ <properties>
+ <property name="x" value="xVal"/>
+ ...
+ <step id="step1">
+  <batchlet ref="MyBatchlet">
+   <properties>
+    <property name="y" value="#\{jobProperties['x']}"/>
+   </properties>
+
+
+
+

Example Java (MyBatchlet from JSL above):

+
+
+
+
 // WONT WORK! - There is no property 'x' in scope for this injection
+ @Inject @BatchProperty(name="x");
+
+ // WILL WORK – Gets value 'xVal'
+ @Inject @BatchProperty(name="y");
+
+
+
+
+
+

9.4. Batch Contexts

+
+

Context objects are supplied by the batch runtime and provide important +functions to a batch application. Contexts provide information about the +running batch job, provide a place for a batch job to store interim +values, and provide a way for the batch application to communicate +important information back to the batch runtime. Contexts can be +injected into an application as member variables. There is a context for +both job and step. The job context represents the entire job. The step +context represents the current step executing within the job.

+
+
+

9.4.1. Batch Contexts

+
+

Batch artifact access to batch contexts is by injection using the +standard @Inject annotation (javax.inject.Inject). A field into which a +batch context is injected must not be static and must not be final. +E.g.:

+
+
+
+
@Inject JobContext _jctxt;
+
+
+
+
+
@Inject StepContext _sctxt;
+
+
+
+

The batch runtime is responsible to ensure the correct context object is +injected according to the job or step currently executing.

+
+
+

Note: the batch runtime must ensure @Inject works with JobContext and +StepContext, whether or not the execution environment includes an +implementation of JSR 299 or 330. This means the batch contexts may +always be injected. Whether or not other injections are supported is +dependent upon the batch runtime implementation. + See section 10.9.1 for definition of JobContext class. See section +10.9.2 for definition of StepContext class.

+
+
+
9.4.1.1. Batch Context Lifecycle and Scope
+
+

A batch context has thread affinity and is visible only to the batch +artifacts executing on that particular thread. A batch context injected +field may be null when out of scope. Each context type has a distinct +scope and lifecycle as follows:

+
+
+
    +
  1. +

    JobContext

    +
    +

    There is one JobContext per job execution. It exists for the life of a +job. There is a distinct JobContext for each sub-thread of a parallel +execution (e.g. partitioned step).

    +
    +
  2. +
  3. +

    StepContext

    +
    +

    There is one StepContext per step execution. It exists for the life of +the step. For a partitioned step, there is one StepContext for the +parent step/thread; there is a distinct StepContext for each sub-thread +and each StepContext has its own distinct persistent user data for each +sub-thread.

    +
    +
  4. +
+
+
+
+
+
+

9.5. Parallelization

+
+

Batch jobs may be configured to run some of their steps in parallel. +There are two supported parallelization models:

+
+
+
    +
  1. +

    Partitioned:

    +
    +

    In the partitioned model, a step is configured to run as multiple +instances across multiple threads. Each thread runs the same step or +flow. This model is logically equivalent to launching multiple instances +of the same step. It is intended that each partition processes a +different range of the input items.

    +
    +
    +

    The partitioned model includes several optional batch artifacts to +enable finer control over parallel processing:

    +
    +
    +
      +
    1. +

      PartitionMapper provides a programmatic means for calculating the +number of partitions and unique properties for each.

      +
    2. +
    3. +

      PartitionReducer provides a unit of work demarcation around +partition processing.

      +
    4. +
    5. +

      PartitionCollector provides a means for merging interrim results +from individual partitions.

      +
    6. +
    7. +

      PartitionAnalyzer provides a means to gather interrim and final +results from individual partitions for single point of control +processing and decision making.

      +
    8. +
    +
    +
  2. +
  3. +

    Concurrent:

    +
    +

    In the concurrent model, the flows defined by a split are configured to +run concurrently on multiple threads, one flow per thread.

    +
    +
  4. +
+
+
+

9.5.1. PartitionMapper Interface

+
+

A partition mapper receives control at the start of a partitioned +execution. The partition mapper is responsible to provide unique batch +properties for each partition. The PartitionMapper interface may be used +to implement a PartitionMapper batch artifact:

+
+
+
PartitionMapper.java
+
+
package javax.batch.api.partition;
+import javax.batch.api.partition.PartitionPlan;
+/**
+* PartitionMapper receives control at the start of a partitioned
+* execution. A PartitionMapper is responsible to provide unique
+* batch properties for each partition.
+*
+*/
+public interface PartitionMapper {
+    /**
+    * The mapPartitions method that receives control at the
+    * start of partitioned step processing. The method
+    * returns a PartitionPlan, which specifies the batch properties
+    * for each partition.
+    * *@return* partition plan for a partitioned step.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public PartitionPlan mapPartitions( ) throws Exception;
+}
+
+
+
+

See section 10.9.4 for details on the PartitionPlan result value type.

+
+
+

The PartitionMapper, when defined, is invoked upon every execution, +including restarted executions. For a full discussion of the behavior on +restart, including how to override particular details of the +PartitionPlan built by the previous execution, see section 10.8.5.

+
+
+
+

9.5.2. PartitionReducer Interface

+
+

A partition reducer provides a unit of work demarcation across +partitions. It is not a JTA transaction; no resources are enlisted. +Rather, it provides transactional flow semantics to facilitate +finalizing merge or compensation logic. The PartitionReducer interface +may be used to implement an PartitionReducer batch artifact:

+
+
+
PartitionReducer.java
+
+
package javax.batch.api.partition;
+/**
+* PartitionReducer provides unit of work demarcation across
+* partitions. It is not a JTA transaction; no resources are
+* enlisted. Rather, it provides transactional flow semantics
+* to facilitate finalizing merge or compensation logic.
+*
+*/
+public interface PartitionReducer {
+    public *enum* PartitionStatus {
+        COMMIT_, _ROLLBACK
+    }
+    /**
+    * The beginPartitionedStep method receives
+    * control at the start of partition processing.
+    * It receives control before the PartitionMapper
+    * is invoked and before any partitions are started.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void beginPartitionedStep() throws Exception;
+    /**
+    * The beforePartitionedStepCompletion method
+    * receives control at the end of partitioned
+    * step processing. It receives control after all
+    * partitions have completed. It does not receive
+    * control if the PartitionReducer is rolling back.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void beforePartitionedStepCompletion() throws Exception;
+    /**
+    * The rollbackPartitionedStep method receives
+    * control if the runtime is rolling back a partitioned
+    * step. Any partition threads still running are
+    * allowed to complete before this method is invoked. This method
+    * receives control if any of the following conditions
+    * are true:
+    * <p>
+    * <ol>
+    * <li>One or more partitions end with a Batch Status of
+    * STOPPED or FAILED.</li>
+    * <li>Any of the following partitioned step callbacks
+    * throw an exception:</li>
+    * <ol>
+    * <li>PartitionMapper</li>
+    * <li>PartitionReducer</li>
+    * <li>PartitionCollector</li>
+    * <li>PartitionAnalyzer</li>
+    * </ol>
+    * <li>A job with partitioned steps is restarted.</li>
+    * </ol>
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void rollbackPartitionedStep() throws Exception;
+    /**
+    * The afterPartitionedStepCompletion method receives control
+    * at the end of a partition processing. It receives a status
+    * value that identifies the outcome of the partition processing.
+    * The status string value is either "COMMIT" or "ROLLBACK".
+    * @param status specifies the outcome of the partitioned step. Values
+    * are "COMMIT" or "ROLLBACK".
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void afterPartitionedStepCompletion(PartitionStatus status)
+    throws Exception;
+}
+
+
+
+
AbstractPartitionReducer.java
+
+
package javax.batch.api.partition;
+/**
+* The AbstractPartitionReducer provides default
+* implementations of less commonly implemented methods.
+*/
+public abstract class AbstractPartitionReducer implements
+PartitionReducer {
+    /**
+    * Override this method to take action before
+    * partitioned step processing begins.
+    *
+    * @throws Exception is thrown if an error occurs.
+    */
+    @Override
+    public void beginPartitionedStep() throws Exception {
+    }
+    /**
+    * Override this method to take action before
+    * normal partitioned step processing ends.
+    *
+    * @throws Exception is thrown if an error occurs.
+    */
+    @Override
+    public void beforePartitionedStepCompletion() throws Exception {
+    }
+    /**
+    * Override this method to take action when a
+    * partitioned step is rolling back.
+    *
+    * @throws Exception is thrown if an error occurs.
+    */
+    @Override
+    public void rollbackPartitionedStep() throws Exception {
+    }
+    /**
+    * Override this method to take action after
+    * partitioned step processing ends.
+    *
+    * @param status specifies the outcome of the partitioned step.
+    * Values are "COMMIT" or "ROLLBACK".
+    * @throws Exception is thrown if an error occurs.
+    */
+    @Override
+    public void afterPartitionedStepCompletion(PartitionStatus status)
+    throws Exception {
+    }
+}
+
+
+
+
+

9.5.3. PartitionCollector Interface

+
+

A partition collector provides a way to send data from individual +partitions to a single point of control running on the parent thread. +The PartitionAnalyzer is used to receive and process this data. See +section 9.5.4 for further information about the PartitionAnalyzer. The +PartitionCollector interface may be used to implement an +PartitionCollector batch artifact:

+
+
+
PartitionCollector.java
+
+
package javax.batch.api.partition;
+import java.io.Serializable;
+/**
+* PartitionCollector provides a way to pass data from
+* individual partitions to a single point of control running on
+* the step's parent thread. The PartitionAnalyzer is used to
+* receive and process this data.
+*
+*/
+public interface PartitionCollector {
+    /**
+    * The collectPartitionData method receives control
+    * periodically during partition processing.
+    * This method receives control on each thread processing
+    * a partition as follows:
+    * <p>
+    * <ol>
+    * <li>for a chunk type step, it receives control after
+    * every chunk checkpoint and then one last time at the
+    * end of the partition;
+    </li>
+    * <li>for a batchlet type step, it receives control once
+    * at the end of the batchlet.</li>
+    * </ol>
+    * <p>
+    * Note the collector is not called if the partition
+    * terminates due to an unhandled exception.
+    * <p>
+    * *@return* an Serializable object to pass to the
+    * PartitionAnalyzer.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public Serializable collectPartitionData() throws Exception;
+}
+
+
+
+
+

9.5.4. PartitionAnalyzer Interface

+
+

A partition analyzer receives control to process data and final results +from partitions. If a partition collector is configured on the step, the +partition analyzer receives control to process the data and results from +the partition collector. While a separate partition collector instance +is invoked on each thread processing a partition, the partition analyzer +runs on a single, consistent thread each time it is invoked. The +PartitionAnalyzer interface may be used to implement an +PartitionAnalyzer batch artifact:

+
+
+
PartitionAnalyzer.java
+
+
package javax.batch.api.partition;
+import java.io.Serializable;
+import javax.batch.runtime.BatchStatus;
+/**
+* PartitionAnalyzer receives control to process
+* data and final results from each partition. If
+* a PartitionCollector is configured on the step,
+* the PartitionAnalyzer receives control to process
+* the data and results from the partition collector.
+* While a separate PartitionCollector instance is
+* invoked on each thread processing a step partition,
+* a single PartitionAnalyzer instance runs on a single,
+* consistent thread each time it is invoked.
+*
+*/
+public interface PartitionAnalyzer {
+    /**
+    * The analyzeCollectorData method receives
+    * control each time a Partition collector sends
+    * its payload. It receives the
+    * Serializable object from the collector as an
+    * input.
+    * @param data specifies the payload sent by a
+    * PartitionCollector.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void analyzeCollectorData(Serializable data) throws
+    Exception;
+    /**
+    * The analyzeStatus method receives control each time a
+    * partition ends. It receives the batch and exit
+    * status strings of the partition as inputs.
+    * @param batchStatus specifies the batch status of a partition.
+    * @param exitStatus specifies the exit status of a partition.
+    * @throws Exception is thrown if an error occurs.
+    */
+    public void analyzeStatus(BatchStatus batchStatus, String
+    exitStatus) throws Exception;
+}
+
+
+
+
AbstractPartitionAnalyzer.java
+
+
package javax.batch.api.partition;
+import java.io.Serializable;
+import javax.batch.runtime.BatchStatus;
+/**
+* The AbstractPartitionAnalyzer provides default
+* implementations of less commonly implemented methods.
+*/
+public abstract class AbstractPartitionAnalyzer implements
+PartitionAnalyzer {
+    /**
+    * Override this method to analyze PartitionCollector payloads.
+    *
+    * @param data specifies the payload sent by the
+    * PartitionCollector.
+    * @throws Exception is thrown if an error occurs.
+    */
+    @Override
+    public void analyzeCollectorData(Serializable data) throws
+    Exception {
+    }
+    /**
+    * Override this method to analyze partition end status.
+    * @param batchStatus specifies the batch status of a partition.
+    * @param exitStatus specifies the exit status of a partition.
+    * @throws Exception is thrown if an error occurs.
+    */
+    @Override
+    public void analyzeStatus(BatchStatus batchStatus, String
+    exitStatus)
+    throws Exception {
+    }
+}
+
+
+
+
+
+

9.6. Decider Interface

+
+

A decider may be used to determine batch exit status and sequencing +between steps, splits, and flows in a Job XML. The decider returns a +String value which becomes the exit status value on which the decision +chooses the next transition. The Decider interface may be used to +implement an Decider batch artifact:

+
+
+
Decider.java
+
+
package javax.batch.api;
+import javax.batch.runtime.StepExecution;
+/**
+* A Decider receives control as part of a decision element
+* in a job. It is used to direct execution flow during job
+* processing. It returns an exit status that updates the
+* current job execution's exit status. This exit status
+* value also directs the execution transition based on
+* next, end, stop, fail child elements configured on the
+* same decision element as the decider.
+*/
+public interface Decider {
+    /**
+    * The decide method sets a new exit status for a job.
+    * It receives an array of StepExecution objects as input.
+    * These StepExecution objects represent the execution
+    * element that transitions to this decider as follows:
+    * <p>
+    * <ul>
+    * <li>Step</li>
+    * <p>
+    * When the transition is from a step, the decide method
+    * receives the StepExecution corresponding
+    * to the step as input.
+    * <li>Split</li>
+    * <p>
+    * When the transition is from a split, the decide method
+    * receives a StepExecution from each flow defined to the split
+    * as input.
+    * <li>Flow</li>
+    * <p>
+    * When the transition is from a flow, the decide method
+    * receives a StepExecution corresponding
+    * to the last execution element that completed in the flow.
+    * This will be a single StepExecution if the last element
+    * was a step and multiple StepExecutions if the last element
+    * was a split.
+    * </ul>
+    * @param executions specifies the StepExecution(s) of the preceding
+    * element.
+    * *@return* updated job exit status
+    * @throws Exception is thrown if an error occurs.
+    */
+    public String decide(StepExecution[] executions) throws Exception;
+}
+
+
+
+
+

9.7. Transactionality

+
+

Chunk type check points are transactional. The batch runtime uses global +transaction mode on the Java EE platform and local transaction mode on +the Java SE platform. Global transaction timeout is configurable at +step-level with a step-level property:

+
+
+

'javax.transaction.global.timeout={seconds} - default is 180 +seconds'

+
+
+

Example:

+
+
+
+
 <step id="MyGlobalStep">
+  <properties>
+   <property name="javax.transaction.global.timeout" value="600"/>
+  </properties>
+ </step>
+
+
+
+
+
+
+

10. Batch Runtime Specification

+
+
+

10.1. Batch Properties Reserved Namespace

+
+

The batch runtime supports properties at job, step, partition, and artifact level. The property name prefix, 'javax.batch', is reserved for +use by the batch runtime, as prescribed by this specification and future +revisions of same. Applications and specification implementations must +not define properties for their own use that begin with this prefix. +Applications that do so risk undefined behavior.

+
+
+
+

10.2. Job Metrics

+
+

The batch runtime supports the following chunk-type step metrics:

+
+
+
    +
  1. +

    readCount - the number of items successfully read.

    +
  2. +
  3. +

    writeCount - the number of items successfully written.

    +
  4. +
  5. +

    filterCount - the number of items filtered by ItemProcessor.

    +
  6. +
  7. +

    commitCount - the number of transactions committed.

    +
  8. +
  9. +

    rollbackCount - the number of transactions rolled back.

    +
  10. +
  11. +

    readSkipCount - the number of skippable exceptions thrown by the ItemReader.

    +
  12. +
  13. +

    processSkipCount - the number of skippable exceptions thrown by the ItemProcessor.

    +
  14. +
  15. +

    writeSkipCount - the number of skippable exceptions thrown by the ItemWriter.

    +
  16. +
+
+
+

These metrics are available through the StepExecution runtime object. +See section 10.9.10 for further information on StepExecution.

+
+
+
+

10.3. Job Runtime Identifiers

+
+

Job runtime artifacts are uniquely defined at runtime with the following +operational identifiers:

+
+ ++++ + + + + + + + + + + + + + + +

instanceId

Is a long that represents an instance of a job. A new job +instance is created everytime a job is started with the JobOperator +"start" method.

executionId

Is a long that represents the next attempt to run a +particular job instance. A new execution is created the first time a job +is started and everytime thereafter when an existing job execution is +restarted with the JobOperator "restart" method. Note there can be no +more than one executionId in the STARTED state at one time for a given +job instance.

stepExecutionId

Is a long that represents the attempt to execute a +particular step within a job execution.

+
+

Note instanceId, executionId, and stepExecutionId are all globally +unique values within a job repository. See section 7.4 for explanation +of job repository.

+
+
+
+

10.4. JobOperator

+
+

The JobOperator interface provides a set of operations to start, stop, +restart, and inspect jobs. See 10.9.6 for detailed description of this +interface. The JobOperator interface is accessible via a factory +pattern:

+
+
+
+
JobOperator jobOper = BatchRuntime.getJobOperator();
+
+
+
+

See section 10.9.5 for details on the BatchRuntime class.

+
+
+
+

10.5. Batch Artifact Loading

+
+

All batch artifacts comprising a batch application are loadable by the +following loaders in the order specified:

+
+
+
    +
  1. +

    Implementation-specific loader

    +
    +

    The batch runtime implementation _may_provide an +implementation-specific means by which batch artifacts references in a Job XML (i.e. via the 'ref=' attribute) are resolved to an implementation class and instantiated. When the batch runtime resolves a batch artifact reference to an instance the implementation-specific mechanism (if one exists) is attempted first. The loader must return an +instance or null.

    +
    +
    +

    An example of an implementation-specific loader might be CDI or Spring DI.

    +
    +
  2. +
  3. +

    Archive loader

    +
    +

    If an implementation-specific mechanism does not exist or fails toresolve a batch artifact reference (returns null), then the batch +runtime implementation must resolve the reference with an archive +loader. The implementation must provide an archive loader that resolves +the reference by looking up the reference in a batch.xml file, which +maps reference name to implementation class name. The loader must return +an instance or null.

    +
    +
    +

    The batch.xml file is packaged by the developer with the application under the ‘META-INF’ directory (‘WEB-INF/classes/META-INF’ for .war files).

    +
    +
    +

    See 10.7.1 for more about the batch.xml file.

    +
    +
  4. +
  5. +

    Thread Context Class Loader

    +
    +

    If the archive loader fails to resolve a batch artifact reference (returns null), then the batch runtime implementation must resolve the reference by treating the reference as a class name and loading it through the thread context class loader. The loader must return an instance or null.

    +
    +
  6. +
+
+
+
+

10.6. Job XML Loading

+
+

Job XML is specified by name on the JobOperator.start command (see +10.9.6) to start a job.

+
+
+

All Job XML references are loadable by the following loaders in the +order specified:

+
+
+
    +
  1. +

    implementation-specific loader

    +
    +

    The batch runtime implementation _must_provide an implementation-specific means by which Job XML references are resolved to a Job XML document.

    +
    +
    +

    The purpose of an implementation-specific loader is to enable Job XMLloading from outside of the application archive, such as from a repository, file system, remote cache, or elsewhere.

    +
    +
  2. +
  3. +

    archive loader

    +
    +

    If the implementation-specific mechanism does fails to resolve a Job XML reference, then the batch runtime implementation must resolve the reference with an archive loader. The implementation must provide an archive loader that resolves the reference by looking up the reference +from the META-INF/batch-jobs directory.

    +
    +
    +

    Job XML documents may be packaged by the developer with the application under the ‘META-INF/batch-jobs’ directory ('`WEB-INF/classes/META-INF`/batch-jobs' for .war files).

    +
    +
    +

    See 10.7.2 for more about the META-INF/batch-jobs.

    +
    +
  4. +
+
+
+
+

10.7. Application Packaging Model

+
+

The batch artifacts that comprise a batch application requiring no +unique packaging. They may be packaged in a standard jar file or can be +included inside any Java archive type, as supported by the target +execution platform in question.E.g. batch artifacts may be included in +wars, EJB jars, etc, so long as they exist in the class loader scope of +the program initiating the batch jobs (i.e. using the JobOperator start +method).

+
+
+

10.7.1. META-INF/batch.xml

+
+

A batch application may use the archive loader (see section 10.5) to +load batch artifacts. The application can direct artifact loading by +supplying an optional batch.xml file. The batch.xml file must be stored +under the META-INF directory. For .jar files it is the standard META-INF +directory. For .war files it is the WEB-INF/classes/META-INF directory. +The format and content of the batch.xml file follows:

+
+
+
+
<batch-artifacts xmlns="http://xmlns.jcp.org/xml/ns/javaee">
+ <ref id="<reference-name>" class="<impl-class-name>" />
+</batch-artifacts>
+
+
+
+

Where:

+
+ ++++ + + + + + + + + + + +

<reference-name>

Specifies the reference name of the batch artifact. +This is the value that is specified on the ref= attribute of the Job +XML.

<impl-class-name>

Specifies the fully qualified class name of the +batch artifact implementation.

+
+

Notes:

+
+
+
    +
  1. +

    If an implementation-specific loader is used (see +10.5) any artifact it loads takes precedence over artifacts specified in batch.xml.

    +
  2. +
  3. +

    Use of batch.xml to load batch artifacts requires the +availability of a zero-argument constructor (either a default +constructor or an explicitly-defined, no-arg +constructor ).

    +
  4. +
+
+
+
+

10.7.2. META-INF/batch-jobs

+
+

A batch application may use the archive loader (see section 10.6) to +load Job XML documents. The application does this by storing the Job XML +documents under the META-INF/batch-jobs directory. For .jar files the +batch-jobs directory goes under the standard META-INF directory. For +.war files it goes under the WEB-INF/classes/META-INF directory. Note +Job XML documents are valid only in the batch-jobs directory: +sub-directories are ignored. +Job XML documents stored under META-INF/batch-jobs are named with the +convention `<name>.xml,Where:

+
+ ++++ + + + + + + + + + + +

<name>

Specifies the name of a Job XML. This is the value that is +specified on the JobOperator.start command.

.xml

Specifies required file type of a Job XML file under +META-INF/batch-jobs.

+
+

Note if an implementation-specific loader (see 10.6) loads a Job XML +document that document takes precedence over documents stored under +META-INF/batch-jobs.

+
+
+
+
+

10.8. Restart Processing

+
+

The JobOperator restart method is used to restart a JobExecution. A +JobExecution is eligible for restart if:

+
+
+
    +
  • +

    Its batch status is STOPPED or FAILED.

    +
  • +
  • +

    It is the most recent JobExecution.

    +
  • +
+
+
+

10.8.1. Job Parameters on Restart

+
+

Job parameter values are not remembered from one execution to the next. +All Job Parameter substitution during job restart is performed based +exclusively on the job parameters specified on that restart.

+
+
+
+

10.8.2. Job XML Substitution during Restart

+
+

See section 8.8.1.8 Job Restart Rule.

+
+
+
+

10.8.3. Execution Sequence on Restart – Overview

+
+

On the initial execution of a JobInstance, the sequence of execution is +essentially:

+
+
+
    +
  1. +

    Start at initial execution element

    +
  2. +
  3. +

    Execute the current execution element

    +
  4. +
  5. +

    Either:

    +
    +
      +
    1. +

      Transition to next execution element (and go to step 2. above) OR

      +
    2. +
    3. +

      Terminate execution

      +
    4. +
    +
    +
  6. +
+
+
+

On a restart, i.e. a subsequent execution of a JobInstance, the sequence +of execution is similar, but the batch implementation must, in addition, +determine which steps it does and does not need to re-execute.

+
+
+

So on a restart, the sequence of execution looks like:

+
+
+
    +
  1. +

    Start at restart position

    +
  2. +
  3. +

    Decide whether or not to execute (or re-execute) the current execution element

    +
  4. +
  5. +

    Either:

    +
    +
      +
    1. +

      Transition to next execution element (and go to step 2. above) OR

      +
    2. +
    3. +

      Terminate execution

      +
    4. +
    +
    +
  6. +
+
+
+

So it follows that for restart we need: a definition of where in the job +definition to begin; rules for deciding whether or not to execute the +current execution element; and rules for performing transitioning, +especially taking into account that all steps relevant to transitioning +may not have executed on this (restart) execution. These rules are +provided below.

+
+
+
+

10.8.4. Execution Sequence on Restart – Detailed Rules

+
+

Upon restart, the job is processed as follows:

+
+
+
    +
  1. +

    Job XML Substitution is performed (see section 8.8).

    +
  2. +
  3. +

    Start by setting the current position to the restart position. The restart position is either:

    +
    +
      +
    1. +

      the execution element identified by the <stop> elements "restart" +attribute if that is how the previous execution ended; else

      +
    2. +
    3. +

      the initial execution element determined the same as upon initial +job start, as described in section 8.2.5 Step Sequence;

      +
    4. +
    +
    +
  4. +
  5. +

    Determine if the current execution element should re-execute:

    +
    +
      +
    1. +

      If the current execution element is a COMPLETED step that specifies allow-restart-if-complete=false, then transition based on the exit status for this step from the previous completed execution. If the transition is a next transition, then repeat step 3 here with the value of next as the new, "current" execution element. Or, if the transition +is a terminating transition such as end, stop, or fail, then terminate +the restart execution accordingly.

      +
    2. +
    3. +

      If the current execution element is a COMPLETED step that specifies +allow-restart-if-complete=true, then re-run the step and transition +based on the new exit status from the new step execution. As above, +either repeat step 3 with the next execution element or terminate the +new execution as the transition element

      +
    4. +
    5. +

      If the current execution element is a +STOPPED or FAILED step then restart the step and transition based on the +exit status from the new step execution.+

      +
      +

      Note if the step is a partitioned step, only the partitions that did not +complete previously are restarted. This behavior may be overridden via a +PartitionMapper (see section 10.8.5). Note +for a partitioned step, the checkpoints and persistent user data are +loaded from the persistent store on a per-partition basis (this is not a +new rule, but a fact implied by the discussion of checkpoints in section +8.2.6 and the Step Context in section 9.4.1.1, which is summarized here +for convenience).

      +
      +
    6. +
    7. +

      If the current execution element is a decision, execute the decision +(i.e. execute the Decider) unconditionally. The Deciders "decide" method +is passed a StepExecution array as a parameter. This array will be +populated with the most-recently completed StepExecution(s) for each +corresponding step.E.g. some StepExecution(s) may derive from previous +job executions and some from the current restart (execution). A single +decision following a split could even have a mix of old, new +StepExecution(s) in the same array.

      +
    8. +
    9. +

      If the current execution element is a flow, transition to the first +execution element in the flow and perform step 3 with this as the +current element. When restart processing of the flow has completed, then +follow the same rules which apply during the original execution (see +section 8.9) to transition at the flow level to the next execution +element, and repeat step 3 with that element as the current element.

      +
      +

      Note the same rules regarding transitioning within a flow during an +original execution apply during restart processing as well.

      +
      +
    10. +
    11. +

      If the current execution element is a split, proceed in parallel for +each flow in the split. For each flow, repeat step 3 with the flow +element as the current element. When all flows in the split have been +processed, follow the split’s transition to the next execution element +and repeat step 3 with that element as the current element.

      +
    12. +
    +
    +
  6. +
+
+
+
+

10.8.5. PartitionMapper on Restart

+
+

When the PartitionMapper is invoked at the beginning of a step which has +been executed within a previous job execution, the first and most +important decision for the mapper implementor to make is whether or not +to keep the previous partitions or to begin the new execution with new +partition definitions.

+
+
+

This decision is communicated to the batch implementation via the +'partitionsOverride' property of the PartitionPlan built by the mapper, +i.e. the result of PartitionPlan’s getPartitionsOverride() method.

+
+
+

This property directs whether or not the partitions used in the previous +execution of this step will or will be used (i.e. the relevant data +carried forward and applied) within the current execution of this step. +(As a consequence, the value of this property has no real meaning when +the mapper is first called on the first execution of this step).

+
+
+
10.8.5.1. partitionsOverride = False
+
+

Three rules apply in the case where override is set to 'false':

+
+
+
10.8.5.1.1. Number of Partitions Must Be Same
+
+

The key idea here is that the mapper must build a partition plan with +the same number of partitions that were used in the previous execution +of this step. As a consequence, it is an error for the partition plan to +return (via getPartitions()) a different number than the number of +partitions established by the plan the last time this step was executed.

+
+
+
+
10.8.5.1.2. Partition Properties Populated From Current Plan
+
+

Though the number of partitions in the previous plan is persisted, the +Properties[] returned by the previous PartitionPlan’s +getPartitionProperties() is not. On a new execution of this step, it is +the current return value of PartitionPlan#getPartitionProperties() which +is used to populate the pool of potential 'partitionPlan' substitutions +(see section 8.8.1.4).

+
+
+
+
10.8.5.1.3. "Numbering" of Partitions via Partition Properties
+
+

Upon execution of this step, the batch implementation will associate +each element of the Properties[] returned by +PartitionPlan#getPartitionProperties() with a single partition, in order +to potentially resolve 'partitionPlan' substitutions (see section +8.8.1.4) for a single partition. During the course of execution of each +partition, the batch implementation will capture data such as checkpoint +values, persistent user data, etc.

+
+
+

Upon a new execution of this step during restart, the batch +implementation must ensure that a similar mapping occurs. That is, the +elements of the new Properties[] returned by the +PartitionPlan#getPartitionProperties() built by the mapper must be +mapped to the partitions in the same order as the earlier elements of +the earlier Properties[] were mapped (for resolving 'partitionPlan' +substitutions).

+
+
+

E.g., the following must hold:

+
+
+

Earlier Execution:

+
+
+
+
partitionPlanProps[] = mapper.getPartitionPlan().getPartitionProperties();
+
+partitionPlanProps[0] ---maps to---> partition leaving off at checkpoints R0, W0
+
+partitionPlanProps[1] ---maps to---> partition leaving off at checkpoints R1, W1
+
+
+
+

Current Execution:

+
+
+
+
newPartitionPlanProps[] = mapper.getPartitionPlan().getPartitionProperties();
+
+newPartitionPlanProps[0] ---maps to---> partition resuming at checkpoints R0, W0
+
+newPartitionPlanProps [1] ---maps to---> partition resuming at checkpoints R1, W1
+
+
+
+

In the shorthand above, "maps to" simply means that the Properties +object on the left is used to potentially resolve the 'partitionPlan' +substitutions for the give partition, before it executes as described.

+
+
+
+
+
10.8.5.2. partitionsOverride = True
+
+

In this case, all partition execution data: checkpoints, persistent user +data, etc. from the earlier execution are discarded, and the new +PartitionPlan built by the new execution of the PartitionMapper may +define either the same or a different number of partitions; the new P +artitionPlan’s getPartitionProperties() return value will be used to +resolve 'partitionPlan' substitutions.

+
+
+
+
+
+

10.9. Supporting Classes

+
+

10.9.1. JobContext

+
+
JobContext.java
+
+
package javax.batch.runtime.context;
+/**
+*
+* A JobContext provides information about the current
+* job execution.
+*
+*/
+import java.util.Properties;
+import javax.batch.runtime.BatchStatus;
+public interface JobContext
+{
+    /**
+    * Get job name
+    * *@return* value of 'id' attribute from <job>
+    */
+    public String getJobName();
+    /**
+    * The getTransientUserData method returns a transient data object
+    * belonging to the current Job XML execution element.
+    * *@return* user-specified type
+    */
+    public Object getTransientUserData();
+    /**
+    * The setTransientUserData method stores a transient data object into
+    * the current batch context.
+    * @param data is the user-specified type
+    */
+    public void setTransientUserData(Object data);
+    /**
+    * The getInstanceId method returns the current job's instance
+    * id.
+    * *@return* job instance id
+    */
+    public *long* getInstanceId();
+    /**
+    * The getExecutionId method returns the current job's current
+    * execution id.
+    * *@return* job execution id
+    */
+    public *long* getExecutionId();
+    /**
+    * The getProperties method returns the job level properties
+    * specified in a job definition.
+    * <p>
+    * A couple notes:
+    * <ul>
+    * <li> There is no guarantee that the same Properties object instance
+    * is always returned in the same (job) scope.
+    * <li> Besides the properties which are defined in JSL within a child
+    * &lt;
+    properties&gt;
+    element of a &lt;
+    job&gt;
+    element, the batch
+    * runtime implementation may choose to include additional,
+    * implementation-defined properties.
+    * </ul>
+    *
+    * *@return* job level properties
+    */
+    public Properties getProperties();
+    /**
+    * The getBatchStatus method simply returns the batch status value * set
+    by the batch runtime into the job context.
+    * *@return* batch status string
+    */
+    public BatchStatus getBatchStatus();
+    /**
+    * The getExitStatus method simply returns the exit status value stored
+    * into the job context through the setExitStatus method or null.
+    * *@return* exit status string
+    */
+    public String getExitStatus();
+    /**
+    * The setExitStatus method assigns the user-specified exit status for
+    * the current job. When the job ends, the exit status of the job is
+    * the value specified through setExitStatus. If setExitStatus was not
+    * called or was called with a null value, then the exit status
+    * defaults to the batch status of the job.
+    * @param status string
+    */
+    public void setExitStatus(String status);
+}
+
+
+
+
+

10.9.2. StepContext

+
+
StepContext.java
+
+
package javax.batch.runtime.context;
+import java.io.Serializable;
+import java.util.Properties;
+import javax.batch.runtime.BatchStatus;
+import javax.batch.runtime.Metric;
+/**
+*
+* A StepContext provides information about the current step
+* of a job execution.
+*
+*/
+public interface StepContext
+{
+    /**
+    * Get step name
+    * *@return* value of 'id' attribute from <step>
+    *
+    */
+    public String getStepName();
+    /**
+    * The getTransientUserData method returns a transient data object
+    * belonging to the current Job XML execution element.
+    * *@return* user-specified type
+    */
+    public Object getTransientUserData();
+    /**
+    * The setTransientUserData method stores a transient data object into
+    * the current batch context.
+    * @param data is the user-specified type
+    */
+    public void setTransientUserData(Object data);
+    /**
+    * The getStepExecutionId method returns the current step's
+    * execution id.
+    * *@return* step execution id
+    */
+    public *long* getStepExecutionId();
+    /**
+    * The getProperties method returns the step
+    level properties
+    * specified in a job definition.
+    * <p>
+    * A couple notes:
+    * <ul>
+    * <li> There is no guarantee that the same Properties object instance
+    * is always returned in the same (step) scope.
+    * <li> Besides the properties which are defined in JSL within a child
+    * &lt;
+    properties&gt;
+    element of a &lt;
+    step&gt;
+    element, the batch
+    * runtime implementation may choose to include additional,
+    * implementation-defined properties.
+    * </ul>
+    * *@return* step level properties
+    */
+    public Properties getProperties();
+    /**
+    * The getPersistentUserData method returns a persistent data object
+    * belonging to the current step. The user data type must implement
+    * java.util.Serializable. This data is saved as part of a step's
+    * checkpoint. For a step that does not do checkpoints, it is saved
+    * after the step ends. It is available upon restart.
+    * *@return* user-specified type
+    */
+    public Serializable getPersistentUserData();
+    /**
+    * The setPersistentUserData method stores a persistent data object
+    * into the current step. The user data type must implement
+    * java.util.Serializable. This data is saved as part of a step's
+    * checkpoint. For a step that does not do checkpoints, it is saved
+    * after the step ends. It is available upon restart.
+    * @param data is the user-specified type
+    */
+    public void setPersistentUserData(Serializable data);
+    /**
+    * The getBatchStatus method returns the current batch status of the
+    * current step. This value is set by the batch runtime and changes as
+    * the batch status changes.
+    * *@return* batch status string
+    */
+    public BatchStatus getBatchStatus();
+    /**
+    * The getExitStatus method simply returns the exit status value stored
+    * into the step context through the setExitStatus method or null.
+    * *@return* exit status string
+    */
+    public String getExitStatus();
+    /**
+    * The setExitStatus method assigns the user-specified exit status for
+    * the current step. When the step ends, the exit status of the step is
+    * the value specified through setExitStatus. If setExitStatus was not
+    * called or was called with a null value, then the exit status
+    * defaults to the batch status of the step.
+    * @param status string
+    */
+    public void setExitStatus(String status);
+    /**
+    * The getException method returns the last exception thrown from a
+    * step level batch artifact to the batch runtime.
+    * *@return* the last exception
+    */
+    public Exception getException();
+    /**
+    * The getMetrics method returns an array of step level metrics. These
+    * are things like commits, skips, etc.
+    * *@see* javax.batch.runtime.metric.Metric for definition of standard
+    * metrics.
+    * *@return* metrics array
+    */
+    public Metric[] getMetrics();
+}
+
+
+
+
+

10.9.3. Metric

+
+
Metric.java
+
+
package javax.batch.runtime;
+/**
+*
+* The Metric interface defines job metrics recorded by
+* the batch runtime.
+*
+*/
+public interface Metric
+{
+    public *enum* MetricType
+    {
+        READ_COUNT_, _WRITE_COUNT_,
+        _COMMIT_COUNT_,
+        _ROLLBACK_COUNT_, _READ_SKIP_COUNT_, _PROCESS_SKIP_COUNT_,
+        _FILTER_COUNT_,
+        _WRITE_SKIPCOUNT
+    }
+    /**
+    * The getName method returns the metric type.
+    * *@return* metric type.
+    */
+    public MetricType getType();
+    /**
+    * The getValue method returns the metric value.
+    * *@return* metric value.
+    */
+    public *long* getValue();
+}
+
+
+
+
+

10.9.4. PartitionPlan

+
+
PartitionPlan.java
+
+
package javax.batch.api.partition;
+/**
+*
+* PartitionPlan is a helper class that carries partition processing
+* information set by the *@PartitionMapper* method.
+*
+* A PartitionPlan contains:
+* <ol>
+* <li>number of partition instances </li>
+* <li>number of threads on which to execute the partitions</li>
+* <li>substitution properties for each Partition (which can be
+* referenced using the <b><i>#
+{
+    partitionPlan['propertyName']
+}
+</i></b>
+* syntax. </li>
+* </ol>
+*/
+import java.util.Properties;
+public interface PartitionPlan
+{
+    /**
+    * Set number of partitions.
+    * @param count specifies the partition count
+    */
+    public void setPartitions(int count);
+    /**
+    * Specify whether or not to override the partition
+    * count from the previous job execution. This applies
+    * only to step restart .
+    * <p>
+    * When false is specified, the
+    * partition count from the previous job execution is used
+    * and any new value set for partition count in the current run
+    * is ignored. In addition, partition results from the previous
+    * job execution are remembered, and only incomplete partitions
+    * are reprocessed.
+    * <p>
+    * When true is specified, the partition count from the current run
+    * is used and all results from past partitions are discarded. Any
+    * resource cleanup or back out of work done in the previous run is the
+    * responsibility of the application. The PartitionReducer artifact's
+    * rollbackPartitionedStep method is invoked during restart before any
+    * partitions begin processing to provide a cleanup hook.
+    */
+    public void setPartitionsOverride(boolean override);
+    /**
+    * Return current value of partition override setting.
+    * *@return* override setting.
+    */
+    public boolean getPartitionsOverride();
+    /**
+    * Set maximum number of threads requested to use to run
+    * partitions for this step. A value of '0' requests the batch
+    * implementation to use the partition count as the thread
+    * count. Note the batch runtime is not required to use
+    * this full number of threads;
+    it may not have this many
+    * available, and may use less.
+    *
+    * @param count specifies the requested thread count
+    */
+    public void setThreads(int count);
+    /**
+    * Sets array of substitution Properties objects for the set of
+    Partitions.
+    * @param props specifies the Properties object array
+    * @see PartitionPlan#getPartitionProperties()
+    */
+    public void setPartitionProperties(Properties[] props);
+    /**
+    * Gets count of Partitions.
+    * *@return* Partition count
+    */
+    public int getPartitions();
+    /**
+    * Gets maximum number of threads requested to use to run
+    * partitions for this step. A value of '0' requests the batch
+    * implementation to use the partition count as the thread
+    * count. Note the batch runtime is not required to use
+    * this full number of threads;
+    it may not have this many
+    * available, and may use less.
+    *
+    * *@return* requested thread count
+    */
+    public int getThreads();
+    /**
+    * Gets array of Partition Properties objects for Partitions.
+    * <p>
+    * These can be used in Job XML substitution using
+    * substitution expressions with the syntax:
+    * <b><i>#
+    {
+        partitionPlan['propertyName']
+    }
+    </i></b>
+    * <p>
+    * Each element of the Properties array returned can
+    * be used to resolving substitutions for a single partition.
+    * In the typical use case, each Properties element will
+    * have a similar set of property names, with a
+    * substitution potentially resolving to the corresponding
+    * value for each partition.
+    *
+    * *@return* Partition Properties object array
+    */
+    public Properties[]
+    getPartitionProperties();
+}
+
+
+
+
PartitionPlanImpl.java
+
+
package javax.batch.api.partition;
+import java.util.Properties;
+/**
+* The PartitionPlanImpl class provides a basic implementation
+* of the PartitionPlan interface.
+*/
+public class PartitionPlanImpl implements PartitionPlan
+{
+    *private* int partitions= 0;
+    *private* boolean override= *false*;
+    *private* int threads= 0;
+    Properties[] partitionProperties= null;
+    @Override
+    public void setPartitions(int count)
+    {
+        partitions= count;
+        // default thread count to partition count
+        *if* (threads == 0) threads= count;
+    }
+    @Override
+    public void setThreads(int count)
+    {
+        threads= count;
+    }
+    @Override
+    public void setPartitionsOverride(boolean override)
+    {
+        *this*.override= override;
+    }
+    @Override
+    public boolean getPartitionsOverride()
+    {
+        return override;
+    }
+    @Override
+    public void setPartitionProperties(Properties[] props)
+    {
+        partitionProperties= props;
+    }
+    @Override
+    public int getPartitions()
+    {
+        return partitions;
+    }
+    @Override
+    public int getThreads()
+    {
+        return threads;
+    }
+    @Override
+    public Properties[] getPartitionProperties()
+    {
+        return partitionProperties;
+    }
+}
+
+
+
+
+

10.9.5. BatchRuntime

+
+
BatchRuntime.java
+
+
package javax.batch.runtime;
+/**
+* The BatchRuntime represents the batch
+* runtime environment.
+*
+*/
+import javax.batch.operations.JobOperator;
+/**
+* BatchRuntime represents the JSR 352 Batch Runtime.
+* It provides factory access to the JobOperator interface.
+*
+*/
+public class BatchRuntime
+{
+    /**
+    * The getJobOperator factory method returns
+    * an instance of the JobOperator interface.
+    * *@return* JobOperator instance.
+    */
+    public *static* JobOperator getJobOperator()
+    {
+        return null;
+    }
+}
+
+
+
+
+

10.9.6. BatchStatus

+
+
BatchStatus.java
+
+
package javax.batch.runtime;
+
+/**
+* BatchStatus enum defines the batch status values
+* possible for a job.
+*
+*/
+public enum BatchStatus
+{
+    STARTING_, _STARTED_, _STOPPING_,
+    _STOPPED_, _FAILED_, _COMPLETED_, _ABANDONED_
+}
+
+
+
+
+

10.9.7. JobOperator

+
+
JobOperator.java
+
+
package javax.batch.operations;
+import java.util.List;
+import java.util.Set;
+import java.util.Properties;
+import javax.batch.runtime.JobExecution;
+import javax.batch.runtime.JobInstance;
+import javax.batch.runtime.StepExecution;
+/**
+* JobOperator provide the interface for operating on batch jobs.
+* Through the JobOperator a program can start, stop, and restart jobs.
+* It can additionally inspect job history, to discover what jobs
+* are currently running and what jobs have previously run.
+*
+* The JobOperator interface imposes no security constraints. However,
+* the implementer is free to limit JobOperator methods with a security
+* scheme of its choice. The implementer should terminate any method
+* that is limited by the security scheme with a JobSecurityException.
+*
+*/
+public interface JobOperator
+{
+    /**
+    * Returns a set of all job names known to the batch runtime.
+    *
+    * *@return* a set of job names.
+    * @throws JobSecurityException
+    */
+    public Set<String> getJobNames() throws JobSecurityException;
+    /**
+    * Returns number of instances of a job with a particular name.
+    *
+    * @param jobName
+    * specifies the name of the job.
+    * *@return* count of instances of the named job.
+    * @throws NoSuchJobException
+    * @throws JobSecurityException
+    */
+    public int getJobInstanceCount(String jobName) throws
+    NoSuchJobException,
+    JobSecurityException;
+    /**
+    * Returns all JobInstances belonging to a job with a particular name
+    * in reverse chronological order.
+    *
+    * @param jobName
+    * specifies the job name.
+    * @param start
+    * specifies the relative starting number (zero based) to
+    * return from the
+    * maximal list of job instances.
+    * @param count
+    * specifies the number of job instances to return from the
+    * starting position of the maximal list of job instances.
+    * *@return* list of JobInstances.
+    * @throws NoSuchJobException
+    * @throws JobSecurityException
+    */
+    public List<JobInstance> getJobInstances(String jobName, int start,
+    int count)throws NoSuchJobException, JobSecurityException;
+    /**
+    * Returns execution ids for job instances with the specified
+    * name that have running executions.
+    *
+    * @param jobName
+    * specifies the job name.
+    * *@return* a list of execution ids.
+    * @throws NoSuchJobException
+    * @throws JobSecurityException
+    */
+    public List<Long> getRunningExecutions(String jobName) throws
+    NoSuchJobException, JobSecurityException;
+    /**
+    * Returns job parameters for a specified job instance. These are the
+    * key/value pairs specified when the instance was originally created
+    * by the start method.
+    *
+    * @param executionId
+    * specifies the execution from which to retrieve the
+    * parameters.
+    * *@return* a Properties object containing the key/value job parameter
+    * pairs.
+    * @throws NoSuchJobExecutionException
+    * @throws JobSecurityException
+    */
+    public Properties getParameters(*long* executionId)
+    throws NoSuchJobExecutionException, JobSecurityException;
+    /**
+    * Creates a new job instance and starts the first execution of that
+    * instance, which executes asynchronously.
+    *
+    * Note the Job XML describing the job is first searched for by name
+    * according to a means prescribed by the batch runtime implementation.
+    * This may vary by implementation. If the Job XML is not found by that
+    * means, then the batch runtime must search for the specified Job XML
+    * as a resource from the `META-INF/batch-jobs` directory based on the
+    * current class loader. Job XML files under `META-INF/batch-jobs`
+    * directory follow a naming convention of "name".xml where "name" is
+    * the value of the jobXMLName parameter (see below).
+    *
+    * @param jobXMLName
+    * specifies the name of the Job XML describing the job.
+    * @param jobParameters
+    * specifies the keyword/value pairs for attribute
+    * substitution in the Job XML.
+    * *@return* executionId for the job execution.
+    * @throws JobStartException
+    * @throws JobSecurityException
+    */
+    public *long* start(String jobXMLName, Properties jobParameters)
+    throws
+    JobStartException, JobSecurityException;
+    /**
+    * Restarts a failed or stopped job instance, which executes
+    * asynchronously.
+    *
+    * @param executionId
+    * specifies the execution to to restart. This execution
+    * must be the most recent execution that ran.
+    * @param restartParameters
+    * specifies the keyword/value pairs for attribute
+    * substitution in the Job XML.
+    * *@return* new executionId
+    * @throws JobExecutionAlreadyCompleteException
+    * @throws NoSuchJobExecutionException
+    * @throws JobExecutionNotMostRecentException,
+    * @throws JobRestartException
+    * @throws JobSecurityException
+    */
+    public *long* restart(*long* executionId, Properties
+    restartParameters)
+    throws JobExecutionAlreadyCompleteException,
+    NoSuchJobExecutionException,
+    JobExecutionNotMostRecentException,
+    JobRestartException,
+    JobSecurityException;
+    /**
+    * Request a running job execution stops. This
+    * method notifies the job execution to stop
+    * and then returns. The job execution normally
+    * stops and does so asynchronously. Note
+    * JobOperator cannot guarantee the jobs stops:
+    * it is possible a badly behaved batch application
+    * does not relinquish control.
+    * <p>
+    * Note for partitioned batchlet steps the Batchlet
+    * stop method is invoked on each thread actively
+    * processing a partition.
+    *
+    * @param executionId
+    * specifies the job execution to stop.
+    * The job execution must be running.
+    * @throws NoSuchJobExecutionException
+    * @throws JobExecutionNotRunningException
+    * @throws JobSecurityException
+    */
+    public void stop(*long* executionId) throws
+    NoSuchJobExecutionException,
+    JobExecutionNotRunningException, JobSecurityException;
+    /**
+    * Set batch status to ABANDONED. The instance must have
+    * no running execution.
+    * <p>
+    * Note that ABANDONED executions cannot be restarted.
+    *
+    * @param executionId
+    * specifies the job execution to abandon.
+    * @throws NoSuchJobExecutionException
+    * @throws JobExecutionIsRunningException
+    * @throws JobSecurityException
+    */
+    public void abandon(*long* executionId) throws
+    NoSuchJobExecutionException,
+    JobExecutionIsRunningException, JobSecurityException;
+    /**
+    * Return the job instance for the specified execution id.
+    *
+    * @param executionId
+    * specifies the job execution.
+    * *@return* job instance
+    * @throws NoSuchJobExecutionException
+    * @throws JobSecurityException
+    */
+    public JobInstance getJobInstance(*long* executionId) throws
+    NoSuchJobExecutionException, JobSecurityException;
+    /**
+    * Return all job executions belonging to the specified job instance.
+    *
+    * @param jobInstance
+    * specifies the job instance.
+    * *@return* list of job executions
+    * @throws NoSuchJobInstanceException
+    * @throws JobSecurityException
+    */
+    public List<JobExecution> getJobExecutions(JobInstance instance)
+    throws
+    NoSuchJobInstanceException, JobSecurityException;
+    /**
+    * Return job execution for specified execution id
+    *
+    * @param executionId
+    * specifies the job execution.
+    * *@return* job execution
+    * @throws NoSuchJobExecutionException
+    * @throws JobSecurityException
+    */
+    public JobExecution getJobExecution(*long* executionId) throws
+    NoSuchJobExecutionException, JobSecurityException;
+    /**
+    * Return StepExecutions for specified execution id.
+    *
+    * @param executionId
+    * specifies the job execution.
+    * *@return* step executions (order not guaranteed)
+    * @throws NoSuchJobExecutionException
+    * @throws JobSecurityException
+    */
+    public List<StepExecution> getStepExecutions(*long* jobExecutionId)
+    throws NoSuchJobExecutionException, JobSecurityException;
+}
+
+
+
+
+

10.9.8. JobInstance

+
+
JobInstance.java
+
+
package javax.batch.runtime;
+public interface JobInstance
+{
+    /**
+    * Get unique id for this JobInstance.
+    * *@return* instance id
+    */
+    public *long* getInstanceId();
+    /**
+    * Get job name.
+    * *@return* value of 'id' attribute from <job>
+    */
+    public String getJobName();
+}
+
+
+
+
+

10.9.9. JobExecution

+
+
JobExecution.java
+
+
package javax.batch.runtime;
+import java.util.Date;
+import java.util.Properties;
+public interface JobExecution
+{
+    /**
+    * Get unique id for this JobExecution.
+    * *@return* execution id
+    */
+    public *long* getExecutionId();
+    /**
+    * Get job name.
+    * *@return* value of 'id' attribute from <job>
+    */
+    public String getJobName();
+    /**
+    * Get batch status of this execution.
+    * *@return* batch status value.
+    */
+    public BatchStatus getBatchStatus();
+    /**
+    * Get time execution entered STARTED status.
+    * *@return* date (time)
+    */
+    public Date getStartTime();
+    /**
+    * Get time execution entered end status: COMPLETED, STOPPED, FAILED
+    * *@return* date (time)
+    */
+    public Date getEndTime();
+    /**
+    * Get execution exit status.
+    * *@return* exit status.
+    */
+    public String getExitStatus();
+    /**
+    * Get time execution was created.
+    * *@return* date (time)
+    */
+    public Date getCreateTime();
+    /**
+    * Get time execution was last updated.
+    * *@return* date (time)
+    */
+    public Date getLastUpdatedTime();
+    /**
+    * Get job parameters for this execution.
+    * *@return* job parameters
+    */
+    public Properties getJobParameters();
+}
+
+
+
+
+

10.9.10. StepExecution

+
+
StepExecution.java
+
+
package javax.batch.runtime;
+import java.util.Date;
+import java.io.Serializable;
+public interface StepExecution
+{
+    /**
+    * Get unique id for this StepExecution.
+    * *@return* StepExecution id
+    */
+    public *long* getStepExecutionId();
+    /**
+    * Get step name.
+    * *@return* value of 'id' attribute from <step>
+    */
+    public String getStepName();
+    /**
+    * Get batch status of this step execution.
+    * *@return* batch status.
+    */
+    public BatchStatus getBatchStatus();
+    /**
+    * Get time this step started.
+    * *@return* date (time)
+    */
+    public Date getStartTime();
+    /**
+    * Get time this step ended.
+    * *@return* date (time)
+    */
+    public Date getEndTime();
+    /**
+    * Get exit status of step.
+    * *@return* exit status
+    */
+    public String getExitStatus();
+    /**
+    * Get persistent user data.
+    * <p>
+    * For a partitioned step, this returns
+    * the persistent user data of the
+    * <code>StepContext</code> of the "top-level"
+    * or main thread (the one the <code>PartitionAnalyzer</code>, etc.
+    * execute on). It does not return the persistent user
+    * data of the partition threads.
+    * *@return* persistent data
+    */
+    public Serializable
+    getPersistentUserData ();
+    /**
+    * Get step metrics
+    * *@return* array of metrics
+    */
+    public Metric[] getMetrics();
+}
+
+
+
+
+

10.9.11. Batch Exception Classes

+
+

This specification defines batch exception classes in package +javax.batch.operations. Note all batch exceptions are direct subclasses +of base class BatchRuntimeException, which itself is a direct subclass +of java.lang.RuntimeException. The following batch exception classes are +defined:

+
+
+
    +
  1. +

    JobExecutionAlreadyCompleteException

    +
  2. +
  3. +

    JobExecutionIsRunningException

    +
  4. +
  5. +

    JobExecutionNotMostRecentException

    +
  6. +
  7. +

    JobExecutionNotRunningException

    +
  8. +
  9. +

    JobRestartException

    +
  10. +
  11. +

    JobSecurityException

    +
  12. +
  13. +

    JobStartException

    +
  14. +
  15. +

    NoSuchJobException

    +
  16. +
  17. +

    NoSuchJobExecutionException

    +
  18. +
  19. +

    NoSuchJobInstanceException

    +
  20. +
+
+
+
+
+
+
+

11. Job Runtime Lifecycle

+
+
+

The following sections describe an ordered flow of artifact method +invocations. Simple symbols are used to denote actions as follows:

+
+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +

Symbol

Meaning

<action>

An action performed by the batch runtime.

< - > method

Invocation of a batch artifact method by the batch runtime.

[method]

Optional method.

// comment

Comment to clarify behavior.

LABEL:

Label used for flow control comments.

+
+

11.1. Batch Artifact Lifecycle

+
+

All batch artifacts are instantiated prior to their use in the scope in +which they are declared in the Job XML and are valid for the life of +their containing scope. There are three scopes that pertain to artifact +lifecycle: job, step, and step-partition.

+
+
+

One artifact per Job XML reference is instantiated. In the case of a +partitioned step, one artifact per Job XML reference per partition is +instantiated. This means job level artifacts are valid for the life of +the job. Step level artifacts are valid for the life of the step. Step +level artifacts in a partition are valid for the life of the partition.

+
+
+

No artifact instance may be shared across concurrent scopes. The same +instance must be used in the applicable scope for a specific Job XML +reference.

+
+
+
+

11.2. Job Repository Artifact Lifecycle

+
+

All job repository artifacts are created by the batch runtime during job +processing and exist until deleted by an implementation provided means.

+
+
+
+

11.3. Job Processsing

+
+
    +
  1. +

    <Create JobContext>

    +
  2. +
  3. +

    <Store job level properties in JobContext>

    +
  4. +
  5. +

    < - >[JobListener.beforeJob…​] // thread A

    +
  6. +
  7. +

    <processs execution elements>

    +
  8. +
  9. +

    < - >[JobListener.afterJob…​] // thread A

    +
  10. +
  11. +

    <Destroy JobContext>

    +
  12. +
+
+
+
+

11.4. Regular Batchlet Processsing

+
+
    +
  1. +

    <Create StepContext>

    +
  2. +
  3. +

    <Store step level properties in StepContext>

    +
  4. +
  5. +

    < - > [StepListener.beforeStep…​] // thread A

    +
  6. +
  7. +

    < - > Batchlet.process // thread A

    +
  8. +
  9. +

    // if stop issued:

    +
  10. +
  11. +

    < - >[Batchlet.stop] // thread B, StepContext is available

    +
  12. +
  13. +

    < - >[StepListener.afterStep…​] // thread A

    +
  14. +
  15. +

    <Store StepContext persistent area>

    +
  16. +
  17. +

    <Destroy StepContext>

    +
  18. +
+
+
+
+

11.5. Partitioned Batchlet Processsing

+
+
    +
  1. +

    <Create StepContext>

    +
  2. +
  3. +

    <Store step level properties in StepContext>

    +
  4. +
  5. +

    < - >[StepListener.beforeStep…​] // thread A

    +
  6. +
  7. +

    < - >[PartitionReducer.beginPartitionedStep] // thread A

    +
  8. +
  9. +

    < - >[PartitionMapper.mapPartitions] // thread A

    +
  10. +
  11. +

    // per partition:

    +
    +
      +
    1. +

      < - >Batchlet.process // thread Px

      +
    2. +
    3. +

      // if stop issued:

      +
    4. +
    5. +

      < - >[Batchlet.stop] // thread Py, StepContext is available

      +
    6. +
    7. +

      < - >[PartitionCollector.collectPartitionData] // thread Px

      +
    8. +
    +
    +
  12. +
  13. +

    // when collector payload arrives:

    +
  14. +
  15. +

         < - >[PartitionAnalyzer.analyzeCollectorData] // thread A

    +
  16. +
  17. +

    // when partition ends:

    +
  18. +
  19. +

         < - >[PartitionAnalyzer.analyzeStatus] // thread A

    +
  20. +
  21. +

    // if rollback condition occurs:

    +
  22. +
  23. +

         < - >[PartitionReducer.rollbackPartitionedStep] // thread A

    +
  24. +
  25. +

    < - >[PartitionReducer.beforePartitionedStepCompletion] // thread A

    +
  26. +
  27. +

    < - >[PartitionReducer.afterPartitionedStepCompletion] // thread A

    +
  28. +
  29. +

    < - >[StepListener.afterStep…​] // thread A

    +
  30. +
  31. +

    <Store StepContext persistent area>

    +
  32. +
  33. +

    <Destroy StepContext>

    +
  34. +
+
+
+
+

11.6. Regular Chunk Processing

+
+
    +
  1. +

    <Create StepContext>

    +
  2. +
  3. +

    <Store step level properties in StepContext>

    +
  4. +
  5. +

    < - >[StepListener.beforeStep…​] // thread A

    +
  6. +
  7. +

    [<begin transaction> ]

    +
  8. +
  9. +

    < - >ItemReader.open // thread A

    +
  10. +
  11. +

    < - >ItemWriter.open // thread A

    +
  12. +
  13. +

    [<commit transaction> ]

    +
  14. +
  15. +

    // chunk processing:

    +
  16. +
  17. +

    <repeat until no more items (i.e. while readItem hasn’t returned 'null') > \{

    +
    +
      +
    1. +

      <begin checkpoint interval [<begin chunk transaction>]>

      +
    2. +
    3. +

      <repeat until checkpoint criteria reached OR readItem returns null> \{

      +
      +
        +
      1. +

        < - >ItemReader.readItem // thread A

        +
      2. +
      3. +

        // if readItem returns non-null

        +
        +
          +
        1. +

          < - >ItemProcessor.processItem // thread A

          +
        2. +
        3. +

          // if processItem returns non-null, <add item to writeItems +buffer>

          +
        4. +
        +
        +
      4. +
      +
      +
    4. +
    5. +

      }

      +
    6. +
    7. +

      // if at least one non-null value has been successfully read inthe present chunk

      +
      +
        +
      1. +

        < - >ItemWriter.writeItems // thread A

        +
      2. +
      +
      +
    8. +
    9. +

      < - >[ItemReader.checkpointInfo] // thread A

      +
    10. +
    11. +

      < - >[ItemWriter.checkpointInfo] // thread A

      +
    12. +
    13. +

      <Store StepContext persistent area>

      +
    14. +
    15. +

      [<commit chunk transaction>]

      +
    16. +
    +
    +
  18. +
  19. +

    }

    +
  20. +
  21. +

    [<begin transaction> ]

    +
  22. +
  23. +

    < - >ItemWriter.close // thread A

    +
  24. +
  25. +

    < - >ItemReader.close // thread A

    +
  26. +
  27. +

    [<commit transaction> ]

    +
  28. +
  29. +

    < - >[StepListener.afterStep…​] // thread A

    +
  30. +
  31. +

    <Store StepContext persistent area>

    +
  32. +
  33. +

    <Destroy StepContext>

    +
  34. +
+
+
+
+

11.7. Partitioned Chunk Processing

+
+
    +
  1. +

    <Create StepContext>

    +
  2. +
  3. +

    <Store step level properties in StepContext>

    +
  4. +
  5. +

    < - >[StepListener.beforeStep…​] // thread A

    +
  6. +
  7. +

    < - >[PartitionReducer.beginPartitionedStep] // thread A

    +
  8. +
  9. +

    < - >[PartitionMapper.mapPartitions] // thread A
    +// per partition - on thread Px:

    +
    +
      +
    1. +

      [<begin transaction> ]

      +
    2. +
    3. +

      < - >ItemReader.open // thread Px

      +
    4. +
    5. +

      < - >ItemWriter.open // thread Px

      +
    6. +
    7. +

      [<commit transaction> ]

      +
    8. +
    9. +

      <repeat until no more items (i.e. while readItem hasn’t returned +'null') > \{

      +
      +
        +
      1. +

        <begin checkpoint interval [<begin chunk transaction>]>

        +
      2. +
      3. +

        <repeat until checkpoint criteria reached OR readItem returns 'null'> \{

        +
        +
          +
        1. +

          < - >ItemReader.readItem // thread Px

          +
        2. +
        3. +

          // if readItem returns non-null

          +
          +
            +
          1. +

            < - >ItemProcessor.processItem // thread Px

            +
          2. +
          3. +

            //if processItem returns non-null, <add item to writeItems buffer>

            +
          4. +
          +
          +
        4. +
        +
        +
      4. +
      5. +

        }

        +
      6. +
      7. +

        //if at least one non-null value has been successfully read in this partition of the present chunk

        +
        +
          +
        1. +

          < - >ItemWriter.writeItems // thread Px

          +
        2. +
        +
        +
      8. +
      9. +

        < - >[ItemReader.checkpointInfo] // thread Px

        +
      10. +
      11. +

        < - >[ItemWriter.checkpointInfo] // thread Px

        +
      12. +
      13. +

        <Store (partition-local) StepContext persistent area>

        +
      14. +
      15. +

        [<commit chunk transaction>]

        +
      16. +
      17. +

        < - >[PartitionCollector.collectPartitionData] // thread Px

        +
      18. +
      +
      +
    10. +
    11. +

      }

      +
    12. +
    13. +

      [<begin transaction> ]

      +
    14. +
    15. +

      < - >ItemWriter.close // thread Px

      +
    16. +
    17. +

      < - >ItemReader.close // thread Px

      +
    18. +
    19. +

      [<commit transaction> ]

      +
    20. +
    +
    +
  10. +
  11. +

    [<begin transaction> ] // thread A

    +
  12. +
  13. +

    // Actions 9-12 run continuously until all partitions end.

    +
  14. +
  15. +

    // when collector payload arrives:

    +
  16. +
  17. +

         < - >[PartitionAnalyzer.analyzeCollectorData] // thread A

    +
  18. +
  19. +

    // when partition ends:

    +
  20. +
  21. +

         < - >[PartitionAnalyzer.analyzeStatus] // thread A

    +
  22. +
  23. +

    // Remaining actions run after all partitions end:

    +
  24. +
  25. +

    // if rollback condition occurs:

    +
  26. +
  27. +

         < - >[PartitionReducer.rollbackPartitionedStep] // thread A

    +
  28. +
  29. +

         [<rollback transaction >]

    +
  30. +
  31. +

    // else not rollback

    +
  32. +
  33. +

    < - >[PartitionReducer.beforePartitionedStepCompletion] // thread A

    +
  34. +
  35. +

    [<commit transaction> ] // thread A

    +
  36. +
  37. +

    < - >[PartitionReducer.afterPartitionedStepCompletion] // thread A

    +
  38. +
  39. +

    < - >[StepListener.afterStep…​] // thread A

    +
  40. +
  41. +

    <Store StepContext persistent area>

    +
  42. +
  43. +

    <Destroy StepContext>

    +
  44. +
+
+
+
+

11.8. Chunk with Listeners (except RetryListener)

+
+
    +
  1. +

    <Create StepContext>

    +
  2. +
  3. +

    <Store step level properties in StepContext>

    +
  4. +
  5. +

    < - >[StepListener.beforeStep…​] // thread A

    +
  6. +
  7. +

    [<begin transaction> ]

    +
  8. +
  9. +

    < - >ItemReader.open // thread A

    +
  10. +
  11. +

    < - >ItemWriter.open // thread A

    +
  12. +
  13. +

    [<commit transaction> ]

    +
  14. +
  15. +

    // chunk processing:

    +
  16. +
  17. +

    <repeat until no more items (i.e. while readItem hasn’t returned +'null') > \{

    +
    +
      +
    1. +

      <begin checkpoint interval [<begin chunk transaction>]>

      +
    2. +
    3. +

      < - >[ChunkListener.beforeChunk] // thread A

      +
    4. +
    5. +

      <repeat until checkpoint criteria reached OR readItem returns 'null'> {

      +
      +
        +
      1. +

        < - >[ItemReadListener.beforeRead] // thread A

        +
      2. +
      3. +

        < - >ItemReader.readItem // thread A

        +
      4. +
      5. +

        < - >[ItemReadListener.afterRead] // thread A

        +
      6. +
      7. +

        // or:

        +
      8. +
      9. +

        {

        +
      10. +
      11. +

        < - >[ItemReadListener.onReadError] // thread A

        +
      12. +
      13. +

        < - >[SkipListener.onSkipReadItem] // thread A

        +
      14. +
      15. +

        }

        +
      16. +
      17. +

        // if readItem returns non-null

        +
        +
          +
        1. +

          < - >[ItemProcessListener.beforeProcess] // thread A

          +
        2. +
        3. +

          < - >ItemProcessor.processItem // thread A

          +
        4. +
        5. +

          < - >[ItemProcessListener.afterProcess] // thread A

          +
        6. +
        7. +

          //if processItem returns non-null,< add item to writeItems buffer>

          +
        8. +
        9. +

          // or:

          +
        10. +
        11. +

          {

          +
        12. +
        13. +

          < - >[ItemProcessListener.onProcessError] // thread A

          +
        14. +
        15. +

          < - >[SkipListener.onSkipProcessItem] // thread A

          +
        16. +
        17. +

          }

          +
        18. +
        +
        +
      18. +
      +
      +
    6. +
    7. +

      }

      +
    8. +
    9. +

      //if at least one non-null value has been successfully read in +the present chunk

      +
      +
        +
      1. +

        < - >[ItemWriteListener.beforeWrite] // thread A

        +
      2. +
      3. +

        < - >ItemWriter.writeItems // thread A

        +
      4. +
      5. +

        < - >[ItemWriteListener.afterWrite] // thread A

        +
      6. +
      7. +

        // or:

        +
      8. +
      9. +

        {

        +
      10. +
      11. +

        < - >[ItemWriteListener.onWriteError] // thread A

        +
      12. +
      13. +

        < - >[SkipListener.onSkipWriteItems] // thread A

        +
      14. +
      15. +

        }

        +
      16. +
      +
      +
    10. +
    11. +

      < - >[ChunkListener.afterChunk] // thread A

      +
    12. +
    13. +

      < - >[ItemReader.checkpointInfo] // thread A

      +
    14. +
    15. +

      < - >[ItemWriter.checkpointInfo] // thread A

      +
    16. +
    17. +

      <Store StepContext persistent area>

      +
    18. +
    19. +

      [<commit chunk transaction>]

      +
    20. +
    +
    +
  18. +
  19. +

    }

    +
  20. +
  21. +

    [<begin transaction> ]

    +
  22. +
  23. +

    < - >ItemWriter.close // thread A

    +
  24. +
  25. +

    < - >ItemReader.close // thread A

    +
  26. +
  27. +

    [<commit transaction> ]

    +
  28. +
  29. +

    < - >[StepListener.afterStep…​] // thread A

    +
  30. +
  31. +

    <Store StepContext persistent area>

    +
  32. +
  33. +

    <Destroy StepContext>

    +
  34. +
+
+
+
+

11.9. Chunk with RetryListener

+
+

Note rollback processing is also depicted in this section.

+
+
+
    +
  1. +

    <Create StepContext>

    +
  2. +
  3. +

    <Store step level properties in StepContext>

    +
  4. +
  5. +

    < - >[StepListener.beforeStep…​] // thread A

    +
  6. +
  7. +

    [<begin transaction> ]

    +
  8. +
  9. +

    < - >ItemReader.open // thread A

    +
  10. +
  11. +

    < - >ItemWriter.open // thread A

    +
  12. +
  13. +

    [<commit transaction> ]

    +
  14. +
  15. +

    // chunk processing:

    +
  16. +
  17. +

    <repeat until no more items (i.e. while readItem hasn’t returned +'null') > \{

    +
    +
      +
    1. +

      S1:

      +
    2. +
    3. +

      <begin checkpoint interval [<begin chunk transaction>]>

      +
    4. +
    5. +

      <repeat until checkpoint criteria reached OR readItem returns +'null'> \{

      +
      +
        +
      1. +

        S2:

        +
      2. +
      3. +

        < - >ItemReader.readItem // thread A

        +
      4. +
      5. +

        // if exception

        +
      6. +
      7. +

             < - >[ItemReadListener.onReadErrror] // thread A

        +
      8. +
      9. +

             < - >[RetryReadListener.onRetryReadException] // thread A

        +
      10. +
      11. +

             // if retryable exception

        +
      12. +
      13. +

                  // if no-rollback exception

        +
      14. +
      15. +

                       resume S2:

        +
      16. +
      17. +

                  // else

        +
      18. +
      19. +

                       <end repeat>

        +
      20. +
      21. +

             // else

        +
      22. +
      23. +

                  <end repeat>

        +
      24. +
      25. +

        S3:

        +
      26. +
      27. +

        // if readItem returns non-null

        +
      28. +
      29. +

             < - >ItemProcessor.processItem // thread A

        +
      30. +
      31. +

             // if exception

        +
      32. +
      33. +

                  < - >[ItemProcessListener.onProcessErrror] // thread A

        +
      34. +
      35. +

                  < - >[RetryProcessListener.onRetryProcessException] // thread A

        +
      36. +
      37. +

                  // if retryable exception

        +
      38. +
      39. +

                       // if no-rollback exception

        +
      40. +
      41. +

                            resume S3:

        +
      42. +
      43. +

                       // else

        +
      44. +
      45. +

                            <end repeat>

        +
      46. +
      47. +

                  // else

        +
      48. +
      49. +

                       <end repeat>

        +
      50. +
      51. +

        // if processItem returns non-null, <add item to writeItems buffer>

        +
      52. +
      +
      +
    6. +
    7. +

      }

      +
    8. +
    9. +

      // if rollback exception, execute rollback procedure (below) and +resume at S1 with item-count=1

      +
    10. +
    11. +

      S4:

      +
    12. +
    13. +

      // if at least one non-null value has been successfully read in the present chunk

      +
    14. +
    15. +

           < - >ItemWriter.writeItems (buffer) // thread A

      +
    16. +
    17. +

           // if exception

      +
    18. +
    19. +

                < - >[ItemWriteListener.onWriteErrror] // thread A

      +
    20. +
    21. +

                < - >[RetryWriteListener.onRetryWriteException] // thread A

      +
    22. +
    23. +

                // if retryable exception

      +
    24. +
    25. +

                     // if no-rollback exception

      +
    26. +
    27. +

                          resume S4:

      +
    28. +
    29. +

                     // else

      +
    30. +
    31. +

                          execute rollback procedure (below) and resume S1:

      +
    32. +
    33. +

                // else execute rollback procedure (below) and resume S1:

      +
    34. +
    35. +

      < - >[ItemReader.checkpointInfo] // thread A

      +
    36. +
    37. +

      < - >[ItemWriter.checkpointInfo] // thread A

      +
    38. +
    39. +

      <Store StepContext persistent area> // thread A

      +
    40. +
    41. +

      S5:

      +
    42. +
    43. +

      [<commit chunk transaction>] // thread A

      +
    44. +
    45. +

      // if exception

      +
    46. +
    47. +

           // if retryable exception

      +
    48. +
    49. +

                // if no-rollback exception:

      +
    50. +
    51. +

                     resume S5:

      +
    52. +
    53. +

                // else

      +
    54. +
    55. +

                     execute rollback procedure (below) and resume S1:

      +
    56. +
    57. +

           // else execute rollback procedure (below) and resume S1:

      +
    58. +
    +
    +
  18. +
  19. +

    }

    +
  20. +
  21. +

    [<begin transaction> ]

    +
  22. +
  23. +

    < - >ItemWriter.close // thread A

    +
  24. +
  25. +

    < - >ItemReader.close // thread A

    +
  26. +
  27. +

    [<commit transaction> ]

    +
  28. +
  29. +

    < - >[StepListener.afterStep…​] // thread A

    +
  30. +
  31. +

    <Store StepContext persistent area>

    +
  32. +
  33. +

    <Destroy StepContext>

    +
  34. +
+
+
+

Rollback Procedure

+
+
+
    +
  1. +

    < - >ItemWriter.close // thread A

    +
  2. +
  3. +

    < - >ItemReader.close // thread A

    +
  4. +
  5. +

    [ChunkListener.onError] // thread A

    +
  6. +
  7. +

    [rollback transaction]

    +
  8. +
  9. +

    [<begin transaction> ]

    +
  10. +
  11. +

    < - >ItemWriter.open // thread A, pass last committed checkpoint +info

    +
  12. +
  13. +

    < - >ItemReader.open // thread A, pass last committed checkpoint +info

    +
  14. +
  15. +

    [<commit transaction> ]

    +
  16. +
+
+
+
+

11.10. Chunk with Custom Checkpoint Processing

+
+
    +
  1. +

    <Create StepContext>

    +
  2. +
  3. +

    <Store step level properties in StepContext>

    +
  4. +
  5. +

    < - >[StepListener.beforeStep…​] // thread A

    +
  6. +
  7. +

    [<begin transaction> ]

    +
  8. +
  9. +

    < - >ItemReader.open // thread A

    +
  10. +
  11. +

    < - >ItemWriter.open // thread A

    +
  12. +
  13. +

    [<commit transaction> ]

    +
  14. +
  15. +

    // chunk processing:

    +
  16. +
  17. +

    <repeat until no more items (i.e. while readItem hasn’t returned +'null') > \{

    +
    +
      +
    1. +

      [

      +
    2. +
    3. +

      < - >[CheckpointAlgorithm.checkpointTimeout]] // thread A

      +
    4. +
    5. +

      < - >[CheckpointAlgorithm.beginCheckpoint] // thread A

      +
    6. +
    7. +

      <begin checkpoint interval [<begin chunk transaction>]>

      +
    8. +
    9. +

      ]

      +
    10. +
    11. +

      <repeat until isReadyToCheckpoint returns 'true' OR readItem returns 'null'> \{

      +
      +
        +
      1. +

        < - >ItemReader.readItem // thread A

        +
      2. +
      3. +

        // if readItem returns non-null

        +
        +
          +
        1. +

          < - >ItemProcessor.processItem // thread A

          +
        2. +
        3. +

          //if processItem returns non-null, <add item to writeItems buffer>

          +
        4. +
        +
        +
      4. +
      5. +

        < - >CheckpointAlgorithm.isReadyToCheckpoint // thread A

        +
      6. +
      +
      +
    12. +
    13. +

      }

      +
    14. +
    15. +

      //if at least one non-null value has been successfully read in +the present chunk

      +
      +
        +
      1. +

        < - >ItemWriter.writeItems // thread A

        +
      2. +
      +
      +
    16. +
    17. +

      < - >[ItemReader.checkpointInfo] // thread A

      +
    18. +
    19. +

      < - >[ItemWriter.checkpointInfo] // thread A

      +
    20. +
    21. +

      <Store StepContext persistent area>

      +
    22. +
    23. +

      [<commit chunk transaction>]

      +
    24. +
    25. +

      < - >[CheckpointAlgorithm.endCheckpoint] // thread A

      +
    26. +
    +
    +
  18. +
  19. +

    }

    +
  20. +
  21. +

    [<begin transaction> ]

    +
  22. +
  23. +

    < - >ItemWriter.close // thread A

    +
  24. +
  25. +

    < - >ItemReader.close // thread A

    +
  26. +
  27. +

    [<commit transaction> ]

    +
  28. +
  29. +

    < - >[StepListener.afterStep…​] // thread A

    +
  30. +
  31. +

    <Store StepContext persistent area>

    +
  32. +
  33. +

    <Destroy StepContext>

    +
  34. +
+
+
+
+

11.11. Split Processing

+
+
    +
  1. +

    // For each flow:

    +
  2. +
  3. +

    <run flow> // thread Fx

    +
  4. +
+
+
+
+

11.12. Flow Processing

+
+
    +
  1. +

    // For each split or step:

    +
  2. +
  3. +

    <run split or step> // thread Xy

    +
  4. +
+
+
+
+

11.13. Stop Processing

+
+

The JobOperator.stop operation stops a running job execution. If a step +is running at the time the stop is invoked, the batch runtime takes the +following actions:

+
+
+

Chunk Step

+
+
+

The job and step batch status is marked STOPPING. Note the batch runtime +cannot guarantee the step actually exits. The batch runtime attempts to +interrupt the read/process/write chunk processing loop. The batch +runtime allows the step to finish processing the current item. This +means the current item is read, processed if a processor is configured, +and all currently buffered items, if any, including the current item, +are written. If the batch artifacts configured on the chunk type step +return to the batch runtime, as expected, the job and step batch status +is marked STOPPED.

+
+
+

Batchlet Step

+
+
+

The job and step batch status is marked STOPPING. The batch runtime +invokes the batchlet’s stop method. Note the batch runtime cannot +guarantee the batchlet actually exits. But a well behaved batchlet will. +If the batchlet returns to the batch runtime, the job and step batch +status is marked STOPPED.

+
+
+

Note for partitioned batchlet steps the Batchlet stop method is invoked +on each thread actively processing a partition.

+
+
+
+
+
+

12. Batch XML XSD

+
+
+
+
<xml version="1.0" encoding="UTF-8">
+ <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+elementFormDefault="qualified"
+ targetNamespace="http://xmlns.jcp.org/xml/ns/javaee"
+ mlns:jbatch="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
+ <xs:element name="batch-artifacts" type="jbatch:BatchArtifacts" />
+ <xs:complexType name="BatchArtifacts">
+ <xs:sequence>
+ <xs:element name="ref" type="jbatch:BatchArtifactRef" minOccurs="0"
+maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="BatchArtifactRef">
+ <xs:attribute name="id" use="required" type="xs:string" />
+ <xs:attribute name="class" use="required" type="xs:string" />
+ </xs:complexType>
+ </xs:schema>
+
+
+
+
+
+

13. Job Specification Language

+
+
+

Jobs are described by a declarative Job Specification Language (JSL) +defined by an XML schema, also known informally as Job XML.

+
+
+

13.1. Validation Rules

+
+

The batch runtime must perform schema validation during JobOperator +start processing before the start method returns to the caller. A schema +validation error results in JobStartException. The implementation has +two choices for handling semantic errors in the JSL:

+
+
+
    +
  1. +

    Do semantic validation during JobOperator start processing before +returning to the caller. If there is a semantic validation error, the +implementation must throw JobStartException.

    +
  2. +
  3. +

    Do semantic validation after job execution begins. If a semantic +validation error occurs, the implementation must end the job in the +FAILED state. The implementation is advised to log sufficient error +information to enable problem resolution.

    +
  4. +
+
+
+

Typical semantic validation the batch runtime should detect and handle +include, but is not limited to:

+
+
+
    +
  1. +

    no executable elements

    +
  2. +
  3. +

    non-existent transitions (e.g. next="value" where "value" does not +exist)

    +
  4. +
  5. +

    cycles among next values (e.g. step1:next=step2; step2:next=step1)

    +
  6. +
+
+
+
+

13.2. JSL XSD

+
+
+
<xml version="1.0" encoding="UTF-8">
+ <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified"
+targetNamespace="http://xmlns.jcp.org/xml/ns/javaee"
+xmlns:jsl="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
+ <xs:annotation>
+ <xs:documentation>
+ Job Specification Language (JSL) specifies a job,
+ its steps, and directs their execution.
+ JSL also can be referred to as "Job XML".
+ </xs:documentation>
+ </xs:annotation>
+ <xs:simpleType name="artifactRef">
+ <xs:annotation>
+ <xs:documentation>
+ This is a helper type. Though it is not otherwise
+ called out by this name
+ in the specification, it captures the fact
+ that the xs:string value refers
+ to a batch artifact, across numerous
+ other JSL type definitions.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:restriction base="xs:string" />
+ </xs:simpleType>
+ <xs:complexType name="Job">
+ <xs:annotation>
+ <xs:documentation>
+The type of a job definition, whether concrete or
+Abstract. This is the type of the root element of any JSL document.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:sequence>
+ <xs:element name="properties" type="jsl:Properties"
+ minOccurs="0" maxOccurs="1">
+ <xs:annotation>
+ <xs:documentation>
+The job-level properties, which are accessible
+ via the JobContext.getProperties() API in a batch
+Artifact.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ <xs:element name="listeners" type="jsl:Listeners"
+ minOccurs="0" maxOccurs="1">
+ <xs:annotation>
+ <xs:documentation>
+ Note that "listeners" sequence order in XML does
+ not imply order of execution by
+The batch runtime, per the
+ specification.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="decision" type="jsl:Decision" />
+ <xs:element name="flow" type="jsl:Flow" />
+ <xs:element name="split" type="jsl:Split" />
+ <xs:element name="step" type="jsl:Step" />
+ </xs:choice>
+ </xs:sequence>
+ <xs:attribute name="version" use="required" type="xs:string"
+fixed="1.0" />
+ <xs:attribute name="id" use="required" type="xs:ID" />
+ <xs:attribute name="restartable" use="optional" type="xs:string" />
+ </xs:complexType>
+ <xs:element name="job" type="jsl:Job">
+ <xs:annotation>
+ <xs:documentation>
+The definition of an job, whether concrete or
+Abstract. This is the
+ type of the root element of any JSL document.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ <xs:complexType name="Listener">
+ <xs:sequence>
+ <xs:element name="properties" type="jsl:Properties"
+ minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ <xs:attribute name="ref" use="required" type="jsl:artifactRef" />
+ </xs:complexType>
+ <xs:complexType name="Split">
+ <xs:sequence>
+ <xs:element name="flow" type="jsl:Flow" minOccurs="0"
+maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="id" use="required" type="xs:ID" />
+ <xs:attribute name="next" use="optional" type="xs:string" />
+ </xs:complexType>
+ <xs:complexType name="Flow">
+ <xs:sequence>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="decision" type="jsl:Decision" />
+ <xs:element name="flow" type="jsl:Flow" />
+ <xs:element name="split" type="jsl:Split" />
+ <xs:element name="step" type="jsl:Step" />
+ </xs:choice>
+ <xs:group ref="jsl:TransitionElements" minOccurs="0"
+maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="id" use="required" type="xs:ID" />
+ <xs:attribute name="next" use="optional" type="xs:string" />
+ </xs:complexType>
+ <xs:group name="TransitionElements">
+ <xs:annotation>
+ <xs:documentation>
+ This grouping provides allows for the reuse of the
+ 'end', 'fail', 'next', 'stop' element sequences which
+ may appear at the end of a 'step', 'flow', 'split' or 'decision'.
+The term 'TransitionElements' does not formally appear in the spec, it
+is
+A schema convenience.
+ </xs:documentation>
+ </xs:annotation>
+ <xs:choice>
+ <xs:element name="end" type="jsl:End" />
+ <xs:element name="fail" type="jsl:Fail" />
+ <xs:element name="next" type="jsl:Next" />
+ <xs:element name="stop" type="jsl:Stop" />
+ </xs:choice>
+ </xs:group>
+ <xs:complexType name="Decision">
+ <xs:sequence>
+ <xs:element name="properties" type="jsl:Properties"
+ minOccurs="0" maxOccurs="1" />
+ <xs:group ref="jsl:TransitionElements" minOccurs="0"
+maxOccurs="unbounded"
+ />
+ </xs:sequence>
+ <xs:attribute name="id" use="required" type="xs:ID" />
+ <xs:attribute name="ref" use="required" type="jsl:artifactRef" />
+ </xs:complexType>
+ <xs:attributeGroup name="TerminatingAttributes">
+ <xs:attribute name="on" use="required" type="xs:string" />
+ <xs:attribute name="exit-status" use="optional" type="xs:string" />
+ </xs:attributeGroup>
+ <xs:complexType name="Fail">
+ <xs:attributeGroup ref="jsl:TerminatingAttributes" />
+ </xs:complexType>
+ <xs:complexType name="End">
+ <xs:attributeGroup ref="jsl:TerminatingAttributes" />
+ </xs:complexType>
+ <xs:complexType name="Stop">
+ <xs:attributeGroup ref="jsl:TerminatingAttributes" />
+ <xs:attribute name="restart" use="optional" type="xs:string" />
+ </xs:complexType>
+ <xs:complexType name="Next">
+ <xs:attribute name="on" use="required" type="xs:string" />
+ <xs:attribute name="to" use="required" type="xs:string" />
+ </xs:complexType>
+ <xs:complexType name="CheckpointAlgorithm">
+ <xs:sequence>
+ <xs:element name="properties" type="jsl:Properties"
+ minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ <xs:attribute name="ref" use="required" type="jsl:artifactRef" />
+ </xs:complexType>
+ <xs:complexType name="ExceptionClassFilter">
+ <xs:sequence>
+ <xs:element name="include" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence />
+ <xs:attribute name="class" use="required" type="xs:string" />
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="exclude" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence />
+ <xs:attribute name="class" use="required" type="xs:string" />
+</xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="Step">
+ <xs:sequence>
+ <xs:element name="properties" type="jsl:Properties" minOccurs="0"
+maxOccurs="1" />
+ <xs:element name="listeners" type="jsl:Listeners"
+ minOccurs="0" maxOccurs="1">
+ <xs:annotation>
+ <xs:documentation>
+ Note that "listeners" sequence order in XML does
+ not imply order of execution by
+The batch runtime, per the
+ specification.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:element>
+ <xs:choice minOccurs="0" maxOccurs="1">
+ <xs:element name="batchlet" type="jsl:Batchlet" />
+ <xs:element name="chunk" type="jsl:Chunk" />
+ </xs:choice>
+ <xs:element name="partition" type="jsl:Partition"
+ minOccurs="0" maxOccurs="1" />
+ <xs:group ref="jsl:TransitionElements"
+
+minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="id" use="required" type="xs:ID" />
+ <xs:attribute name="start-limit" use="optional" type="xs:string" />
+ <xs:attribute name="allow-start-if-complete" use="optional"
+ type="xs:string" />
+ <xs:attribute name="next" use="optional" type="xs:string" />
+ </xs:complexType>
+ <xs:complexType name="Batchlet">
+ <xs:sequence>
+ <xs:element name="properties" type="jsl:Properties"
+ minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ <xs:attribute name="ref" use="required" type="jsl:artifactRef" />
+</xs:complexType>
+ <xs:complexType name="Chunk">
+ <xs:sequence>
+ <xs:element name="reader" type="jsl:ItemReader" />
+ <xs:element name="processor" type="jsl:ItemProcessor"
+ minOccurs="0" maxOccurs="1" />
+ <xs:element name="writer" type="jsl:ItemWriter" />
+ <xs:element name="checkpoint-algorithm" type="jsl:CheckpointAlgorithm"
+minOccurs="0" maxOccurs="1" />
+ <xs:element name="skippable-exception-classes"
+type="jsl:ExceptionClassFilter" minOccurs="0" maxOccurs="1" />
+ <xs:element name="retryable-exception-classes"
+type="jsl:ExceptionClassFilter"
+ minOccurs="0" maxOccurs="1" />
+ <xs:element name="no-rollback-exception-classes"
+type="jsl:ExceptionClassFilter"
+ minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ <xs:attribute name="checkpoint-policy" use="optional"
+type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ Specifies the checkpoint policy that governs
+ commit behavior for this chunk.
+ Valid values are: "item" or
+ "custom". The "item" policy means the
+ chunk is checkpointed after a
+ specified number of items are
+ processed. The "custom" policy means
+The chunk is checkpointed
+According to a checkpoint algorithm
+ implementation. Specifying
+ "custom" requires that the
+ checkpoint-algorithm element is also
+ specified. It is an optional
+Attribute. The default policy is
+ "item". However, we chose not to define
+A schema-specified default for this attribute.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="item-count" use="optional" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ Specifies the number of items to process per chunk
+ when using the item
+ checkpoint policy. It must be valid XML integer.
+ It is an optional
+Attribute. The default is 10. The item-count
+Attribute is ignored
+ for "custom" checkpoint policy. However, to
+ make it easier for implementations to support JSL inheritance
+ we abstain from defining a schema-specified default for this
+Attribute.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="time-limit" use="optional" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ Specifies the amount of time in seconds before
+ taking a checkpoint for the
+ item checkpoint policy. It must be valid
+ XML integer. It is an
+ optional attribute. The default is 0, which
+ means no limit. However, to
+ make it easier for implementations to
+ support JSL inheritance
+ we abstain from defining a schema-specified
+ default for this attribute.
+ When a value greater than zero is
+ specified, a checkpoint is taken when
+ time-limit is reached or
+ item-count items have been processed,
+ whichever comes first. The
+ time-limit attribute is ignored for
+ "custom" checkpoint policy.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="skip-limit" use="optional" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ Specifies the number of exceptions a step will
+ skip if any configured
+ skippable exceptions are thrown by chunk
+ processing. It must be a
+ valid XML integer value. It is an optional
+Attribute. The default
+ is no limit.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ <xs:attribute name="retry-limit" use="optional" type="xs:string">
+ <xs:annotation>
+ <xs:documentation>
+ Specifies the number of times a step will retry if
+Any configured retryable
+ exceptions are thrown by chunk processing.
+ It must be a valid XML
+ integer value. It is an optional attribute.
+The default is no
+ limit.
+ </xs:documentation>
+ </xs:annotation>
+ </xs:attribute>
+ </xs:complexType>
+ <xs:complexType name="ItemReader">
+ <xs:sequence>
+ <xs:element name="properties" type="jsl:Properties"
+ minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ <xs:attribute name="ref" use="required" type="jsl:artifactRef" />
+ </xs:complexType>
+ <xs:complexType name="ItemProcessor">
+ <xs:sequence>
+ <xs:element name="properties" type="jsl:Properties"
+ minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ <xs:attribute name="ref" use="required" type="jsl:artifactRef" />
+ </xs:complexType>
+ <xs:complexType name="ItemWriter">
+ <xs:sequence>
+ <xs:element name="properties" type="jsl:Properties"
+ minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ <xs:attribute name="ref" use="required" type="jsl:artifactRef" />
+ </xs:complexType>
+ <xs:complexType name="Property">
+ <xs:attribute name="name" type="xs:string" use="required" />
+ <xs:attribute name="value" type="xs:string" use="required" />
+ </xs:complexType>
+ <xs:complexType name="Properties">
+ <xs:sequence>
+ <xs:element name="property" type="jsl:Property" maxOccurs="unbounded"
+minOccurs="0" />
+ </xs:sequence>
+ <xs:attribute name="partition" use="optional" type="xs:string" />
+ </xs:complexType>
+ <xs:complexType name="Listeners">
+ <xs:sequence>
+ <xs:element name="listener" type="jsl:Listener" maxOccurs="unbounded"
+minOccurs="0" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="Partition">
+ <xs:sequence>
+ <xs:choice minOccurs="0" maxOccurs="1">
+ <xs:element name="mapper" type="jsl:PartitionMapper" />
+ <xs:element name="plan" type="jsl:PartitionPlan" />
+ </xs:choice>
+ <xs:element name="collector" type="jsl:Collector"
+ minOccurs="0" maxOccurs="1" />
+ <xs:element name="analyzer" type="jsl:Analyzer" minOccurs="0"
+ maxOccurs="1" />
+ <xs:element name="reducer" type="jsl:PartitionReducer"
+ minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="PartitionPlan">
+ <xs:sequence>
+ <xs:element name="properties" type="jsl:Properties"
+ minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="partitions" use="optional" type="xs:string" />
+ <xs:attribute name="threads" use="optional" type="xs:string" />
+ </xs:complexType>
+ <xs:complexType name="PartitionMapper">
+ <xs:sequence>
+ <xs:element name="properties" type="jsl:Properties"
+ minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ <xs:attribute name="ref" use="required" type="jsl:artifactRef" />
+ </xs:complexType>
+ <xs:complexType name="Collector">
+ <xs:sequence>
+ <xs:element name="properties" type="jsl:Properties"
+ minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ <xs:attribute name="ref" use="required" type="jsl:artifactRef" />
+ </xs:complexType>
+ <xs:complexType name="Analyzer">
+ <xs:sequence>
+ <xs:element name="properties" type="jsl:Properties"
+ minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ <xs:attribute name="ref" use="required" type="jsl:artifactRef" />
+ </xs:complexType>
+ <xs:complexType name="PartitionReducer">
+ <xs:sequence>
+ <xs:element name="properties" type="jsl:Properties"
+ minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ <xs:attribute name="ref" use="required" type="jsl:artifactRef" />
+ </xs:complexType>
+ </xs:schema>
+
+
+
+
+
+
+

14. Credits

+
+
+

Section 7 Domain Language of Batch, was adapted from Spring Batch +Reference Documentation:

+
+ +
+
+
+

15. Change Log

+
+
+

15.1. Version 1.0 Revision A - Maintenance Release

+
+

15.1.1. Issues List

+
+

Following these links will show each original issue on our official spec +issues tracking list. In most cases the bug report contains the complete +text of the spec delta or addition, but not in every single case.

+
+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

5389

In Sec. 10.7.1, +should we have said we require a "no-arg" explicit or implicit +constructor rather than a "default constructor"

4827

SPEC: Misspoke on +collector role on exit status

5490

Clarify +JobContext/StepContext properties; fix TCK to not depend on writable +Properties

5431

ItemProcessListener#onProcessError has javadoc from +ItemProcessListener#afterProcess

5498

Add "mark FAILED" +to BatchStatus state transitions

5370

Spec is unclear +whether JobOperator methods may/must execute synchronously or not (with +TCK implications)

5583

CheckpointAlgorithm needs to specify timeunit (seconds) and other +javadoc fixes

5372

Evaluation order +of multiple transition elements

5691

"Looping" should +be clarified

5690

Flow/Split +transitioning & termination not fully defined

5374

Details of +exception handling (by container)

4830

8.6.1 Transition +Next Element

4865

SPEC Partition +Plan example confusing

5533

stop/end/fail +exit-status should affect job exit status, not step (as claimed in +spec).

5780

Spec should +clarify StepExecution values passed to Decider on a restart

5373

Co-existence of +transition elements with @next attribute PLUS behavior if no transition +element @on is matched

5375

Spec contradicts +itself when talking about uninitialized exit status (TCK assumes 'null')

4866

SPEC Partition +Properties example has a invalid tag

5746

@Inject +@BatchProperty should work for job level properties

5911

Clarify partition +restart processing, PartitionPlan properties, and persistent user data +for partitioned steps.

5873

Clarify when +CheckpointAlgorithm#beginCheckpoint is invoked

5919

Spec doesn’t fully +describe PartitionPlan override and the use of PartitionMapper

5875

When the first +readItem() in a chunk return 'null', is this a zero-item chunk or is +this not a new chunk after all

5403

Spec unclear on +skipping part of an Exception hierarchy

+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/spec/src/main/asciidoc/batch-spec.pdf b/spec/src/main/asciidoc/batch-spec.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d7fe8360de4bf043932873ae8695385c4a4efd6c GIT binary patch literal 2576141 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

6k3IIEkBz=_+j-ThkmmO%g@(IwOK`u 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�K^!u%>jASbh+u8O$w$Xat@O+XRok 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

Gr<@|khW5ScQ8W3Cap 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 $-<>8G+_0z;=}| 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

ffKVUtVG_(X3C5xD{JywZ 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 vjt8ZnSt)pTNY}x}Q3}Kg{H~@ZaNyuh=YxN4#s_ items) throws Exception; + /** + * The checkpointInfo method returns the current + * checkpoint data for this writer. It is + * called before a chunk checkpoint is committed. + * *@return* checkpoint data + * @throws Exception is thrown for any errors. + */ + public Serializable checkpointInfo() throws Exception; +} +---- + +[[app-listing.AbstractItemWriter.java]] +[source,java] +.AbstractItemWriter.java +---- +package javax.batch.api.chunk; +import java.io.Serializable; +import java.util.List; +/** +* The AbstractItemWriter provides default implementations +* of not commonly implemented methods. +*/ +public abstract class AbstractItemWriter implements ItemWriter +{ + /** + * Override this method if the ItemWriter requires + * any open time processing. + * The default implementation does nothing. + * + * @param last checkpoint for this ItemReader + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void open(Serializable checkpoint) throws Exception { + } + /** + * Override this method if the ItemWriter requires + * any close time processing. + * The default implementation does nothing. + * + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void close() throws Exception { + } + /** + * Implement write logic for the ItemWriter in this + * method. + * + * @param items specifies the list of items to write. + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public abstract void writeItems(List items) throws + Exception; + /** + * Override this method if the ItemWriter supports + * checkpoints. + * The default implementation returns null. + * + * *@return* checkpoint data + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public Serializable checkpointInfo() throws Exception { + return null; + } +} +---- + +===== CheckpointAlgorithm Interface + +A CheckpointAlgorithm implements a custom checkpoint policy for a chunk +step. The CheckpointAlgorithm interface may be used to implement an +CheckpointAlgorithm batch artifact: + +[[app-listing.CheckpointAlgorithm.java]] +[source,java] +.CheckpointAlgorithm.java +---- +package javax.batch.api.chunk; +/** +* CheckpointAlgorithm provides a custom checkpoint +* policy for chunk steps. +* +*/ +public interface CheckpointAlgorithm { + /** + * The checkpointTimeout is invoked at the beginning of a new + * checkpoint interval for the purpose of establishing the checkpoint + * timeout. + * It is invoked before the next chunk transaction begins. This + * method returns an integer value, which is the timeout value + * (expressed in seconds) which will be used for the next chunk + * transaction. + * This method is useful to automate the setting of the + * checkpoint timeout based on factors known outside the job + * definition. + * A value of '0' signifies no maximum established by this + * CheckpointAlgorithm, i.e. the maximum permissible timeout allowed by + * the runtime environment. + * @return the timeout interval (expressed in seconds) + * to use for the next checkpoint interval + * @throws Exception thrown for any errors. + */ + public int checkpointTimeout() throws Exception; + /** + * The beginCheckpoint method is invoked before the + * next checkpoint interval begins (before the next + * chunk transaction begins). + * @throws Exception thrown for any errors. + */ + public void beginCheckpoint() throws Exception; + /** + * The isReadyToCheckpoint method is invoked by + * the batch runtime after each item is processed + * to determine if now is the time to checkpoint + * the current chunk. + * *@return* boolean indicating whether or not + * to checkpoint now. + * @throws Exception thrown for any errors. + */ + public boolean isReadyToCheckpoint() throws Exception; + /** + * The endCheckpoint method is invoked after the + * last checkpoint is taken (after the chunk + * transaction is committed). + * @throws Exception thrown for any errors. + */ + public void endCheckpoint() throws Exception; +} +---- + +[[app-listing.AbstractCheckpointAlgorithm.java]] +[source,java] +.AbstractCheckpointAlgorithm.java +---- +package javax.batch.api.chunk; +/** +* The AbstractCheckpointAlgorithm provides default +* implementations of less commonly implemented +* methods. +*/ +public abstract class AbstractCheckpointAlgorithm implements +CheckpointAlgorithm { + /** + * Override this method if the CheckpointAlgorithm + * establishes a checkpoint timeout. + * The default implementation returns 0, which means + * the maximum permissible timeout allowed by the + * runtime environment. + * + * @return the timeout interval (expressed in seconds) + * to use for the next checkpoint interval + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public int checkpointTimeout() throws Exception { + return 0; + } + /** + * Override this method for the CheckpointAlgorithm + * to do something before a checkpoint interval + * begins (before the next chunk transaction begins). + * The default implementation does nothing. + * + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void beginCheckpoint() throws Exception { + } + /** + * Implement logic in this method + * to decide if a checkpoint should be taken now. + * + * *@return* boolean indicating whether or not + * to checkpoint now. + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public abstract boolean isReadyToCheckpoint() throws Exception; + /** + * Override this method for the CheckpointAlgorithm + * to do something after a checkpoint is taken (after + * the chunk transaction is committed). + * The default implementation does nothing. + * + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void endCheckpoint() throws Exception { + } +} +---- + +==== Batchlet Interface +A Batchlet-type step implements a roll your own batch pattern. This +batch pattern is invoked once, runs to completion, and returns an exit +status. + +The Batchlet interface may be used to implement a Batchlet batch +artifact: + +[[app-listing.Batchlet.java]] +[source,java] +.Batchlet.java +---- +package javax.batch.api; +/** +* +* A batchlet is type of batch step +* that can be used for any type of +* background processing that does not +* explicitly call for a chunk oriented +* approach. +*

+* A well-behaved batchlet responds +* to stop requests by implementing +* the stop method. +* +*/ +public interface Batchlet { + /** + * The process method does the work + * of the batchlet. If this method + * throws an exception, the batchlet + * step ends with a batch status of + * FAILED. + * *@return* exit status string + * @throws Exception if an error occurs. + */ + public String process() throws Exception; + /** + * The stop method is invoked by the batch + * runtime as part of JobOperator.stop() + * method processing. This method is invoked + * on a thread other than the thread on which + * the batchlet process method is running. + * + * @throws Exception if an error occurs. + */ + public void stop() throws Exception; +} +---- + +[[app-listing.AbstractBatchlet.java]] +[source,java] +.AbstractBatchlet.java +---- +package javax.batch.api; +/** +* The AbstractBatchlet provides default +* implementations of less commonly implemented methods. +*/ +public abstract class AbstractBatchlet implements Batchlet { + /** + * Implement process logic for the Batchlet in this + * method. + * + * *@return* exit status string + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public abstract String process() throws Exception; + /** + * Override this method if the Batchlet will + * end in response to the JobOperator.stop() + * operation. + * The default implementation does nothing. + * + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void stop() throws Exception { + } +} +---- + +TIP: A well designed batchlet stops gracefully when the JobOperator.stop operation is invoked. +See section xref:_stop_processing[11.13] for further information about stop processing. + +=== Listeners +Use Listeners to interpose on batch execution. + +==== JobListener Interface +A job listener receives control before and after a job execution runs, +and also if an exception is thrown during job processing. The +JobListener interface may be used to implement an JobListener batch +artifact: + +[[app-listing.JobListener.java]] +[source,java] +.JobListener.java +---- +package javax.batch.api.listener; +/** +* JobListener intercepts job execution. +* +*/ +public interface JobListener { + /** + * The beforeJob method receives control + * before the job execution begins. + * @throws Exception throw if an error occurs. + */ + public void beforeJob() throws Exception; + /** + * The afterJob method receives control + * after the job execution ends. + * @throws Exception throw if an error occurs. + */ + public void afterJob() throws Exception; +} +---- + +[[app-listing.AbstractJobListener.java]] +[source,java] +.AbstractJobListener.java +---- +package javax.batch.api.listener; +/** +* The AbstractJobListener provides default +* implementations of less commonly implemented methods. +*/ +public abstract class AbstractJobListener implements JobListener +{ + /** + * Override this method if the JobListener + * will do something before the job begins. + * The default implementation does nothing. + * + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void beforeJob() throws Exception { + } + /** + * Override this method if the JobListener + * will do something after the job ends. + * The default implementation does nothing. + * + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void afterJob() throws Exception { + } +} +---- + + +==== StepListener Interface +A step listener can receive control before and after a step runs, and +also if an exception is thrown during step processing. The StepListener +interface may be used to implement an StepListener batch artifact: + +[[app-listing.StepListener.java]] +[source,java] +.StepListener.java +---- +package javax.batch.api.listener; +/** +* StepListener intercepts step execution. +* +*/ +public interface StepListener { + /** + * The beforeStep method receives control + * before a step execution begins. + * @throws Exception throw if an error occurs. + */ + public void beforeStep() throws Exception; + /** + * The afterStep method receives control + * after a step execution ends. + * @throws Exception throw if an error occurs. + */ + public void afterStep() throws Exception; +} +---- + +[[app-listing.AbstractStepListener.java]] +[source,java] +.AbstractStepListener.java +---- +package javax.batch.api.listener; +/** +* The AbstractStepListener provides default +* implementations of less commonly implemented methods. +*/ +public abstract class AbstractStepListener implements +StepListener { + /** + * Override this method if the StepListener + * will do something before the step begins. + * The default implementation does nothing. + * + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void beforeStep() throws Exception { + } + /** + * Override this method if the StepListener + * will do something after the step ends. + * The default implementation does nothing. + * + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void afterStep() throws Exception { + } +} +---- + + +==== ChunkListener Interface +A chunk listener can receive control at the beginning and the end of +chunk, and upon an exception thrown back to the runtime implementation. +The ChunkListener interface may be used to implement a ChunkListener +batch artifact: + +[[app-listing.ChunkListener.java]] +[source,java] +.ChunkListener.java +---- +package javax.batch.api.chunk.listener; +/** +* ChunkListener intercepts chunk processing. +* +*/ +public interface ChunkListener { + /** + * The beforeChunk method receives control + * before processing of the next + * chunk begins. This method is invoked + * in the same transaction as the chunk + * processing. + * @throws Exception throw if an error occurs. + */ + public void beforeChunk() throws Exception; + /** + * The onError method receives control + * before the chunk transaction is rolled back. + * Note afterChunk is not invoked in this case. + * @param ex specifies the exception that + * caused the roll back. + * @throws Exception throw if an error occurs. + */ + public void onError(Exception ex) throws Exception; + /** + * The afterChunk method receives control + * after processing of the current + * chunk ends. This method is invoked + * in the same transaction as the chunk + * processing. + * @throws Exception throw if an error occurs. + */ + public void afterChunk() throws Exception; +} +---- + +[[app-listing.AbstractChunkListener.java]] +[source,java] +.AbstractChunkListener.java +---- +package javax.batch.api.chunk.listener; +/** +* The AbstractChunkListener provides default +* implementations of less commonly implemented methods. +*/ +public abstract class AbstractChunkListener implements +ChunkListener { + /** + * Override this method if the ChunkListener + * will do something before the chunk begins. + * The default implementation does nothing. + * + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void beforeChunk() throws Exception { + } + /** + * Override this method if the ChunkListener will do + * something before the chunk transaction is rolled back. + * Note afterChunk is not invoked in this case. + * @param ex specifies the exception that + * caused the roll back. + * @throws Exception (or subclass) throw if an error occurs. + */ + @Override + public void onError(Exception ex) throws Exception { + } + /** + * Override this method if the ChunkListener + * will do something after the chunk ends. + * The default implementation does nothing. + * + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void afterChunk() throws Exception { + } +} +---- + + +==== ItemReadListener Interface +An item read listener can receive control before and after an item is +read by an item reader, and also if the reader throws an exception. The +ItemReadListener interface may be used to implement an ItemReadListener +batch artifact: + +[[app-listing.ItemReadListener.java]] +[source,java] +.ItemReadListener.java +---- +package javax.batch.api.chunk.listener; +/** +* ItemReadListener intercepts item reader +* processing. +* +*/ +public interface ItemReadListener { + /** + * The beforeRead method receives control + * before an item reader is called to read the next item. + * @throws Exception is thrown if an error occurs. + */ + public void beforeRead() throws Exception; + /** + * The afterRead method receives control after an item + * reader reads an item. The method receives the item read as + * an input. + * @param item specifies the item read by the item reader. + * @throws Exception is thrown if an error occurs. + */ + public void afterRead(Object item) throws Exception; + /** + * The onReadError method receives control after an item reader + * throws an exception in the readItem method. + * This method receives the exception as an input. + * @param ex specifies the exception that occurred in the item reader. + * @throws Exception is thrown if an error occurs. + */ + public void onReadError(Exception ex) throws Exception; +} +---- + +[[app-listing.AbstractItemReadListener.java]] +[source,java] +.AbstractItemReadListener.java +---- +package javax.batch.api.chunk.listener; +/** +* The AbstractItemReadListener provides default +* implementations of less commonly implemented methods. +*/ +public abstract class AbstractItemReadListener implements +ItemReadListener { + /** + * Override this method if the ItemReadListener + * will do something before the item is read. + * The default implementation does nothing. + * + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void beforeRead() throws Exception { + } + /** + * Override this method if the ItemReadListener + * will do something after the item is read. + * The default implementation does nothing. + * + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void afterRead(Object item) throws Exception { + } + /** + * Override this method if the ItemReadListener + * will do something when the ItemReader readItem + * method throws an exception. + * The default implementation does nothing. + * + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void onReadError(Exception ex) throws Exception { + } +} +---- + + + +==== ItemProcessListener Interface +An item processor listener can receive control before and after an item +is processed by an item processor, and also if the processor throws an +exception. The ItemProcessListener interface may be used to implement an +ItemProcessListener batch artifact: + + +[[app-listing.ItemProcessListener.java]] +[source,java] +.ItemProcessListener.java +---- +package javax.batch.api.chunk.listener; +/** +* ItemProcessListener intercepts item processing. +* +*/ +public interface ItemProcessListener { + /** + * The beforeProcess method receives control before + * an item processor is called to process the next item. + * The method receives the item to be processed as an input. + * @param item specifies the item about to be processed. + * @throws Exception if an error occurs. + */ + public void beforeProcess(Object item) throws Exception; + /** + * The afterProcess method receives control after an item + * processor processes an item. The method receives the item processed + * and the result item as an input. + * @param item specifies the item processed by the item processor. + * @param result specifies the item to pass to the item writer. + * @throws Exception if an error occurs. + */ + public void afterProcess(Object item, Object result) throws + Exception; + /** + * The onProcessError method receives control after an + * item processor processItem throws an exception. The method + * receives the item sent to the item processor as input. + * @param item specifies the item the processor attempted to process. + * @param ex specifies the exception thrown by the item processor. + * @throws Exception if an error occurs + */ + public void onProcessError(Object item, Exception ex) throws + Exception; +} +---- + +[[app-listing.AbstractItemProcessListener.java]] +[source,java] +.AbstractItemProcessListener.java +---- +package javax.batch.api.chunk.listener; +/** +* The AbstractItemProcessListener provides default +* implementations of less commonly implemented methods. +* +*/ +public abstract class AbstractItemProcessListener implements +ItemProcessListener { + /** + * Override this method if the ItemProcessListener + * will do something before the item is processed. + * The default implementation does nothing. + * + * @param item specifies the item about to be processed. + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void beforeProcess(Object item) throws Exception { + } + /** + * Override this method if the ItemProcessListener + * will do something after the item is processed. + * The default implementation does nothing. + * + * @param item specifies the item about to be processed. + * @param result specifies the item to pass to the item writer. + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void afterProcess(Object item, Object result) throws + Exception { + } + /** + * Override this method if the ItemProcessListener + * will do something when the ItemProcessor processItem + * method throws an exception. + * The default implementation does nothing. + * + * @param item specifies the item about to be processed. + * @param ex specifies the exception thrown by the item processor. + * @throws Exception (or subclass) if an error occurs. + */ + @Override + public void onProcessError(Object item, Exception ex) throws + Exception { + } +} +---- + + + + +==== ItemWriteListener Interface +A item write listener can receive control before and after an item is +written by an item writer, and also if the writer throws an exception. +The ItemWriteListener interface may be used to implement an +ItemWriteListener batch artifact: + +[[app-listing.ItemWriteListener.java]] +[source,java] +.ItemWriteListener.java +---- +package javax.batch.api.chunk.listener; +import java.util.List; +/** +* ItemWriteListener intercepts item writer +* processing. +* +*/ +public interface ItemWriteListener { + /** + * The beforeWrite method receives control before + * an item writer is called to write its items. The + * method receives the list of items sent to the item + * writer as an input. + * @param items specifies the items about to be + * written. + * @throws Exception is thrown if an error occurs. + */ + public void beforeWrite(List items) throws Exception; + /** + * The afterWrite method receives control after an + * item writer writes its items. The method receives the + * list of items sent to the item writer as an input. + * @param items specifies the items written by the item writer. + * @throws Exception is thrown if an error occurs. + */ + public void afterWrite(List items) throws Exception; + /** + * The onWriteError method receives control after an + * item writer writeItems throws an exception. The method + * receives the list of items sent to the item writer as input. + * @param items specifies the items which the item writer + * attempted to write. + * @param ex specifies the exception thrown by the item + * writer. + * @throws Exception is thrown if an error occurs. + */ + public void onWriteError(List items, Exception ex) throws + Exception; +} +---- + +==== Skip Listener Interfaces +A skip listener can receive control when a skippable exception is +thrown from an item reader, processor, or writer. Three interfaces are +provided to implement these listeners: + +[[app-listing.SkipReadListener.java]] +[source,java] +.SkipReadListener.java +---- +package javax.batch.api.chunk.listener; +/** +* SkipReadListener intercepts skippable +* itemReader exception handling. +*/ +public interface SkipReadListener { + /** + * The onSkipReadItem method receives control + * when a skippable exception is thrown from an + * ItemReader readItem method. This method receives the + * exception as an input. + * @param ex specifies the exception thrown by the ItemReader. + * @throws Exception is thrown if an error occurs. + */ + public void onSkipReadItem(Exception ex) throws Exception; +} +---- + +[[app-listing.SkipProcessListener.java]] +[source,java] +.SkipProcessListener.java +---- +package javax.batch.api.chunk.listener; +/** +* SkipProcessListener intercepts skippable +* itemProcess exception handling. +*/ +public interface SkipProcessListener { + /** + * The onSkipProcessItem method receives control when + * a skippable exception is thrown from an ItemProcess + * processItem method. + * This method receives the exception and the item to process + * as an input. + * @param item specifies the item passed to the ItemProcessor. + * @param ex specifies the exception thrown by the + * ItemProcessor. + * @throws Exception is thrown if an error occurs. + */ + public void onSkipProcessItem(Object item, Exception ex) throws + Exception; +} +---- + +[[app-listing.SkipWriteListener.java]] +[source,java] +.SkipWriteListener.java +---- +package javax.batch.api.chunk.listener; +import java.util.List; +/** +* SkipWriteListener intercepts skippable +* itemWriter exception handling. +*/ +public interface SkipWriteListener { + /** + * The onSkipWriteItems method receives control when a + * skippable exception is thrown from an ItemWriter + * writeItems method. This + * method receives the exception and the items that were + * skipped as an input. + * @param items specifies the list of item passed to the + * item writer. + * @param ex specifies the exception thrown by the + * ItemWriter. + * @throws Exception is thrown if an error occurs. + */ + public void onSkipWriteItem(List items, Exception ex) + throws Exception; +} +---- + +==== RetryListener Interface + +A retry listener can receive control when a retryable exception is +thrown from an item reader, processor, or writer. Three interfaces are +provided to implement these listeners: + +[[app-listing.RetryReadListener.java]] +[source,java] +.RetryReadListener.java +---- +package javax.batch.api.chunk.listener; +/** +* RetryReadListener intercepts retry processing for +* an ItemReader. +*/ +public interface RetryReadListener { + /** + * The onRetryReadException method receives control + * when a retryable exception is thrown from an ItemReader + * readItem method. + * This method receives the exception as input. This method + * receives control in the same checkpoint scope as the + * ItemReader. If this method throws a an exception, the job + * ends in the FAILED state. + * @param ex specifies the exception thrown by the item + * reader. + * @throws Exception is thrown if an error occurs. + */ + public void onRetryReadException(Exception ex) throws Exception; +} +---- + +[[app-listing.RetryProcessListener.java]] +[source,java] +.RetryProcessListener.java +---- +package javax.batch.api.chunk.listener; +/** +* RetryProcessListener intercepts retry processing for +* an ItemProcessor. +* +*/ +public interface RetryProcessListener { + /** + * The onRetryProcessException method receives control + * when a retryable exception is thrown from an ItemProcessor + * processItem method. This method receives the exception and the item + * being processed as inputs. This method receives control in same + * checkpoint scope as the ItemProcessor. If this method + * throws a an exception, the job ends in the FAILED state. + * @param item specifies the item passed to the ItemProcessor. + * @param ex specifies the exception thrown by the ItemProcessor. + * @throws Exception is thrown if an error occurs. + */ + public void onRetryProcessException(Object item, Exception ex) + throws Exception; +} +---- + + +[[app-listing.RetryWriteListener.java]] +[source,java] +.RetryWriteListener.java +---- +package javax.batch.api.chunk.listener; +import java.util.List; +/** +* RetryWriteListener intercepts retry processing for +* an ItemWriter. +* +*/ +public interface RetryWriteListener { + /** + * The onRetryWriteException method receives control when a + * retryable exception is thrown from an ItemWriter writeItems + * method. This method receives the exception and the list of items + * being written as inputs. + * This method receives control in same checkpoint scope as the + * ItemWriter. If this method throws a an exception, the job ends + * in the FAILED state. + * @param items specify the items passed to an item writer. + * @param ex specifies the exception thrown by an item + * writer. + * @throws Exception is thrown if an error occurs. + */ + public void onRetryWriteException(List items, Exception ex) + throws Exception; +} +---- + +=== Batch Properties + +Batch applications need a way to receive parameters when a job is +initiated for execution. Properties can be defined by batch programming +model artifacts, then have values passed to them when a job is +initiated. Batch properties are string values. + +Note batch properties are visible only in the scope in which they are +defined (see Section xref:_scope_of_property_definitions_for_batchproperty[9.3.2]). However batch properties values can be +formed from other properties according to Job XML Substitution Rules. +See section xref:_job_xml_substitution[8.8] for further information on substitution. + +==== @BatchProperty + +The @BatchProperty annotation identifies a class field injection as a +batch property. A batch property has a name (name) and default value. +The @BatchProperty may be used on a class field for any class identified +as a batch programming model artifact -E.g. ItemReader, ItemProcessor, +JobListener, etc.. + +@BatchProperty must be used with the standard @Inject annotation +(javax.inject.Inject). @BatchProperty is used to assign batch artifact +property values from Job XML to the batch artifact itself. + +A field annotated with the @BatchProperty annotation must not be static +and must not be final. + +Note: the batch runtime must ensure @Inject works with @BatchProperty, +whether or not the execution environment includes an implementation of +JSR 299 or 330. This means the batch properties may always be injected. +Whether or not other injections are supported is dependent upon the +batch runtime implementation. + +Syntax: + +[[app-listing.batchProperty]] +[source,java] +---- + package: javax.batch.api + + @Inject @BatchProperty(name="") String ; +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +| |is the optional name of this batch property. The +default is the Java field name. + +| |is the field name of the batch property. +|======================================================================= + +[[app-listing.BatchProperty.java]] +[source,java] +.BatchProperty.java +---- +package javax.batch.api; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import javax.enterprise.util.Nonbinding; +import javax.inject.Qualifier; +/** +* Annotation used by batch artifacts to declare a +* field which is injectable via a JSL-defined value +* (possibly leveraging Job XML substitutions). +* +*/ +@Qualifier +@Target({ + ElementType._FIELD_, ElementType._METHOD_, + ElementType._PARAMETER_ +} +) +@Retention(RetentionPolicy._RUNTIME_) +public @interface BatchProperty { + @Nonbinding + public String name() default ""; +} +---- + +The value of the annotated field is assigned by the batch runtime if a +corresponding property element with a matching name is specified in the +JSL in the scope that applies to the batch artifact in question. If the +JSL property value resolves to the empty string (either explicitly set +to the empty string literal or resolving to an empty string via property +substitution – see section xref:_job_xml_substitution[8.8]), no assignment is made and the resulting +value is undefined by the batch specification. The resulting value might +simply be the Java default value, however using various dependency +injection technologies may produce different results. The resultant +behavior may be defined by the particular dependency injection +technology used in the runtime environment and so is outside the scope +of this specification. +Example: + +[[app-listing.BatchPropertySample]] +[source,java] +---- + import javax.inject.Inject; + import javax.batch.api.BatchProperty; + public class MyItemReaderImpl { + +@Inject @BatchProperty String fname; + +} +---- + +Behavior: + +When the batch runtime instantiates the batch artifact (item reader in +this example), it assigns the + +value of the property with name equal to fname provided in the job XML +to the corresponding @BatchProperty field named fname. If no value is +defined in JSL, the Java default (null) is assigned or some other +default is provided by a particular dependency injection technology. + +==== Scope of property definitions for @BatchProperty Injection + +The rules governing the definition of properties for injection via +@BatchProperty deserve some extra explanation and an example. + +For a given artifact, the only properties that are injectable via +@BatchProperty are those which are defined at the level of the artifact +itself (i.e. as children of the "properties" element which is in turn a +child of the very element defining the artifact: batchlet, reader, +listener, etc.). + +In particular, just because an artifact definition is contained (at some +level of nesting) within a job element and (for most artifacts) within a +step element as well, it is NOT the case that the job properties and +step properties are themselves injectable into that artifact via +@BatchProperty. This is the case even though these job and step +properties are available for resolving the artifact-level property +definitions via the jobProperties substitution mechanism (see section +8.8.1.2) . + +The following example should make this more clear: + +[[app-listing.BatchPropertyXML]] +[source,xml] +.Example JSL +---- + + + + ... + + + + + + +---- + +*Example Java (MyBatchlet from JSL above):* + +[[app-listing.BadBatchProperty]] +[source,java] +---- + // WONT WORK! - There is no property 'x' in scope for this injection + @Inject @BatchProperty(name="x"); + + // WILL WORK – Gets value 'xVal' + @Inject @BatchProperty(name="y"); +---- + +=== Batch Contexts + +Context objects are supplied by the batch runtime and provide important +functions to a batch application. Contexts provide information about the +running batch job, provide a place for a batch job to store interim +values, and provide a way for the batch application to communicate +important information back to the batch runtime. Contexts can be +injected into an application as member variables. There is a context for +both job and step. The job context represents the entire job. The step +context represents the current step executing within the job. + +==== Batch Contexts +Batch artifact access to batch contexts is by injection using the +standard @Inject annotation (javax.inject.Inject). A field into which a +batch context is injected must not be static and must not be final. +E.g.: + + @Inject JobContext _jctxt; + + @Inject StepContext _sctxt; + +The batch runtime is responsible to ensure the correct context object is +injected according to the job or step currently executing. + +Note: the batch runtime must ensure @Inject works with JobContext and +StepContext, whether or not the execution environment includes an +implementation of JSR 299 or 330. This means the batch contexts may +always be injected. Whether or not other injections are supported is +dependent upon the batch runtime implementation. + See section 10.9.1 for definition of JobContext class. See section +10.9.2 for definition of StepContext class. + +===== Batch Context Lifecycle and Scope + +A batch context has thread affinity and is visible only to the batch +artifacts executing on that particular thread. A batch context injected +field may be null when out of scope. Each context type has a distinct +scope and lifecycle as follows: + +1. JobContext + ++ +There is one JobContext per job execution. It exists for the life of a +job. There is a distinct JobContext for each sub-thread of a parallel +execution (e.g. partitioned step). + +2. StepContext + ++ +There is one StepContext per step execution. It exists for the life of +the step. For a partitioned step, there is one StepContext for the +parent step/thread; there is a distinct StepContext for each sub-thread +and each StepContext has its own distinct persistent user data for each +sub-thread. + +=== Parallelization + +Batch jobs may be configured to run some of their steps in parallel. +There are two supported parallelization models: + +. Partitioned: ++ +In the partitioned model, a step is configured to run as multiple +instances across multiple threads. Each thread runs the same step or +flow. This model is logically equivalent to launching multiple instances +of the same step. It is intended that each partition processes a +different range of the input items. ++ +The partitioned model includes several optional batch artifacts to +enable finer control over parallel processing: ++ +.. PartitionMapper provides a programmatic means for calculating the +number of partitions and unique properties for each. +.. PartitionReducer provides a unit of work demarcation around +partition processing. +.. PartitionCollector provides a means for merging interrim results +from individual partitions. +.. PartitionAnalyzer provides a means to gather interrim and final +results from individual partitions for single point of control +processing and decision making. + +. Concurrent: ++ +In the concurrent model, the flows defined by a split are configured to +run concurrently on multiple threads, one flow per thread. + +==== PartitionMapper Interface +A partition mapper receives control at the start of a partitioned +execution. The partition mapper is responsible to provide unique batch +properties for each partition. The PartitionMapper interface may be used +to implement a PartitionMapper batch artifact: + +[[app-listing.PartitionMapper.java]] +[source,java] +.PartitionMapper.java +---- +package javax.batch.api.partition; +import javax.batch.api.partition.PartitionPlan; +/** +* PartitionMapper receives control at the start of a partitioned +* execution. A PartitionMapper is responsible to provide unique +* batch properties for each partition. +* +*/ +public interface PartitionMapper { + /** + * The mapPartitions method that receives control at the + * start of partitioned step processing. The method + * returns a PartitionPlan, which specifies the batch properties + * for each partition. + * *@return* partition plan for a partitioned step. + * @throws Exception is thrown if an error occurs. + */ + public PartitionPlan mapPartitions( ) throws Exception; +} +---- + +See section 10.9.4 for details on the PartitionPlan result value type. + +The PartitionMapper, when defined, is invoked upon every execution, +including restarted executions. For a full discussion of the behavior on +restart, including how to override particular details of the +PartitionPlan built by the previous execution, see section xref:_batchruntime[10.8.5]. + +==== PartitionReducer Interface + +A partition reducer provides a unit of work demarcation across +partitions. It is not a JTA transaction; no resources are enlisted. +Rather, it provides transactional flow semantics to facilitate +finalizing merge or compensation logic. The PartitionReducer interface +may be used to implement an PartitionReducer batch artifact: + +[[app-listing.PartitionReducer.java]] +[source,java] +.PartitionReducer.java +---- +package javax.batch.api.partition; +/** +* PartitionReducer provides unit of work demarcation across +* partitions. It is not a JTA transaction; no resources are +* enlisted. Rather, it provides transactional flow semantics +* to facilitate finalizing merge or compensation logic. +* +*/ +public interface PartitionReducer { + public *enum* PartitionStatus { + COMMIT_, _ROLLBACK + } + /** + * The beginPartitionedStep method receives + * control at the start of partition processing. + * It receives control before the PartitionMapper + * is invoked and before any partitions are started. + * @throws Exception is thrown if an error occurs. + */ + public void beginPartitionedStep() throws Exception; + /** + * The beforePartitionedStepCompletion method + * receives control at the end of partitioned + * step processing. It receives control after all + * partitions have completed. It does not receive + * control if the PartitionReducer is rolling back. + * @throws Exception is thrown if an error occurs. + */ + public void beforePartitionedStepCompletion() throws Exception; + /** + * The rollbackPartitionedStep method receives + * control if the runtime is rolling back a partitioned + * step. Any partition threads still running are + * allowed to complete before this method is invoked. This method + * receives control if any of the following conditions + * are true: + *

+ *

    + *
  1. One or more partitions end with a Batch Status of + * STOPPED or FAILED.
  2. + *
  3. Any of the following partitioned step callbacks + * throw an exception:
  4. + *
      + *
    1. PartitionMapper
    2. + *
    3. PartitionReducer
    4. + *
    5. PartitionCollector
    6. + *
    7. PartitionAnalyzer
    8. + *
    + *
  5. A job with partitioned steps is restarted.
  6. + *
+ * @throws Exception is thrown if an error occurs. + */ + public void rollbackPartitionedStep() throws Exception; + /** + * The afterPartitionedStepCompletion method receives control + * at the end of a partition processing. It receives a status + * value that identifies the outcome of the partition processing. + * The status string value is either "COMMIT" or "ROLLBACK". + * @param status specifies the outcome of the partitioned step. Values + * are "COMMIT" or "ROLLBACK". + * @throws Exception is thrown if an error occurs. + */ + public void afterPartitionedStepCompletion(PartitionStatus status) + throws Exception; +} +---- + +[[app-listing.AbstractPartitionReducer.java]] +[source,java] +.AbstractPartitionReducer.java +---- +package javax.batch.api.partition; +/** +* The AbstractPartitionReducer provides default +* implementations of less commonly implemented methods. +*/ +public abstract class AbstractPartitionReducer implements +PartitionReducer { + /** + * Override this method to take action before + * partitioned step processing begins. + * + * @throws Exception is thrown if an error occurs. + */ + @Override + public void beginPartitionedStep() throws Exception { + } + /** + * Override this method to take action before + * normal partitioned step processing ends. + * + * @throws Exception is thrown if an error occurs. + */ + @Override + public void beforePartitionedStepCompletion() throws Exception { + } + /** + * Override this method to take action when a + * partitioned step is rolling back. + * + * @throws Exception is thrown if an error occurs. + */ + @Override + public void rollbackPartitionedStep() throws Exception { + } + /** + * Override this method to take action after + * partitioned step processing ends. + * + * @param status specifies the outcome of the partitioned step. + * Values are "COMMIT" or "ROLLBACK". + * @throws Exception is thrown if an error occurs. + */ + @Override + public void afterPartitionedStepCompletion(PartitionStatus status) + throws Exception { + } +} +---- + +==== PartitionCollector Interface + +A partition collector provides a way to send data from individual +partitions to a single point of control running on the parent thread. +The PartitionAnalyzer is used to receive and process this data. See +section xref:_partitionanalyzer_interface[9.5.4] for further information about the PartitionAnalyzer. The +PartitionCollector interface may be used to implement an +PartitionCollector batch artifact: + +[[app-listing.PartitionCollector.java]] +[source,java] +.PartitionCollector.java +---- +package javax.batch.api.partition; +import java.io.Serializable; +/** +* PartitionCollector provides a way to pass data from +* individual partitions to a single point of control running on +* the step's parent thread. The PartitionAnalyzer is used to +* receive and process this data. +* +*/ +public interface PartitionCollector { + /** + * The collectPartitionData method receives control + * periodically during partition processing. + * This method receives control on each thread processing + * a partition as follows: + *

+ *

    + *
  1. for a chunk type step, it receives control after + * every chunk checkpoint and then one last time at the + * end of the partition; +
  2. + *
  3. for a batchlet type step, it receives control once + * at the end of the batchlet.
  4. + *
+ *

+ * Note the collector is not called if the partition + * terminates due to an unhandled exception. + *

+ * *@return* an Serializable object to pass to the + * PartitionAnalyzer. + * @throws Exception is thrown if an error occurs. + */ + public Serializable collectPartitionData() throws Exception; +} +---- + +==== PartitionAnalyzer Interface + +A partition analyzer receives control to process data and final results +from partitions. If a partition collector is configured on the step, the +partition analyzer receives control to process the data and results from +the partition collector. While a separate partition collector instance +is invoked on each thread processing a partition, the partition analyzer +runs on a single, consistent thread each time it is invoked. The +PartitionAnalyzer interface may be used to implement an +PartitionAnalyzer batch artifact: + +[[app-listing.PartitionAnalyzer.java]] +[source,java] +.PartitionAnalyzer.java +---- +package javax.batch.api.partition; +import java.io.Serializable; +import javax.batch.runtime.BatchStatus; +/** +* PartitionAnalyzer receives control to process +* data and final results from each partition. If +* a PartitionCollector is configured on the step, +* the PartitionAnalyzer receives control to process +* the data and results from the partition collector. +* While a separate PartitionCollector instance is +* invoked on each thread processing a step partition, +* a single PartitionAnalyzer instance runs on a single, +* consistent thread each time it is invoked. +* +*/ +public interface PartitionAnalyzer { + /** + * The analyzeCollectorData method receives + * control each time a Partition collector sends + * its payload. It receives the + * Serializable object from the collector as an + * input. + * @param data specifies the payload sent by a + * PartitionCollector. + * @throws Exception is thrown if an error occurs. + */ + public void analyzeCollectorData(Serializable data) throws + Exception; + /** + * The analyzeStatus method receives control each time a + * partition ends. It receives the batch and exit + * status strings of the partition as inputs. + * @param batchStatus specifies the batch status of a partition. + * @param exitStatus specifies the exit status of a partition. + * @throws Exception is thrown if an error occurs. + */ + public void analyzeStatus(BatchStatus batchStatus, String + exitStatus) throws Exception; +} +---- + +[[app-listing.AbstractPartitionAnalyzer.java]] +[source,java] +.AbstractPartitionAnalyzer.java +---- +package javax.batch.api.partition; +import java.io.Serializable; +import javax.batch.runtime.BatchStatus; +/** +* The AbstractPartitionAnalyzer provides default +* implementations of less commonly implemented methods. +*/ +public abstract class AbstractPartitionAnalyzer implements +PartitionAnalyzer { + /** + * Override this method to analyze PartitionCollector payloads. + * + * @param data specifies the payload sent by the + * PartitionCollector. + * @throws Exception is thrown if an error occurs. + */ + @Override + public void analyzeCollectorData(Serializable data) throws + Exception { + } + /** + * Override this method to analyze partition end status. + * @param batchStatus specifies the batch status of a partition. + * @param exitStatus specifies the exit status of a partition. + * @throws Exception is thrown if an error occurs. + */ + @Override + public void analyzeStatus(BatchStatus batchStatus, String + exitStatus) + throws Exception { + } +} +---- + + +=== Decider Interface + +A decider may be used to determine batch exit status and sequencing +between steps, splits, and flows in a Job XML. The decider returns a +String value which becomes the exit status value on which the decision +chooses the next transition. The Decider interface may be used to +implement an Decider batch artifact: + +[[app-listing.Decider.java]] +[source,java] +.Decider.java +---- +package javax.batch.api; +import javax.batch.runtime.StepExecution; +/** +* A Decider receives control as part of a decision element +* in a job. It is used to direct execution flow during job +* processing. It returns an exit status that updates the +* current job execution's exit status. This exit status +* value also directs the execution transition based on +* next, end, stop, fail child elements configured on the +* same decision element as the decider. +*/ +public interface Decider { + /** + * The decide method sets a new exit status for a job. + * It receives an array of StepExecution objects as input. + * These StepExecution objects represent the execution + * element that transitions to this decider as follows: + *

+ *

    + *
  • Step
  • + *

    + * When the transition is from a step, the decide method + * receives the StepExecution corresponding + * to the step as input. + *

  • Split
  • + *

    + * When the transition is from a split, the decide method + * receives a StepExecution from each flow defined to the split + * as input. + *

  • Flow
  • + *

    + * When the transition is from a flow, the decide method + * receives a StepExecution corresponding + * to the last execution element that completed in the flow. + * This will be a single StepExecution if the last element + * was a step and multiple StepExecutions if the last element + * was a split. + *

+ * @param executions specifies the StepExecution(s) of the preceding + * element. + * *@return* updated job exit status + * @throws Exception is thrown if an error occurs. + */ + public String decide(StepExecution[] executions) throws Exception; +} +---- + + +=== Transactionality + +Chunk type check points are transactional. The batch runtime uses global +transaction mode on the Java EE platform and local transaction mode on +the Java SE platform. Global transaction timeout is configurable at +step-level with a step-level property: + +'javax.transaction.global.timeout={seconds} - default is 180 +seconds' + +Example: +[source,xml] +---- + + + + + +---- diff --git a/spec/src/main/asciidoc/batch_runtime_spec.adoc b/spec/src/main/asciidoc/batch_runtime_spec.adoc new file mode 100644 index 0000000..f21419d --- /dev/null +++ b/spec/src/main/asciidoc/batch_runtime_spec.adoc @@ -0,0 +1,1252 @@ +== Batch Runtime Specification + +=== Batch Properties Reserved Namespace +The batch runtime supports properties at job, step, partition, and artifact level. The property name prefix, 'javax.batch', is reserved for +use by the batch runtime, as prescribed by this specification and future +revisions of same. Applications and specification implementations must +not define properties for their own use that begin with this prefix. +Applications that do so risk undefined behavior. + +=== Job Metrics + +The batch runtime supports the following chunk-type step metrics: + +[arabic] +. readCount - the number of items successfully read. +. writeCount - the number of items successfully written. +. filterCount - the number of items filtered by ItemProcessor. +. commitCount - the number of transactions committed. +. rollbackCount - the number of transactions rolled back. +. readSkipCount - the number of skippable exceptions thrown by the ItemReader. +. processSkipCount - the number of skippable exceptions thrown by the ItemProcessor. +. writeSkipCount - the number of skippable exceptions thrown by the ItemWriter. + +These metrics are available through the StepExecution runtime object. +See section 10.9.10 for further information on StepExecution. + +=== Job Runtime Identifiers + +Job runtime artifacts are uniquely defined at runtime with the following +operational identifiers: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|instanceId |Is a long that represents an instance of a job. A new job +instance is created everytime a job is started with the JobOperator +"start" method. + +|executionId |Is a long that represents the next attempt to run a +particular job instance. A new execution is created the first time a job +is started and everytime thereafter when an existing job execution is +restarted with the JobOperator "restart" method. Note there can be no +more than one executionId in the STARTED state at one time for a given +job instance. + +|stepExecutionId |Is a long that represents the attempt to execute a +particular step within a job execution. +|======================================================================= + +Note instanceId, executionId, and stepExecutionId are all globally +unique values within a job repository. See section xref:_job_repository[7.4] for explanation +of job repository. + +=== JobOperator + +The JobOperator interface provides a set of operations to start, stop, +restart, and inspect jobs. See 10.9.6 for detailed description of this +interface. The JobOperator interface is accessible via a factory +pattern: + + JobOperator jobOper = BatchRuntime.getJobOperator(); + +See section 10.9.5 for details on the BatchRuntime class. + +=== Batch Artifact Loading + +All batch artifacts comprising a batch application are loadable by the +following loaders in the order specified: + +1. Implementation-specific loader + ++ +The batch runtime implementation _may_provide an +implementation-specific means by which batch artifacts references in a Job XML (i.e. via the 'ref=' attribute) are resolved to an implementation class and instantiated. When the batch runtime resolves a batch artifact reference to an instance the implementation-specific mechanism (if one exists) is attempted first. The loader must return an +instance or null. + ++ +An example of an implementation-specific loader might be CDI or Spring DI. +2. Archive loader + ++ +If an implementation-specific mechanism does not exist or fails toresolve a batch artifact reference (returns null), then the batch +runtime implementation must resolve the reference with an archive +loader. The implementation must provide an archive loader that resolves +the reference by looking up the reference in a `batch.xml` file, which +maps reference name to implementation class name. The loader must return +an instance or null. + ++ +The `batch.xml` file is packaged by the developer with the application under the '`META-INF`' directory ('`WEB-INF/classes/META-INF`' for .war files). + ++ +See xref:_job_parameters_on_restart[10.7.1] for more about the `batch.xml` file. + +3. Thread Context Class Loader + ++ +If the archive loader fails to resolve a batch artifact reference (returns null), then the batch runtime implementation must resolve the reference by treating the reference as a class name and loading it through the thread context class loader. The loader must return an instance or null. + +=== Job XML Loading + +Job XML is specified by name on the JobOperator.start command (see +10.9.6) to start a job. + +All Job XML references are loadable by the following loaders in the +order specified: + +1. implementation-specific loader + ++ +The batch runtime implementation _must_provide an implementation-specific means by which Job XML references are resolved to a Job XML document. + ++ +The purpose of an implementation-specific loader is to enable Job XMLloading from outside of the application archive, such as from a repository, file system, remote cache, or elsewhere. + +2. archive loader + ++ +If the implementation-specific mechanism does fails to resolve a Job XML reference, then the batch runtime implementation must resolve the reference with an archive loader. The implementation must provide an archive loader that resolves the reference by looking up the reference +from the `META-INF/batch-jobs` directory. + ++ +Job XML documents may be packaged by the developer with the application under the '`META-INF/batch-jobs`' directory ('`WEB-INF/classes/META-INF`/batch-jobs' for .war files). + ++ +See xref:_job_xml_substitution_during_restart[10.7.2] for more about the `META-INF/batch-jobs`. + +=== Application Packaging Model +The batch artifacts that comprise a batch application requiring no +unique packaging. They may be packaged in a standard jar file or can be +included inside any Java archive type, as supported by the target +execution platform in question.E.g. batch artifacts may be included in +wars, EJB jars, etc, so long as they exist in the class loader scope of +the program initiating the batch jobs (i.e. using the JobOperator start +method). + +==== `META-INF/batch.xml` + +A batch application may use the archive loader (see section xref:_job_xml_loading[10.5]) to +load batch artifacts. The application can direct artifact loading by +supplying an optional `batch.xml` file. The `batch.xml` file must be stored +under the `META-INF` directory. For .jar files it is the standard `META-INF` +directory. For .war files it is the `WEB-INF/classes/META-INF` directory. +The format and content of the `batch.xml` file follows: + +[source,xml] +---- + + + +---- +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +| |Specifies the reference name of the batch artifact. +This is the value that is specified on the ref= attribute of the Job +XML. + +| |Specifies the fully qualified class name of the +batch artifact implementation. +|======================================================================= +Notes: + +1. If an implementation-specific loader is used (see +xref:_job_xml_loading[10.5]) any artifact it loads takes precedence over artifacts specified in `batch.xml`. + +2. Use of `batch.xml` to load batch artifacts requires the +availability of a zero-argument constructor (either a default +constructor or an explicitly-defined, no-arg +constructor ). + +==== `META-INF/batch-jobs` + +A batch application may use the archive loader (see section xref:_application_packaging_model[10.6]) to +load Job XML documents. The application does this by storing the Job XML +documents under the `META-INF/batch-jobs` directory. For .jar files the +batch-jobs directory goes under the standard `META-INF` directory. For +.war files it goes under the `WEB-INF/classes/META-INF` directory. Note +Job XML documents are valid only in the batch-jobs directory: +sub-directories are ignored. +Job XML documents stored under `META-INF/batch-jobs` are named with the +convention ``.xml`,Where: +[width="100%",cols="<50%,<50%",] +|======================================================================= +| |Specifies the name of a Job XML. This is the value that is +specified on the JobOperator.start command. + +|.xml |Specifies required file type of a Job XML file under +`META-INF/batch-jobs`. +|======================================================================= +Note if an implementation-specific loader (see xref:_application_packaging_model[10.6]) loads a Job XML +document that document takes precedence over documents stored under +`META-INF/batch-jobs`. + +=== Restart Processing + +The JobOperator restart method is used to restart a JobExecution. A +JobExecution is eligible for restart if: + +* Its batch status is STOPPED or FAILED. +* It is the most recent JobExecution. + +==== Job Parameters on Restart + +Job parameter values are not remembered from one execution to the next. +All Job Parameter substitution during job restart is performed based +exclusively on the job parameters specified on that restart. + +==== Job XML Substitution during Restart + +See section 8.8.1.8 Job Restart Rule. + +==== Execution Sequence on Restart – Overview + +On the initial execution of a JobInstance, the sequence of execution is +essentially: + +[arabic] +. Start at initial execution element +. Execute the current execution element +. Either: +.. Transition to next execution element (and go to step 2. above) OR +.. Terminate execution + +On a restart, i.e. a subsequent execution of a JobInstance, the sequence +of execution is similar, but the batch implementation must, in addition, +determine which steps it does and does not need to re-execute. + +So on a restart, the sequence of execution looks like: + +[arabic] +. Start at restart position +. Decide whether or not to execute (or re-execute) the current execution element +. Either: +.. Transition to next execution element (and go to step 2. above) OR +.. Terminate execution + +So it follows that for restart we need: a definition of where in the job +definition to begin; rules for deciding whether or not to execute the +current execution element; and rules for performing transitioning, +especially taking into account that all steps relevant to transitioning +may not have executed on this (restart) execution. These rules are +provided below. + +==== Execution Sequence on Restart – Detailed Rules +Upon restart, the job is processed as follows: + +[arabic] +. Job XML Substitution is performed (see section xref:_job_xml_substitution[8.8]). +. Start by setting the current position to the restart position. The restart position is either: +.. the execution element identified by the elements "restart" +attribute if that is how the previous execution ended; else +.. the initial execution element determined the same as upon initial +job start, as described in section xref:_step_sequence[8.2.5] Step Sequence; +. Determine if the current execution element should re-execute: +.. If the current execution element is a COMPLETED step that specifies allow-restart-if-complete=false, then transition based on the exit status for this step from the previous completed execution. If the transition is a next transition, then repeat step 3 here with the value of next as the new, "current" execution element. Or, if the transition +is a terminating transition such as end, stop, or fail, then terminate +the restart execution accordingly. +.. If the current execution element is a COMPLETED step that specifies +allow-restart-if-complete=true, then re-run the step and transition +based on the new exit status from the new step execution. As above, +either repeat step 3 with the next execution element or terminate the +new execution as the transition element +.. If the current execution element is a +STOPPED or FAILED step then restart the step and transition based on the +exit status from the new step execution.+ ++ +Note if the step is a partitioned step, only the partitions that did not +complete previously are restarted. This behavior may be overridden via a +PartitionMapper (see section xref:_batchruntime[10.8.5]). Note +for a partitioned step, the checkpoints and persistent user data are +loaded from the persistent store on a per-partition basis (this is not a +new rule, but a fact implied by the discussion of checkpoints in section +xref:_step_partitioning[8.2.6] and the Step Context in section 9.4.1.1, which is summarized here +for convenience). +.. If the current execution element is a decision, execute the decision +(i.e. execute the Decider) unconditionally. The Deciders "decide" method +is passed a StepExecution array as a parameter. This array will be +populated with the most-recently completed StepExecution(s) for each +corresponding step.E.g. some StepExecution(s) may derive from previous +job executions and some from the current restart (execution). A single +decision following a split could even have a mix of old, new +StepExecution(s) in the same array. +.. If the current execution element is a flow, transition to the first +execution element in the flow and perform step 3 with this as the +current element. When restart processing of the flow has completed, then +follow the same rules which apply during the original execution (see +section xref:_transitioning_rules[8.9]) to transition at the flow level to the next execution +element, and repeat step 3 with that element as the current element. + ++ +Note the same rules regarding transitioning within a flow during an +original execution apply during restart processing as well. +.. If the current execution element is a split, proceed in parallel for +each flow in the split. For each flow, repeat step 3 with the flow +element as the current element. When all flows in the split have been +processed, follow the split's transition to the next execution element +and repeat step 3 with that element as the current element. + +==== PartitionMapper on Restart + +When the PartitionMapper is invoked at the beginning of a step which has +been executed within a previous job execution, the first and most +important decision for the mapper implementor to make is whether or not +to keep the previous partitions or to begin the new execution with new +partition definitions. + +This decision is communicated to the batch implementation via the +'partitionsOverride' property of the PartitionPlan built by the mapper, +i.e. the result of PartitionPlan's getPartitionsOverride() method. + +This property directs whether or not the partitions used in the previous +execution of this step will or will be used (i.e. the relevant data +carried forward and applied) within the current execution of this step. +(As a consequence, the value of this property has no real meaning when +the mapper is first called on the first execution of this step). + +===== partitionsOverride = False + +Three rules apply in the case where override is set to 'false': + +====== Number of Partitions Must Be Same + +The key idea here is that the mapper must build a partition plan with +the same number of partitions that were used in the previous execution +of this step. As a consequence, it is an error for the partition plan to +return (via getPartitions()) a different number than the number of +partitions established by the plan the last time this step was executed. + +====== Partition Properties Populated From Current Plan + +Though the number of partitions in the previous plan is persisted, the +Properties[] returned by the previous PartitionPlan's +getPartitionProperties() is not. On a new execution of this step, it is +the current return value of PartitionPlan#getPartitionProperties() which +is used to populate the pool of potential 'partitionPlan' substitutions +(see section 8.8.1.4). + +====== "Numbering" of Partitions via Partition Properties + +Upon execution of this step, the batch implementation will associate +each element of the Properties[] returned by +PartitionPlan#getPartitionProperties() with a single partition, in order +to potentially resolve 'partitionPlan' substitutions (see section +8.8.1.4) for a single partition. During the course of execution of each +partition, the batch implementation will capture data such as checkpoint +values, persistent user data, etc. + +Upon a new execution of this step during restart, the batch +implementation must ensure that a similar mapping occurs. That is, the +elements of the new Properties[] returned by the +PartitionPlan#getPartitionProperties() built by the mapper must be +mapped to the partitions in the same order as the earlier elements of +the earlier Properties[] were mapped (for resolving 'partitionPlan' +substitutions). + +E.g., the following must hold: + +Earlier Execution: +---- +partitionPlanProps[] = mapper.getPartitionPlan().getPartitionProperties(); + +partitionPlanProps[0] ---maps to---> partition leaving off at checkpoints R0, W0 + +partitionPlanProps[1] ---maps to---> partition leaving off at checkpoints R1, W1 +---- +Current Execution: +---- +newPartitionPlanProps[] = mapper.getPartitionPlan().getPartitionProperties(); + +newPartitionPlanProps[0] ---maps to---> partition resuming at checkpoints R0, W0 + +newPartitionPlanProps [1] ---maps to---> partition resuming at checkpoints R1, W1 +---- +In the shorthand above, "maps to" simply means that the Properties +object on the left is used to potentially resolve the 'partitionPlan' +substitutions for the give partition, before it executes as described. + +===== partitionsOverride = True + +In this case, all partition execution data: checkpoints, persistent user +data, etc. from the earlier execution are discarded, and the new +PartitionPlan built by the new execution of the PartitionMapper may +define either the same or a different number of partitions; the new P +artitionPlan's getPartitionProperties() return value will be used to +resolve 'partitionPlan' substitutions. + +=== Supporting Classes + +==== JobContext +[[app-listing.JobContext.java]] +[source,java] +.JobContext.java +---- +package javax.batch.runtime.context; +/** +* +* A JobContext provides information about the current +* job execution. +* +*/ +import java.util.Properties; +import javax.batch.runtime.BatchStatus; +public interface JobContext +{ + /** + * Get job name + * *@return* value of 'id' attribute from + */ + public String getJobName(); + /** + * The getTransientUserData method returns a transient data object + * belonging to the current Job XML execution element. + * *@return* user-specified type + */ + public Object getTransientUserData(); + /** + * The setTransientUserData method stores a transient data object into + * the current batch context. + * @param data is the user-specified type + */ + public void setTransientUserData(Object data); + /** + * The getInstanceId method returns the current job's instance + * id. + * *@return* job instance id + */ + public *long* getInstanceId(); + /** + * The getExecutionId method returns the current job's current + * execution id. + * *@return* job execution id + */ + public *long* getExecutionId(); + /** + * The getProperties method returns the job level properties + * specified in a job definition. + *

+ * A couple notes: + *

    + *
  • There is no guarantee that the same Properties object instance + * is always returned in the same (job) scope. + *
  • Besides the properties which are defined in JSL within a child + * < + properties> + element of a < + job> + element, the batch + * runtime implementation may choose to include additional, + * implementation-defined properties. + *
+ * + * *@return* job level properties + */ + public Properties getProperties(); + /** + * The getBatchStatus method simply returns the batch status value * set + by the batch runtime into the job context. + * *@return* batch status string + */ + public BatchStatus getBatchStatus(); + /** + * The getExitStatus method simply returns the exit status value stored + * into the job context through the setExitStatus method or null. + * *@return* exit status string + */ + public String getExitStatus(); + /** + * The setExitStatus method assigns the user-specified exit status for + * the current job. When the job ends, the exit status of the job is + * the value specified through setExitStatus. If setExitStatus was not + * called or was called with a null value, then the exit status + * defaults to the batch status of the job. + * @param status string + */ + public void setExitStatus(String status); +} +---- + +==== StepContext +[[app-listing.StepContext.java]] +[source,java] +.StepContext.java +---- +package javax.batch.runtime.context; +import java.io.Serializable; +import java.util.Properties; +import javax.batch.runtime.BatchStatus; +import javax.batch.runtime.Metric; +/** +* +* A StepContext provides information about the current step +* of a job execution. +* +*/ +public interface StepContext +{ + /** + * Get step name + * *@return* value of 'id' attribute from + * + */ + public String getStepName(); + /** + * The getTransientUserData method returns a transient data object + * belonging to the current Job XML execution element. + * *@return* user-specified type + */ + public Object getTransientUserData(); + /** + * The setTransientUserData method stores a transient data object into + * the current batch context. + * @param data is the user-specified type + */ + public void setTransientUserData(Object data); + /** + * The getStepExecutionId method returns the current step's + * execution id. + * *@return* step execution id + */ + public *long* getStepExecutionId(); + /** + * The getProperties method returns the step + level properties + * specified in a job definition. + *

+ * A couple notes: + *

    + *
  • There is no guarantee that the same Properties object instance + * is always returned in the same (step) scope. + *
  • Besides the properties which are defined in JSL within a child + * < + properties> + element of a < + step> + element, the batch + * runtime implementation may choose to include additional, + * implementation-defined properties. + *
+ * *@return* step level properties + */ + public Properties getProperties(); + /** + * The getPersistentUserData method returns a persistent data object + * belonging to the current step. The user data type must implement + * java.util.Serializable. This data is saved as part of a step's + * checkpoint. For a step that does not do checkpoints, it is saved + * after the step ends. It is available upon restart. + * *@return* user-specified type + */ + public Serializable getPersistentUserData(); + /** + * The setPersistentUserData method stores a persistent data object + * into the current step. The user data type must implement + * java.util.Serializable. This data is saved as part of a step's + * checkpoint. For a step that does not do checkpoints, it is saved + * after the step ends. It is available upon restart. + * @param data is the user-specified type + */ + public void setPersistentUserData(Serializable data); + /** + * The getBatchStatus method returns the current batch status of the + * current step. This value is set by the batch runtime and changes as + * the batch status changes. + * *@return* batch status string + */ + public BatchStatus getBatchStatus(); + /** + * The getExitStatus method simply returns the exit status value stored + * into the step context through the setExitStatus method or null. + * *@return* exit status string + */ + public String getExitStatus(); + /** + * The setExitStatus method assigns the user-specified exit status for + * the current step. When the step ends, the exit status of the step is + * the value specified through setExitStatus. If setExitStatus was not + * called or was called with a null value, then the exit status + * defaults to the batch status of the step. + * @param status string + */ + public void setExitStatus(String status); + /** + * The getException method returns the last exception thrown from a + * step level batch artifact to the batch runtime. + * *@return* the last exception + */ + public Exception getException(); + /** + * The getMetrics method returns an array of step level metrics. These + * are things like commits, skips, etc. + * *@see* javax.batch.runtime.metric.Metric for definition of standard + * metrics. + * *@return* metrics array + */ + public Metric[] getMetrics(); +} +---- + +==== Metric + +[[app-listing.Metric.Java]] +[source,java] +.Metric.java +---- +package javax.batch.runtime; +/** +* +* The Metric interface defines job metrics recorded by +* the batch runtime. +* +*/ +public interface Metric +{ + public *enum* MetricType + { + READ_COUNT_, _WRITE_COUNT_, + _COMMIT_COUNT_, + _ROLLBACK_COUNT_, _READ_SKIP_COUNT_, _PROCESS_SKIP_COUNT_, + _FILTER_COUNT_, + _WRITE_SKIPCOUNT + } + /** + * The getName method returns the metric type. + * *@return* metric type. + */ + public MetricType getType(); + /** + * The getValue method returns the metric value. + * *@return* metric value. + */ + public *long* getValue(); +} +---- + + +==== PartitionPlan +[[app-listing.PartitionPlan.java]] +[source,java] +.PartitionPlan.java +---- +package javax.batch.api.partition; +/** +* +* PartitionPlan is a helper class that carries partition processing +* information set by the *@PartitionMapper* method. +* +* A PartitionPlan contains: +*
    +*
  1. number of partition instances
  2. +*
  3. number of threads on which to execute the partitions
  4. +*
  5. substitution properties for each Partition (which can be +* referenced using the # +{ + partitionPlan['propertyName'] +} + +* syntax.
  6. +*
+*/ +import java.util.Properties; +public interface PartitionPlan +{ + /** + * Set number of partitions. + * @param count specifies the partition count + */ + public void setPartitions(int count); + /** + * Specify whether or not to override the partition + * count from the previous job execution. This applies + * only to step restart . + *

+ * When false is specified, the + * partition count from the previous job execution is used + * and any new value set for partition count in the current run + * is ignored. In addition, partition results from the previous + * job execution are remembered, and only incomplete partitions + * are reprocessed. + *

+ * When true is specified, the partition count from the current run + * is used and all results from past partitions are discarded. Any + * resource cleanup or back out of work done in the previous run is the + * responsibility of the application. The PartitionReducer artifact's + * rollbackPartitionedStep method is invoked during restart before any + * partitions begin processing to provide a cleanup hook. + */ + public void setPartitionsOverride(boolean override); + /** + * Return current value of partition override setting. + * *@return* override setting. + */ + public boolean getPartitionsOverride(); + /** + * Set maximum number of threads requested to use to run + * partitions for this step. A value of '0' requests the batch + * implementation to use the partition count as the thread + * count. Note the batch runtime is not required to use + * this full number of threads; + it may not have this many + * available, and may use less. + * + * @param count specifies the requested thread count + */ + public void setThreads(int count); + /** + * Sets array of substitution Properties objects for the set of + Partitions. + * @param props specifies the Properties object array + * @see PartitionPlan#getPartitionProperties() + */ + public void setPartitionProperties(Properties[] props); + /** + * Gets count of Partitions. + * *@return* Partition count + */ + public int getPartitions(); + /** + * Gets maximum number of threads requested to use to run + * partitions for this step. A value of '0' requests the batch + * implementation to use the partition count as the thread + * count. Note the batch runtime is not required to use + * this full number of threads; + it may not have this many + * available, and may use less. + * + * *@return* requested thread count + */ + public int getThreads(); + /** + * Gets array of Partition Properties objects for Partitions. + *

+ * These can be used in Job XML substitution using + * substitution expressions with the syntax: + * # + { + partitionPlan['propertyName'] + } + + *

+ * Each element of the Properties array returned can + * be used to resolving substitutions for a single partition. + * In the typical use case, each Properties element will + * have a similar set of property names, with a + * substitution potentially resolving to the corresponding + * value for each partition. + * + * *@return* Partition Properties object array + */ + public Properties[] + getPartitionProperties(); +} +---- + + + +[[app-listing.PartitionPlanImpl.java]] +[source,java] +.PartitionPlanImpl.java +---- +package javax.batch.api.partition; +import java.util.Properties; +/** +* The PartitionPlanImpl class provides a basic implementation +* of the PartitionPlan interface. +*/ +public class PartitionPlanImpl implements PartitionPlan +{ + *private* int partitions= 0; + *private* boolean override= *false*; + *private* int threads= 0; + Properties[] partitionProperties= null; + @Override + public void setPartitions(int count) + { + partitions= count; + // default thread count to partition count + *if* (threads == 0) threads= count; + } + @Override + public void setThreads(int count) + { + threads= count; + } + @Override + public void setPartitionsOverride(boolean override) + { + *this*.override= override; + } + @Override + public boolean getPartitionsOverride() + { + return override; + } + @Override + public void setPartitionProperties(Properties[] props) + { + partitionProperties= props; + } + @Override + public int getPartitions() + { + return partitions; + } + @Override + public int getThreads() + { + return threads; + } + @Override + public Properties[] getPartitionProperties() + { + return partitionProperties; + } +} +---- + +==== BatchRuntime + +[[app-listing.BatchRuntime.java]] +[source,java] +.BatchRuntime.java +---- +package javax.batch.runtime; +/** +* The BatchRuntime represents the batch +* runtime environment. +* +*/ +import javax.batch.operations.JobOperator; +/** +* BatchRuntime represents the JSR 352 Batch Runtime. +* It provides factory access to the JobOperator interface. +* +*/ +public class BatchRuntime +{ + /** + * The getJobOperator factory method returns + * an instance of the JobOperator interface. + * *@return* JobOperator instance. + */ + public *static* JobOperator getJobOperator() + { + return null; + } +} +---- + + +==== BatchStatus +[[app-listing.BatchStatus.java]] +[source,java] +.BatchStatus.java +---- +package javax.batch.runtime; + +/** +* BatchStatus enum defines the batch status values +* possible for a job. +* +*/ +public enum BatchStatus +{ + STARTING_, _STARTED_, _STOPPING_, + _STOPPED_, _FAILED_, _COMPLETED_, _ABANDONED_ +} +---- + +==== JobOperator +[[app-listing.JobOperator.java]] +[source,java] +.JobOperator.java +---- +package javax.batch.operations; +import java.util.List; +import java.util.Set; +import java.util.Properties; +import javax.batch.runtime.JobExecution; +import javax.batch.runtime.JobInstance; +import javax.batch.runtime.StepExecution; +/** +* JobOperator provide the interface for operating on batch jobs. +* Through the JobOperator a program can start, stop, and restart jobs. +* It can additionally inspect job history, to discover what jobs +* are currently running and what jobs have previously run. +* +* The JobOperator interface imposes no security constraints. However, +* the implementer is free to limit JobOperator methods with a security +* scheme of its choice. The implementer should terminate any method +* that is limited by the security scheme with a JobSecurityException. +* +*/ +public interface JobOperator +{ + /** + * Returns a set of all job names known to the batch runtime. + * + * *@return* a set of job names. + * @throws JobSecurityException + */ + public Set getJobNames() throws JobSecurityException; + /** + * Returns number of instances of a job with a particular name. + * + * @param jobName + * specifies the name of the job. + * *@return* count of instances of the named job. + * @throws NoSuchJobException + * @throws JobSecurityException + */ + public int getJobInstanceCount(String jobName) throws + NoSuchJobException, + JobSecurityException; + /** + * Returns all JobInstances belonging to a job with a particular name + * in reverse chronological order. + * + * @param jobName + * specifies the job name. + * @param start + * specifies the relative starting number (zero based) to + * return from the + * maximal list of job instances. + * @param count + * specifies the number of job instances to return from the + * starting position of the maximal list of job instances. + * *@return* list of JobInstances. + * @throws NoSuchJobException + * @throws JobSecurityException + */ + public List getJobInstances(String jobName, int start, + int count)throws NoSuchJobException, JobSecurityException; + /** + * Returns execution ids for job instances with the specified + * name that have running executions. + * + * @param jobName + * specifies the job name. + * *@return* a list of execution ids. + * @throws NoSuchJobException + * @throws JobSecurityException + */ + public List getRunningExecutions(String jobName) throws + NoSuchJobException, JobSecurityException; + /** + * Returns job parameters for a specified job instance. These are the + * key/value pairs specified when the instance was originally created + * by the start method. + * + * @param executionId + * specifies the execution from which to retrieve the + * parameters. + * *@return* a Properties object containing the key/value job parameter + * pairs. + * @throws NoSuchJobExecutionException + * @throws JobSecurityException + */ + public Properties getParameters(*long* executionId) + throws NoSuchJobExecutionException, JobSecurityException; + /** + * Creates a new job instance and starts the first execution of that + * instance, which executes asynchronously. + * + * Note the Job XML describing the job is first searched for by name + * according to a means prescribed by the batch runtime implementation. + * This may vary by implementation. If the Job XML is not found by that + * means, then the batch runtime must search for the specified Job XML + * as a resource from the `META-INF/batch-jobs` directory based on the + * current class loader. Job XML files under `META-INF/batch-jobs` + * directory follow a naming convention of "name".xml where "name" is + * the value of the jobXMLName parameter (see below). + * + * @param jobXMLName + * specifies the name of the Job XML describing the job. + * @param jobParameters + * specifies the keyword/value pairs for attribute + * substitution in the Job XML. + * *@return* executionId for the job execution. + * @throws JobStartException + * @throws JobSecurityException + */ + public *long* start(String jobXMLName, Properties jobParameters) + throws + JobStartException, JobSecurityException; + /** + * Restarts a failed or stopped job instance, which executes + * asynchronously. + * + * @param executionId + * specifies the execution to to restart. This execution + * must be the most recent execution that ran. + * @param restartParameters + * specifies the keyword/value pairs for attribute + * substitution in the Job XML. + * *@return* new executionId + * @throws JobExecutionAlreadyCompleteException + * @throws NoSuchJobExecutionException + * @throws JobExecutionNotMostRecentException, + * @throws JobRestartException + * @throws JobSecurityException + */ + public *long* restart(*long* executionId, Properties + restartParameters) + throws JobExecutionAlreadyCompleteException, + NoSuchJobExecutionException, + JobExecutionNotMostRecentException, + JobRestartException, + JobSecurityException; + /** + * Request a running job execution stops. This + * method notifies the job execution to stop + * and then returns. The job execution normally + * stops and does so asynchronously. Note + * JobOperator cannot guarantee the jobs stops: + * it is possible a badly behaved batch application + * does not relinquish control. + *

+ * Note for partitioned batchlet steps the Batchlet + * stop method is invoked on each thread actively + * processing a partition. + * + * @param executionId + * specifies the job execution to stop. + * The job execution must be running. + * @throws NoSuchJobExecutionException + * @throws JobExecutionNotRunningException + * @throws JobSecurityException + */ + public void stop(*long* executionId) throws + NoSuchJobExecutionException, + JobExecutionNotRunningException, JobSecurityException; + /** + * Set batch status to ABANDONED. The instance must have + * no running execution. + *

+ * Note that ABANDONED executions cannot be restarted. + * + * @param executionId + * specifies the job execution to abandon. + * @throws NoSuchJobExecutionException + * @throws JobExecutionIsRunningException + * @throws JobSecurityException + */ + public void abandon(*long* executionId) throws + NoSuchJobExecutionException, + JobExecutionIsRunningException, JobSecurityException; + /** + * Return the job instance for the specified execution id. + * + * @param executionId + * specifies the job execution. + * *@return* job instance + * @throws NoSuchJobExecutionException + * @throws JobSecurityException + */ + public JobInstance getJobInstance(*long* executionId) throws + NoSuchJobExecutionException, JobSecurityException; + /** + * Return all job executions belonging to the specified job instance. + * + * @param jobInstance + * specifies the job instance. + * *@return* list of job executions + * @throws NoSuchJobInstanceException + * @throws JobSecurityException + */ + public List getJobExecutions(JobInstance instance) + throws + NoSuchJobInstanceException, JobSecurityException; + /** + * Return job execution for specified execution id + * + * @param executionId + * specifies the job execution. + * *@return* job execution + * @throws NoSuchJobExecutionException + * @throws JobSecurityException + */ + public JobExecution getJobExecution(*long* executionId) throws + NoSuchJobExecutionException, JobSecurityException; + /** + * Return StepExecutions for specified execution id. + * + * @param executionId + * specifies the job execution. + * *@return* step executions (order not guaranteed) + * @throws NoSuchJobExecutionException + * @throws JobSecurityException + */ + public List getStepExecutions(*long* jobExecutionId) + throws NoSuchJobExecutionException, JobSecurityException; +} +---- + +==== JobInstance +[[app-listing.JobInstance.java]] +[source,java] +.JobInstance.java +---- +package javax.batch.runtime; +public interface JobInstance +{ + /** + * Get unique id for this JobInstance. + * *@return* instance id + */ + public *long* getInstanceId(); + /** + * Get job name. + * *@return* value of 'id' attribute from + */ + public String getJobName(); +} +---- + +==== JobExecution + +[[app-listing.JobExecution.java]] +[source,java] +.JobExecution.java +---- +package javax.batch.runtime; +import java.util.Date; +import java.util.Properties; +public interface JobExecution +{ + /** + * Get unique id for this JobExecution. + * *@return* execution id + */ + public *long* getExecutionId(); + /** + * Get job name. + * *@return* value of 'id' attribute from + */ + public String getJobName(); + /** + * Get batch status of this execution. + * *@return* batch status value. + */ + public BatchStatus getBatchStatus(); + /** + * Get time execution entered STARTED status. + * *@return* date (time) + */ + public Date getStartTime(); + /** + * Get time execution entered end status: COMPLETED, STOPPED, FAILED + * *@return* date (time) + */ + public Date getEndTime(); + /** + * Get execution exit status. + * *@return* exit status. + */ + public String getExitStatus(); + /** + * Get time execution was created. + * *@return* date (time) + */ + public Date getCreateTime(); + /** + * Get time execution was last updated. + * *@return* date (time) + */ + public Date getLastUpdatedTime(); + /** + * Get job parameters for this execution. + * *@return* job parameters + */ + public Properties getJobParameters(); +} +---- + +==== StepExecution + +[[app-listing.StepExecution.java]] +[source,java] +.StepExecution.java +---- +package javax.batch.runtime; +import java.util.Date; +import java.io.Serializable; +public interface StepExecution +{ + /** + * Get unique id for this StepExecution. + * *@return* StepExecution id + */ + public *long* getStepExecutionId(); + /** + * Get step name. + * *@return* value of 'id' attribute from + */ + public String getStepName(); + /** + * Get batch status of this step execution. + * *@return* batch status. + */ + public BatchStatus getBatchStatus(); + /** + * Get time this step started. + * *@return* date (time) + */ + public Date getStartTime(); + /** + * Get time this step ended. + * *@return* date (time) + */ + public Date getEndTime(); + /** + * Get exit status of step. + * *@return* exit status + */ + public String getExitStatus(); + /** + * Get persistent user data. + *

+ * For a partitioned step, this returns + * the persistent user data of the + * StepContext of the "top-level" + * or main thread (the one the PartitionAnalyzer, etc. + * execute on). It does not return the persistent user + * data of the partition threads. + * *@return* persistent data + */ + public Serializable + getPersistentUserData (); + /** + * Get step metrics + * *@return* array of metrics + */ + public Metric[] getMetrics(); +} +---- + +==== Batch Exception Classes + +This specification defines batch exception classes in package +javax.batch.operations. Note all batch exceptions are direct subclasses +of base class BatchRuntimeException, which itself is a direct subclass +of java.lang.RuntimeException. The following batch exception classes are +defined: + +1. JobExecutionAlreadyCompleteException + +2. JobExecutionIsRunningException + +3. JobExecutionNotMostRecentException + +4. JobExecutionNotRunningException + +5. JobRestartException + +6. JobSecurityException + +7. JobStartException + +8. NoSuchJobException + +9. NoSuchJobExecutionException + +10. NoSuchJobInstanceException diff --git a/spec/src/main/asciidoc/batch_xml_xsd.adoc b/spec/src/main/asciidoc/batch_xml_xsd.adoc new file mode 100644 index 0000000..5cb84bb --- /dev/null +++ b/spec/src/main/asciidoc/batch_xml_xsd.adoc @@ -0,0 +1,23 @@ +== Batch XML XSD + +[[app-listing.batch_xml_xsd]] +[source,xml] +---- + + + + + + + + + + + + + +---- diff --git a/spec/src/main/asciidoc/domain_language.adoc b/spec/src/main/asciidoc/domain_language.adoc new file mode 100644 index 0000000..5712193 --- /dev/null +++ b/spec/src/main/asciidoc/domain_language.adoc @@ -0,0 +1,194 @@ +== Domain Language of Batch +To any experienced batch architect, the overall concepts of batch +processing used by JSR 352 should be familiar and comfortable. There are +"Jobs" and "Steps" and developer supplied processing units called +ItemReaders and ItemWriters. However, because of the JSR 352 operations, +callbacks, and idioms, there are opportunities for the following: + +[loweralpha] +. significant improvement in adherence to a clear separation of +concerns +. clearly delineated architectural layers and services provided as +interfaces +. significantly enhanced extensibility + +The diagram below is a simplified version of the batch reference +architecture that has been used for decades. It provides an overview of +the components that make up the domain language of batch processing. +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. JSR 352 specifies the layers, components and +technical services commonly found in robust, maintainable systems used +to address the creation of simple to complex batch applications. + +image::images/image003.png[image] + +The diagram above highlights the key concepts that make up the domain +language of batch. A Job has one to many steps, which has no more than +one ItemReader, ItemProcessor, and ItemWriter. A job needs to be +launched (JobOperator), and meta data about the currently running +process needs to be stored (JobRepository). + +=== Job +A Job is an entity that encapsulates an entire batch process. A Job +will be wired together via a Job Specification Language. However, Job is +just the top of an overall hierarchy: + +image::images/image005.png[http://static.springsource.org/spring-batch/trunk/reference/html-single/images/job-heirarchy.png] + +With JSR 352, 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: + +1. The simple name of the job + +2. Definition and ordering of Steps + +3. Whether or not the job is restartable + +==== 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 is still +the January 1st run. Usually this corresponds with the data it is +processing as well, meaning the January 1st run processes data for +January 1st, etc. Therefore, each JobInstance can have multiple +executions (JobExecution is discussed in more detail below); one or many +JobInstances corresponding to a particular Job can be running at a given +time. + +The definition of a JobInstance has absolutely no bearing on the data +that 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' from previous executions will be available to +the new run. Using a new JobInstance will mean 'start from the +beginning' and using an existing instance will generally mean 'start +from where you left off'. + +==== JobParameters +Job parameters can be specified each time a job is started or restarted. +Job parameters are keyword/value string pairs. The JobOperator start and +restart operations support the specification of job parameters. See +section xref:_joboperator_2[10.4] for further details on JobOperator. + +==== JobExecution +A JobExecution refers to the technical concept of a single attempt to +run a Job. Each time a job is started or restarted, a new JobExecution +is created, belonging to the same JobInstance. + +=== Step +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 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 it. 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. As with Job, a Step +has an individual StepExecution that corresponds with a unique +JobExecution: + +image::images/image007.png[http://static.springsource.org/spring-batch/trunk/reference/html-single/images/jobHeirarchyWithSteps.png] + +==== 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 its Step is actually started. + +=== JobOperator +JobOperator provides an interface to manage all aspects of job +processing, including operational commands, such as start, restart, and +stop, as well as job repository related commands, such as retrieval of +job and step executions. See section xref:_joboperator_2[10.4] for more details about +JobOperator. + +=== Job Repository +A job repository holds information about jobs currently running and +jobs that have run in the past. The JobOperator interface provides +access to this repository. The repository contains job instances, job +executions, and step executions. For further information on this +content, see sections 10.9.8, 10.9.9, 10.9.10, respectively. + +Note the implementation of the job repository is outside the scope of +this specification. + +=== ItemReader + +ItemReader is an abstraction that represents the retrieval of input for +a Step, one item at a time. An ItemReader provides an indicator when it +has exhausted the items it can supply. See section 9.1.1.1 for more +details about ItemReaders. + +=== ItemWriter + +ItemWriter is an abstraction that represents the output of a Step, one +batch or chunk of items 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. See section 9.1.1.3 for more details +about ItemWriters. + +=== ItemProcessor + +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. See section 9.1.1.2 for more details about +ItemProcessors. + +=== Chunk-oriented Processing + +JSR 352 specifies a 'Chunk Oriented' processing style as its primary +pattern. Chunk oriented processing refers to reading the data one item +at a time, and creating 'chunks' that will be written out, within a +transaction boundary. One item is read in from an ItemReader, handed to +an ItemProcessor, and aggregated. Once the number of items read equals +the commit interval, the entire chunk is written out via the ItemWriter, +and then the transaction is committed. + +image::images/image009.png[http://static.springsource.org/spring-batch/trunk/reference/html-single/images/chunk-oriented-processing.png] + +=== Batch Checkpoints + +For data intensive batch applications - particularly those that may run +for long periods of time - checkpoint/restart is a common design +requirement. Checkpoints allow a step execution to periodically bookmark +its current progress to enable restart from the last point of +consistency, following a planned or unplanned interruption. + +Checkpoints work naturally with chunk-oriented processing. The end of +processing for each chunk is a natural point for taking a checkpoint. + +JSR 352 specifies runtime support for checkpoint/restart in a generic +way that can be exploited by any chunk-oriented batch step that has this +requirement. + +Since progress during a step execution is really a function of the +current position of the input/output data, natural placement of function +suggests the knowledge for saving/restoring current position is a +reader/writer responsibility. + +Since managing step execution is a runtime responsibility, the batch +runtime must necessarily understand step execution lifecycle, including +initial start, execution end states, and restart. + +Since checkpoint frequency has a direct effect on lock hold times, for +lockable resources, tuning checkpoint interval size can have a direct +bearing on overall system throughput. diff --git a/spec/src/main/asciidoc/forward.adoc b/spec/src/main/asciidoc/forward.adoc new file mode 100644 index 0000000..c804ec9 --- /dev/null +++ b/spec/src/main/asciidoc/forward.adoc @@ -0,0 +1,2 @@ +== Foreword +This specification describes the job specification language, Java programming model, and runtime environment for batch applications for the Java platform. It is designed for use on both the Java SE and Java EE platforms. Additionally, it is designed to work with dependency injection (DI) containers without prescribing a particular DI implementation. diff --git a/spec/src/main/asciidoc/images/image003.png b/spec/src/main/asciidoc/images/image003.png new file mode 100644 index 0000000000000000000000000000000000000000..e7859024cba83a2842ba91c5a65cca54efe38b5f GIT binary patch literal 18298 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 z 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 F{tq`s?sNbE literal 0 HcmV?d00001 diff --git a/spec/src/main/asciidoc/images/image007.png b/spec/src/main/asciidoc/images/image007.png new file mode 100644 index 0000000000000000000000000000000000000000..b9038ea3894aa4a8877e7bf8f05f4e33b8dc6af1 GIT binary patch literal 15339 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 OpDz*$;uWHL{{Ig;x#H^p literal 0 HcmV?d00001 diff --git a/spec/src/main/asciidoc/introduction.adoc b/spec/src/main/asciidoc/introduction.adoc new file mode 100644 index 0000000..f244b17 --- /dev/null +++ b/spec/src/main/asciidoc/introduction.adoc @@ -0,0 +1,6 @@ +== Introduction to JSR 352 +Batch processing is a pervasive workload pattern, expressed by a distinct application organization and execution model. It is found across virtually every industry, applied to such tasks as statement generation, bank postings, risk evaluation, credit score calculation, inventory management, portfolio optimization, and on and on. Nearly any bulk processing task from any business sector is a candidate for batch processing. + +Batch processing is typified by bulk-oriented, non-interactive, background execution. Frequently long-running, it may be data or computationally intensive, execute sequentially or in parallel, and may be initiated through various invocation models, including ad hoc, scheduled, and on-demand. + +Batch applications have common requirements, including logging, checkpointing, and parallelization. Batch workloads have common requirements, especially operational control, which allow for initiation of, and interaction with, batch instances; such interactions include stop and restart. diff --git a/spec/src/main/asciidoc/job_runtime_lifecycle.adoc b/spec/src/main/asciidoc/job_runtime_lifecycle.adoc new file mode 100644 index 0000000..83c6fdc --- /dev/null +++ b/spec/src/main/asciidoc/job_runtime_lifecycle.adoc @@ -0,0 +1,409 @@ +== Job Runtime Lifecycle + +The following sections describe an ordered flow of artifact method +invocations. Simple symbols are used to denote actions as follows: + +[width="100%",cols="<50%,<50%",] +|====================================================================== +|Symbol |Meaning +| |An action performed by the batch runtime. +| < - > method |Invocation of a batch artifact method by the batch runtime. +|[method] |Optional method. +|// comment |Comment to clarify behavior. +|LABEL: |Label used for flow control comments. +|====================================================================== + +=== Batch Artifact Lifecycle + +All batch artifacts are instantiated prior to their use in the scope in +which they are declared in the Job XML and are valid for the life of +their containing scope. There are three scopes that pertain to artifact +lifecycle: job, step, and step-partition. + +One artifact per Job XML reference is instantiated. In the case of a +partitioned step, one artifact per Job XML reference per partition is +instantiated. This means job level artifacts are valid for the life of +the job. Step level artifacts are valid for the life of the step. Step +level artifacts in a partition are valid for the life of the partition. + +No artifact instance may be shared across concurrent scopes. The same +instance must be used in the applicable scope for a specific Job XML +reference. + +=== Job Repository Artifact Lifecycle + +All job repository artifacts are created by the batch runtime during job +processing and exist until deleted by an implementation provided means. + +=== Job Processsing + +[arabic] +. +. +. < - >[JobListener.beforeJob...] // thread A +. +. < - >[JobListener.afterJob...] // thread A +. + +=== Regular Batchlet Processsing + +[arabic] +. +. +. < - > [StepListener.beforeStep...] // thread A +. < - > Batchlet.process // thread A +. // if stop issued: +. < - >[Batchlet.stop] // thread B, StepContext is available +. < - >[StepListener.afterStep...] // thread A +. +. + +=== Partitioned Batchlet Processsing + +[arabic] +. +. +. < - >[StepListener.beforeStep...] // thread A +. < - >[PartitionReducer.beginPartitionedStep] // thread A +. < - >[PartitionMapper.mapPartitions] // thread A +. // per partition: +.. < - >Batchlet.process // thread Px +.. // if stop issued: +.. < - >[Batchlet.stop] // thread Py, StepContext is available +.. < - >[PartitionCollector.collectPartitionData] // thread Px +. // when collector payload arrives: +. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}< - >[PartitionAnalyzer.analyzeCollectorData] // thread A +. // when partition ends: +. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}< - >[PartitionAnalyzer.analyzeStatus] // thread A +. // if rollback condition occurs: +. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}< - >[PartitionReducer.rollbackPartitionedStep] // thread A +. < - >[PartitionReducer.beforePartitionedStepCompletion] // thread A +. < - >[PartitionReducer.afterPartitionedStepCompletion] // thread A +. < - >[StepListener.afterStep...] // thread A +. +. + +=== Regular Chunk Processing + +[arabic] +. +. +. < - >[StepListener.beforeStep...] // thread A +. [ ] +. < - >ItemReader.open // thread A +. < - >ItemWriter.open // thread A +. [ ] +. // chunk processing: +. \{ +.. ]> +.. \{ +... < - >ItemReader.readItem // thread A +... // if readItem returns non-null +.... < - >ItemProcessor.processItem // thread A +.... // if processItem returns non-null, +.. } +.. // if at least one non-null value has been successfully read inthe present chunk +... < - >ItemWriter.writeItems // thread A +.. < - >[ItemReader.checkpointInfo] // thread A +.. < - >[ItemWriter.checkpointInfo] // thread A +.. +.. [] +. } +. [ ] +. < - >ItemWriter.close // thread A +. < - >ItemReader.close // thread A +. [ ] +. < - >[StepListener.afterStep...] // thread A +. +. + +=== Partitioned Chunk Processing + +[arabic] +. +. +. < - >[StepListener.beforeStep...] // thread A +. < - >[PartitionReducer.beginPartitionedStep] // thread A +. < - >[PartitionMapper.mapPartitions] // thread A + + // per partition - on thread Px: +.. [ ] +.. < - >ItemReader.open // thread Px +.. < - >ItemWriter.open // thread Px +.. [ ] +.. \{ +... ]> +... \{ +.... < - >ItemReader.readItem // thread Px +.... // if readItem returns non-null +..... < - >ItemProcessor.processItem // thread Px +..... //if processItem returns non-null, +... } +... //if at least one non-null value has been successfully read in this partition of the present chunk +.... < - >ItemWriter.writeItems // thread Px +... < - >[ItemReader.checkpointInfo] // thread Px +... < - >[ItemWriter.checkpointInfo] // thread Px +... +... [] +... < - >[PartitionCollector.collectPartitionData] // thread Px +.. } +.. [ ] +.. < - >ItemWriter.close // thread Px +.. < - >ItemReader.close // thread Px +.. [ ] +. [ ] // thread A +. // Actions 9-12 run continuously until all partitions end. +. // when collector payload arrives: +. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}< - >[PartitionAnalyzer.analyzeCollectorData] // thread A +. // when partition ends: +. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}< - >[PartitionAnalyzer.analyzeStatus] // thread A +. // Remaining actions run after all partitions end: +. // if rollback condition occurs: +. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}< - >[PartitionReducer.rollbackPartitionedStep] // thread A +. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}[] +. // else not rollback +. < - >[PartitionReducer.beforePartitionedStepCompletion] // thread A +. [ ] // thread A +. < - >[PartitionReducer.afterPartitionedStepCompletion] // thread A +. < - >[StepListener.afterStep...] // thread A +. +. + +=== Chunk with Listeners (except RetryListener) + +[arabic] +. +. +. < - >[StepListener.beforeStep...] // thread A +. [ ] +. < - >ItemReader.open // thread A +. < - >ItemWriter.open // thread A +. [ ] +. // chunk processing: +. \{ +.. ]> +.. < - >[ChunkListener.beforeChunk] // thread A +.. { +... < - >[ItemReadListener.beforeRead] // thread A +... < - >ItemReader.readItem // thread A +... < - >[ItemReadListener.afterRead] // thread A +... // or: +... { +... < - >[ItemReadListener.onReadError] // thread A +... < - >[SkipListener.onSkipReadItem] // thread A +... } +... // if readItem returns non-null +.... < - >[ItemProcessListener.beforeProcess] // thread A +.... < - >ItemProcessor.processItem // thread A +.... < - >[ItemProcessListener.afterProcess] // thread A +.... //if processItem returns non-null,< add item to writeItems buffer> +.... // or: +.... { +.... < - >[ItemProcessListener.onProcessError] // thread A +.... < - >[SkipListener.onSkipProcessItem] // thread A +.... } +.. } +.. //if at least one non-null value has been successfully read in +the present chunk +... < - >[ItemWriteListener.beforeWrite] // thread A +... < - >ItemWriter.writeItems // thread A +... < - >[ItemWriteListener.afterWrite] // thread A +... // or: +... { +... < - >[ItemWriteListener.onWriteError] // thread A +... < - >[SkipListener.onSkipWriteItems] // thread A +... } +.. < - >[ChunkListener.afterChunk] // thread A +.. < - >[ItemReader.checkpointInfo] // thread A +.. < - >[ItemWriter.checkpointInfo] // thread A +.. +.. [] +. } +. [ ] +. < - >ItemWriter.close // thread A +. < - >ItemReader.close // thread A +. [ ] +. < - >[StepListener.afterStep...] // thread A +. +. + +=== Chunk with RetryListener + +Note rollback processing is also depicted in this section. + +[arabic] +. +. +. < - >[StepListener.beforeStep...] // thread A +. [ ] +. < - >ItemReader.open // thread A +. < - >ItemWriter.open // thread A +. [ ] +. // chunk processing: +. \{ +.. S1: +.. ]> +.. \{ +... S2: +... < - >ItemReader.readItem // thread A +... // if exception +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}< - >[ItemReadListener.onReadErrror] // thread A +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}< - >[RetryReadListener.onRetryReadException] // thread A +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// if retryable exception +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// if no-rollback exception +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}resume S2: +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// else +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// else +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} +... S3: +... // if readItem returns non-null +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}< - >ItemProcessor.processItem // thread A +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// if exception +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}< - >[ItemProcessListener.onProcessErrror] // thread A +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}< - >[RetryProcessListener.onRetryProcessException] // thread A +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// if retryable exception +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// if no-rollback exception +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}resume S3: +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// else +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// else +... {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp} +... // if processItem returns non-null, +.. } +.. // if rollback exception, execute rollback procedure (below) and +resume at S1 with item-count=1 +.. S4: +.. // if at least one non-null value has been successfully read in the present chunk +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}< - >ItemWriter.writeItems (buffer) // thread A +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// if exception +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}< - >[ItemWriteListener.onWriteErrror] // thread A +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}< - >[RetryWriteListener.onRetryWriteException] // thread A +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// if retryable exception +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// if no-rollback exception +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}resume S4: +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// else +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}execute rollback procedure (below) and resume S1: +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// else execute rollback procedure (below) and resume S1: +.. < - >[ItemReader.checkpointInfo] // thread A +.. < - >[ItemWriter.checkpointInfo] // thread A +.. // thread A +.. S5: +.. [] // thread A +.. // if exception +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// if retryable exception +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// if no-rollback exception: +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}resume S5: +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// else +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}{nbsp}execute rollback procedure (below) and resume S1: +.. {nbsp}{nbsp}{nbsp}{nbsp}{nbsp}// else execute rollback procedure (below) and resume S1: +. } +. [ ] +. < - >ItemWriter.close // thread A +. < - >ItemReader.close // thread A +. [ ] +. < - >[StepListener.afterStep...] // thread A +. +. + + +*Rollback Procedure* + +[arabic] +. < - >ItemWriter.close // thread A +. < - >ItemReader.close // thread A +. [ChunkListener.onError] // thread A +. [rollback transaction] +. [ ] +. < - >ItemWriter.open // thread A, pass last committed checkpoint +info +. < - >ItemReader.open // thread A, pass last committed checkpoint +info +. [ ] + +=== Chunk with Custom Checkpoint Processing + +[arabic] +. +. +. < - >[StepListener.beforeStep...] // thread A +. [ ] +. < - >ItemReader.open // thread A +. < - >ItemWriter.open // thread A +. [ ] +. // chunk processing: +. \{ +.. [ +.. < - >[CheckpointAlgorithm.checkpointTimeout]] // thread A +.. < - >[CheckpointAlgorithm.beginCheckpoint] // thread A +.. ]> +.. ] +.. \{ +... < - >ItemReader.readItem // thread A +... // if readItem returns non-null +.... < - >ItemProcessor.processItem // thread A +.... //if processItem returns non-null, +... < - >CheckpointAlgorithm.isReadyToCheckpoint // thread A +.. } +.. //if at least one non-null value has been successfully read in +the present chunk +... < - >ItemWriter.writeItems // thread A +.. < - >[ItemReader.checkpointInfo] // thread A +.. < - >[ItemWriter.checkpointInfo] // thread A +.. +.. [] +.. < - >[CheckpointAlgorithm.endCheckpoint] // thread A +. } +. [ ] +. < - >ItemWriter.close // thread A +. < - >ItemReader.close // thread A +. [ ] +. < - >[StepListener.afterStep...] // thread A +. +. + +=== Split Processing + +[arabic] +. // For each flow: +. // thread Fx + +=== Flow Processing + +[arabic] +. // For each split or step: +. // thread Xy + +=== Stop Processing + +The JobOperator.stop operation stops a running job execution. If a step +is running at the time the stop is invoked, the batch runtime takes the +following actions: + +Chunk Step + +The job and step batch status is marked STOPPING. Note the batch runtime +cannot guarantee the step actually exits. The batch runtime attempts to +interrupt the read/process/write chunk processing loop. The batch +runtime allows the step to finish processing the current item. This +means the current item is read, processed if a processor is configured, +and all currently buffered items, if any, including the current item, +are written. If the batch artifacts configured on the chunk type step +return to the batch runtime, as expected, the job and step batch status +is marked STOPPED. + +Batchlet Step + +The job and step batch status is marked STOPPING. The batch runtime +invokes the batchlet's stop method. Note the batch runtime cannot +guarantee the batchlet actually exits. But a well behaved batchlet will. +If the batchlet returns to the batch runtime, the job and step batch +status is marked STOPPED. + +Note for partitioned batchlet steps the Batchlet stop method is invoked +on each thread actively processing a partition. diff --git a/spec/src/main/asciidoc/job_specification_language.adoc b/spec/src/main/asciidoc/job_specification_language.adoc new file mode 100644 index 0000000..bb00b79 --- /dev/null +++ b/spec/src/main/asciidoc/job_specification_language.adoc @@ -0,0 +1,2205 @@ +== Job Specification Language +Job Specification Language (JSL) specifies a job, its steps, and +directs their execution. The JSL for JSR 352 is implemented with XML and +will be henceforth referred to as "Job XML". + +=== Job +The 'job' element identifies a job. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|id |Specifies the logical _name_ of the job and is used for +identification purposes. It must be a valid XML string value. This is a +required attribute. + +|restartable |Specifies whether or not this job is restartable . It must +specify _true_ or _false_. This is an optional attribute. The default is +_true._ +|======================================================================= + +==== Job Level Listeners + +Job level listeners may be configured to a job in order to intercept job +execution. The listener element may be specified as child element of the +job element for this purpose. Job listener is the only listener type +that may be specified as a job level listener. + +Multiple listeners may be configured on a job. However, there is no guarantee of the order in which they are invoked. + +Syntax: + +[source,xml] +---- + + + ... + +---- + +Where: +[width="100%",cols="<50%,<50%",] +|============================================ +|ref |Specifies the name of a batch artifact. +|============================================ + +==== Job Level Exception Handling + +Any unhandled exception thrown by a job-level listener causes the job to +terminate with a batch status of FAILED. In this context, "unhandled" +simply means an exception thrown by the listener back to the runtime +implementation. + +==== Job Level Properties + +The 'properties' element may be specified as a child element of the job +element. It is used to expose properties to any batch artifact belonging +to the job and also to the batch runtime. Any number of properties may +be specified. Job level properties are available through the JobContext +runtime object. See section xref:_batch_contexts[9.4] for further information about Job +Context. + +Syntax: + +[source,xml] +---- + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|name |Specifies a unique property name within the current scope. It +must be a valid XML string value. This is a required attribute. + +|value |Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute. +|======================================================================= + +=== Step +The 'step' element identifies a job step and its characteristics. Step +is a child element of job. A job may contain any number of steps. Each +step may be either a chunk type step or batchlet type step. See section +xref:_chunk[8.2.1] for information on chunk type steps and section xref:_batchlet[8.2.2] for +information on batchlet type steps. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|id |Specifies the logical _name_ of the step and is used for +identification purposes. It must be a valid XML string value. This is a +required attribute. + +|start-limit |Specifies the number of times this step may be started or +restarted. It must be a valid XML integer value. This is an optional +attribute. The default is 0, which means no limit. If the limit is +exceeded, the job is placed in the FAILED state. + +|allow-start-if-complete |Specifies whether this step is allowed to +start during job restart, even if the step completed in a previous +execution. It must be _true_ or _false_. A value of _true_ means the +step is allowed to restart. This is an optional attribute. The default +is _false_. + +|next |Specifies the next step, flow, split, or decision to run after +this step is complete. It must be a valid XML string value. This is an +optional attribute. The default is this step is the last step in the job +or flow. Note: next attributes cannot be specified such that a loop +occurs among steps. +|======================================================================= + +==== Chunk + +The 'chunk' element identifies a chunk type step. It is a child element +of the step element. A chunk type step is periodically checkpointed by +the batch runtime according to a configured checkpoint policy. Items +processed between checkpoints are referred to as a "chunk". A single +call is made to the ItemWriter per chunk. Each chunk is processed in a +separate transaction. See section xref:_transactionality[9.7] for more details on +transactionality. A chunk that is not complete is restartable from its +last checkpoint. A chunk that is complete and belongs to a step +configured with allow-start-if-complete=true runs from the beginning +when restarted. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|checkpoint-policy |Specifies the checkpoint policy that governs commit +behavior for this chunk. Valid values are: "item" or "custom". The +"item" policy means the chunk is checkpointed after a specified number +of items are processed. The "custom" policy means the chunk is +checkpointed according to a checkpoint algorithm implementation. +Specifying "custom" requires that the checkpoint-algorithm element is +also specified. See section 8.2.1.5 for checkpoint-algorithm. It is an +optional attribute. The default policy is "item". + +|item-count |Specifies the number of items to process per chunk when +using the item checkpoint policy. It must be valid XML integer. It is an +optional attribute. The default is 10. The item-count attribute is +ignored for "custom" checkpoint policy. + +|time-limit |Specifies the amount of time in seconds before taking a +checkpoint for the item checkpoint policy. It must be valid XML integer. +It is an optional attribute. The default is 0, which means no limit. +When a value greater than zero is specified, a checkpoint is taken when +time-limit is reached or item-count items have been processed, whichever +comes first. The time-limit attribute is ignored for "custom" checkpoint +policy. + +|skip-limit |Specifies the number of exceptions a step will skip if any +configured skippable exceptions are thrown by chunk processing. It must +be a valid XML integer value. It is an optional attribute. The default +is no limit. + +|retry-limit |Specifies the number of times a step will retry if any +configured retryable exceptions are thrown by chunk processing. It must +be a valid XML integer value. It is an optional attribute. The default +is no limit. +|======================================================================= + +===== Reader + +The 'reader' element specifies the item reader for a chunk step. It is a +child element of the 'chunk' element. A chunk step must have one and +only one item reader. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|============================================ +|ref |Specifies the name of a batch artifact. +|============================================ + +====== Reader Properties + +The 'properties' element may be specified as a child element of the +reader element. It is used to pass property values to a item reader. Any +number of properties may be specified. + +Syntax: + +[source,xml] +---- + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|name |Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute. + +|value |Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute. +|======================================================================= + +===== Processor + +The 'processor' element specifies the item processor for a chunk step. +It is a child element of the 'chunk' element. The processor element is +optional on a chunk step. Only a single processor element may be +specified. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|============================================ +|ref |Specifies the name of a batch artifact. +|============================================ + +====== Processor Properties + +The 'properties' element may be specified as a child element of the +processor element. It is used to pass property values to a item +processor. Any number of properties may be specified. + +Syntax: + +[source,xml] +---- + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|name |Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute. + +|value |Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute. +|======================================================================= + +===== Writer + +The 'writer' element specifies the item writer for a chunk step. It is a +child element of the 'chunk' element. A chunk type step must have one +and only one item writer. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|============================================ +|ref |Specifies the name of a batch artifact. +|============================================ + +====== Writer Properties + +The 'properties' element may be specified as a child element of the +writer element. It is used to pass property values to a item writer. Any +number of properties may be specified. + +Syntax: + +[source,xml] +---- + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|name |Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute. + +|value |Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute. +|======================================================================= + +===== Chunk Exception Handling + +By default, when any batch artifact that is part of a chunk type step +throws an exception to the Batch Runtime, the job execution ends with a +batch status of FAILED. The default behavior can be overridden for a +reader, processor, or writer artifact by configuring exceptions to skip +or to retry. The default behavior can be overridden for the entire step +by configuring a transition element that matches the step's exit +status. + +====== Skipping Exceptions + +The skippable-exception-classes element specifies a set of exceptions +that chunk processing will skip. This element is a child element of the +chunk element. It applies to exceptions thrown from the reader, +processor, and writer batch artifacts of a chunk type step. It also applies +to exceptions thrown during checkpoint commit processing. A failed +commit will be treated the same as a failed write. The total number of +skips is set by the skip-limit attribute on the chunk element. See +section xref:_chunk[8.2.1] for details on the chunk element. + +A given exception will be skipped if it "matches" an include child +element of the skippable-exception-classes element, though this might be +negated (and the exception not skipped) if it also "matches" an exclude +child element of skippable-exception-classes. + +The behavior is determined by the "nearest superclass" in the class +hierarchy. + +To elaborate, in this context, "matches" means the following: For an +include (or exclude) element C with @class attribute value T, an +exception E "matches" C when either E is of type T or E's type is a +subclass of T. + +When an exception E "matches" both one or more include and one or more +exclude elements, then there will be one type T1 among all the matching +include/exclude elements such that all other distinct matching element +types are superclasses of T1 (because of Java's single inheritance). If +T1 only occurs in a matching include element then include (skip) this +exception. If T1 appears in a matching exclude element (even if it also +appears in a matching include element), then exclude (don't skip) this +exception. + +Optional Skip Listener batch artifacts can be configured to the step. A +Skip Listener receives control after a skippable exception is thrown by +the reader, processor, or writer. See section xref:_skip_listener_interfaces[9.2.7] for details on the +Skip Listener batch interfaces. + +Syntax: + +[source,xml] +---- + + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|include class |Specifies the class name of an exception or exception +superclass to skip. It must be a fully qualified class name. Multiple +instances of the include element may be specified. The include child +element is optional. However, when specified, the class attribute is +required. + +|exclude class |Specifies a class name of an exception or exception +superclass to not skip. 'Exclude class' reduces the number of exceptions +eligible to skip as specified by 'include class'. It must be a fully +qualified class name. Multiple instances of the exclude element may be +specified. The exclude child element is optional. However, when +specified, the class attribute is required. +|======================================================================= + +Example: + +[source,xml] +---- + + + + +---- + +The preceding example would skip all exceptions except +`java.io.FileNotFoundException`, (along with any subclasses of +`java.io.FileNotFoundException`). + +====== Retrying Exceptions + +The retryable-exception-classes element specifies a set of exceptions +that chunk processing will retry. This element is a child element of the +chunk element. It applies to exceptions thrown from the reader, +processor, or writer batch artifacts of a chunk type step. It also +applies to exceptions thrown by checkpoint commit processing. The total +number of retry attempts is set by the retry-limit attribute on the +chunk element. See section xref:_chunk[8.2.1] for details on the chunk element. + +The list of exceptions that will be retried (or not retried) is +specified in the retryable-exception-classes element on the child +include element. This list, however, may be modified using one or more +child exclude elements. The rules for deciding whether to retry or not +retry a given exception when a combination of include and exclude +elements are used are analogous to the rules described in the discussion +in section 8.2.1.4.1 for skipping exceptions. + +Optional Retry Listener batch artifacts can be configured on the step. A +Retry Listener receives control after a retryable exception is thrown by +the reader, processor, or writer. See section xref:_retrylistener_interface[9.2.8] for details on the +Retry Listener batch artifact. + + +Syntax: + +[source,xml] +---- + + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|include class |Specifies a class name of an exception or exception +superclass to retry. It must be a fully qualified class name. Multiple +instances of the include element may be specified. The include child +element is optional. However, when specified, the class attribute is +required. + +|exclude class |Specifies a class name of an exception or exception +superclass to not retry. 'Exclude class' reduces the number of +exceptions eligible for retry as specified by 'include class'. It must +be a fully qualified class name. Multiple instances of the include +element may be specified. The exclude child element is optional. +However, when specified, the class attribute is required. +|======================================================================= + +Example: + +[source,xml] +---- + + + + +---- + +The result is that all IOExceptions except `FileNotFoundException` (and +its subclasses) would be retried. + +====== Retry and Skip the Same Exception + +When the same exception is specified as both retryable and skippable, +retryable takes precedence over skippable during regular processing of +the chunk. While the chunk is retrying, skippable takes precedence over +retryable since the exception is already being retried. + +This allows an exception to initially be retried for the entire chunk +and then skipped if it recurs. When retrying with default retry behavior +(see section 8.2.1.4.4) the skips can occur for individual items, since +the retry is done with an item-count of 1. + +====== Default Retry Behavior - Rollback + +When a retryable exception occurs, the default behavior is for the batch +runtime to rollback the current chunk and re-process it with an +item-count of 1 and a checkpoint policy of item. If the optional +ChunkListener is configured on the step, the onError method is called +before rollback. The default retry behavior can be overridden by +configuring the no-rollback-exception-classes element. See section +8.2.1.4.5 for more information on specifying no-rollback exceptions. + +====== Preventing Rollback During Retry + +The no-rollback-exception-classes element specifies a list of exceptions +that override the default behavior of rollback for retryable exceptions. +This element is a child element of the chunk element. If a retryable +exception is thrown the default behavior is to rollback before retry. If +an exception is specified as both a retryable and a no-rollback +exception, then no rollback occurs and the current operation is retried. +Retry Listeners, if configured, are invoked. See section xref:_retrylistener_interface[9.2.8] for +details on the Retry Listener batch artifact. + +The rules for determining whether a combination of include and exclude +child elements of no-rollback-exception-classes results in the "no +rollback" behavior or not are analogous to the rules described in the +discussion in section 8.2.1.4.1 for skipping exceptions. + +Syntax: + +[source,xml] +---- + + + + +---- +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|include class |Specifies a class name of an exception or exception +superclass for which rollback will not occur during retry processing. It +must be a fully qualified class name. Multiple instances of the include +element may be specified. The include child element is optional. +However, when specified, the class attribute is required. + +|exclude class |Specifies a class name of an exception or exception +superclass for which rollback will occur during retry processing. It +must be a fully qualified class name. Multiple instances of the include +element may be specified. The exclude child element is optional. +However, when specified, the class attribute is required. +|======================================================================= + +===== Checkpoint Algorithm + +The checkpoint-algorithm element specifies an optional custom checkpoint +algorithm. It is a child element of the chunk element. It is valid when +the chunk element checkpoint-policy attribute specifies the value +'custom'. A custom checkpoint algorithm may be used to provide a +checkpoint decision based on factors other than only number of items, or +amount of time. See section 9.1.1.4 for further information about custom +checkpoint algorithms. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|============================================ +|ref |Specifies the name of a batch artifact. +|============================================ + +====== Checkpoint Algorithm Properties + +The 'properties' element may be specified as a child element of the +checkpoint algorithm element. It is used to pass property values to a +checkpoint algorithm. Any number of properties may be specified. + +Syntax: + +[source,xml] +---- + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|Name |Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute. + +|Value |Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute. +|======================================================================= + +==== Batchlet + +The batchlet element specifies a task-oriented batch step. It is +specified as a child element of the step element. It is mutually +exclusive with the chunk element. See xref:_batchlet_interface[9.1.2] for further details about +batchlets. Steps of this type are useful for performing a variety of +tasks that are not item-oriented, such as executing a command or doing +file transfer. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|============================================ +|Ref |Specifies the name of a batch artifact. +|============================================ + +===== Batchlet Exception Handling + +This section is superseded by section xref:_step_exception_handling[8.2.7]. + +===== Batchlet Properties + +The 'properties' element may be specified as a child element of the +batchlet element. It is used to pass property values to a batchlet. Any +number of properties may be specified. + +Syntax: + +[source,xml] +---- + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|Name |Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute. + +|value |Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute. +|======================================================================= + +==== Step Level Properties + +The 'properties' element may be specified as a child element of the step +element. It is used to expose properties to any step level batch +artifact and also to the batch runtime. Any number of properties may be +specified. Step level properties are available through the StepContext +runtime object. See section xref:_batch_contexts[9.4] for further information about +StepContext. + +Syntax: + +[source,xml] +---- + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|name |Specifies a unique property name within the current scope. It +must be a valid XML string value. This is a required attribute. + +|value |Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute. +|======================================================================= + +==== Step Level Listeners + +Step level listeners may be configured to a job step in order to +intercept step execution. The listener element may be specified as child +element of the step element for this purpose. The following listener +types may be specified according to step type: + +* chunk step - step listener, item read listener, item process listener, +item write listener, chunk listener, skip listener, and retry listener +* batchlet step - step listener + +Multiple listeners may be configured on a step. However, there is no +guarantee of the order in which they are invoked. + +Syntax: + +[source,xml] +---- + + + ... + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|============================================ +|ref |Specifies the name of a batch artifact. +|============================================ + +===== Step Level Listener Properties + +The 'properties' element may be specified as a child element of the +step-level listeners element. It is used to pass property values to a +step listener. Any number of properties may be specified. + +Syntax: + +[source,xml] +---- + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|name |Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute. + +|value |Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute. +|======================================================================= + +Example: + +[source,xml] +---- + + + + + +---- + +==== Step Sequence + +The first step, flow, or split defines the first step (flow or split) to +execute for a given Job XML. "First" means first according to order of +occurrence as the Job XML document is parsed from beginning to end. The +'next' attribute on the step, flow, or split defines what executes next. +The next attribute may specify a step, flow, split, or decision. For the +purpose of discussing transitioning it is convenient to group these four +with the term "execution elements". The next attribute is supported on +step, flow, and split elements. Steps, flows, and decisions may also + use the "next" _element_ to specify what executes +next. The next attribute and next element may not be used in a way that +allows for looping among job execution elements. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|on |Specifies an exit status to match to the current next element. It +must be a valid XML string value. Wildcards of "*" and "" may be used. +"*" matches zero or more characters. "" matches exactly one character. +It must match an exit status value in order to have effect. This is a +required attribute. + +|to |Specifies the id of another step, split, flow, or decision, which +will execute next. It must be a valid XML string value. It must match an +id of another step, split, flow, or decision in the same job. For a step +inside a flow, the id must match another step in the same flow. This is +a required attribute. +|======================================================================= + +See section xref:_transition_elements[8.6] for more details about transition +elements and section xref:_transitioning_rules[8.9] for details on transitioning rules. + +==== Step Partitioning + +A batch step may run as a partitioned step. A partitioned step runs as +multiple instances of the same step definition across multiple threads, +one partition per thread. The number of partitions and the number of +threads is controlled through either a static specification in the Job +XML or through a batch artifact called a partition mapper. Each +partition needs the ability to receive unique parameters to instruct it +which data on which to operate. Properties for each partition may be +specified statically in the Job XML or through the optional partition +mapper. Since each thread runs a separate copy of the step, chunking and +checkpointing occur independently on each thread for chunk type steps. + +There is an optional way to coordinate these separate units of work in a +partition reducer so that backout is possible if one or more partitions +experience failure. The PartitionReducer batch artifact provides a way +to do that. A PartitionReducer provides programmatic control over +logical unit of work demarcation that scopes all partitions of a +partitioned step. + +The partitions of a partitioned step may need to share results with a +control point to decide the overall outcome of the step. The +PartitionCollector and PartitionAnalyzer batch artifact pair provide for +this need. + +The 'partition' element specifies that a step is a partitioned step. The +partition element is a child element of the 'step' element. It is an +optional element. + +Syntax: + +[source,xml] +---- + +---- + +Example: + +The following Job XML snippet shows how to specify a partitioned step: + +[source,xml] +---- + + or + + +---- + +===== Partition Plan + +A partition plan defines several configuration attributes that affect +partitioned step execution. A partition plan specifies the number of +partitions, the number of partitions to execute concurrently, and the +properties for each partition. A partition plan may be defined in a Job +XML declaratively or dynamically at runtime with a partition mapper. + +The 'plan' element is a child element of the 'partition' element. The +'plan' element is mutually exclusive with partition mapper element. See +section xref:_partitionmapper_interface[9.5.1] for further details on partition mapper. + +Note the specification does not attempt to guarantee order of partition +execution with respect to the order within a statically or +dynamically-defined plan. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|Partitions |Specifies the number of partitions for this partitioned +step. This is a an optional attribute. The default is 1. + +|threads |Specifies the maximum number of threads on which to execute +the partitions of this step. Note the batch runtime cannot guarantee the +requested number of threads are available; it will use as many as it can +up to the requested maximum. This is an optional attribute. The default +is the number of partitions. +|======================================================================= + +Example: + +The following Job XML snippet shows how to specify a step partitioned +into 3 partitions on 2 threads: + +[source,xml] +---- + + + + + + +---- + +===== Partition Properties + +When defining a statically partitioned step, it is possible to specify +unique property values to pass to each partition directly in the Job XML +using the property element. See section xref:_partitionmapper_interface[9.5.1] for further information on +partition mapper. + +Syntax: + +[source,xml] +---- + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|partition |Specifies the logical partition number to which the +specified properties apply. This must be a non-negative integer value, +starting at 0. + +|name |Specifies a unique property name within the current +scope . It must be a valid XML string value. If +it matches a named property in the associated batch artifact, its value +is assigned to that property. If not, it is ignored. This is a required +attribute. + +|value |Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute. +|======================================================================= + +Example: + +The following Job XML snippet shows a step of 2 partitions with a unique +value for the property named "filename" for each partition: + +[source,xml] +---- + + + + + + + + + + +---- + +===== Partition Mapper + +The partition mapper provides a programmatic means for calculating the +number of partitions and threads for a partitioned step. The partition +mapper also specifies the properties for each partition. The mapper +element specifies a reference to a PartitionMapper batch artifact; see +section xref:_partitionmapper_interface[9.5.1] for further information. Note the mapper element is +mutually exclusive with the plan element. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|============================================ +|ref |Specifies the name of a batch artifact. +|============================================ +Example: + +[source,xml] +---- + + + +---- + +====== Mapper Properties +The 'properties' element may be specified as a child element of the +mapper element. It is used to pass property values to a PartitionMapper +batch artifact. Any number of properties may be specified. + +Syntax: + +[source,xml] +---- + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|name |Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute. + +|value |Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute. +|======================================================================= + +===== Partition Reducer + +A partitioned step may execute with an optional partition reducer. A +partition reducer provides a kind of unit of work demarcation around the +processing of the partitions. Programmatic interception of the +partitioned step's lifecycle is possible through the partition reducer. +The reducer element specifies a reference to a PartitionReducer batch +artifact; see section xref:_partitionreducer_interface[9.5.2] for further information. + +The 'reducer' element is a child element of the 'partition' element. + +Syntax: + +[source,xml] +---- + +---- +Where: + +[width="100%",cols="<50%,<50%",] +|============================================ +|ref |Specifies the name of a batch artifact. +|============================================ +Example: + +[source,xml] +---- + + + +---- + +====== Partition Reducer Properties +The 'properties' element may be specified as a child element of the +PartitionReducer element. It is used to pass property values to a +PartitionReducer batch artifact. Any number of properties may be +specified. + +Syntax: + +[source,xml] +---- + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|name |Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute. + +|value |Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute. +|======================================================================= + +===== Partition Collector + +A Partition Collector is useful for sending intermediary results for +analysis from each partition to the step's Partition Analyzer. A +separate Partition Collector instance runs on each thread executing a +partition of the step. The collector is invoked at the conclusion of +each checkpoint for chunking type steps and again at the end of +partition; it is invoked once at the end of partition for batchlet type +steps. A collector returns a Java Serializable object, which is +delivered to the step's Partition Analyzer. See section xref:_partitionanalyzer_interface[9.5.4] for +further information about the Partition Analyzer. The collector element +specifies a reference to a PartitionCollector batch artifact; see +section xref:_partitioncollector_interface[9.5.3] for further information. + +The 'collector' element is a child element of the 'partition' element. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|============================================ +|ref |Specifies the name of a batch artifact. +|============================================ + +Example: + +[source,xml] +---- + + + +---- + +====== Partition Collector Properties +The 'properties' element may be specified as a child element of the +collector element. It is used to pass property values to a +PartitionCollector batch artifact. Any number of properties may be +specified. + +Syntax: + +[source,xml] +---- + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|name |Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute. + +|value |Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute. +|======================================================================= + +===== Partition Analyzer + +A Partition Analyzer receives intermediary results from each partition +sent via the step's Partition Collector. A Partition analyzer runs on +the step main thread and serves as a collection point for this data. The +PartitionAnalyzer also receives control with the partition exit status +for each partition, after that partition ends. An analyzer can be used +to implement custom exit status handling for the step, based on the +results of the individual partitions. The analyzer element specifies a +reference to a PartitionAnalyzer batch artifact; see section xref:_partitionanalyzer_interface[9.5.4] for +further information. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|============================================ +|ref |Specifies the name of a batch artifact. +|============================================ + +Example: + +[source,xml] +---- + + + +---- + +====== Partition Analyzer Properties +The 'properties' element may be specified as a child element of the +analyzer element. It is used to pass property values to a +PartitionAnalyzer batch artifact. Any number of properties may be +specified. + +Syntax: + +[source,xml] +---- + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|name |Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute. + +|value |Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute. +|======================================================================= + + + +==== Step Exception Handling + +Any unhandled exception thrown by any step-level artifact during step +processing causes the step to terminate with a batch status of FAILED. +In this context, "unhandled" means an exception thrown by the execution +of the artifact back to the runtime implementation which does not result +in a skip or a retry as described in section 8.2.1.4. + See section xref:_transitioning_precedence_rules[8.9.2] for complete details on +transitioning after an unhandled exception. + +=== Flow + +A flow defines a sequence of execution elements that execute together as +a unit. When the flow is finished, it is the entire flow that +transitions to the next execution element. A flow may transition to a +step, split, decision, or another flow. A flow may contain step, flow, +decision, and split execution elements. See section xref:_decision[8.5] for more on +decisions. See section xref:_split[8.4] for more on splits. The execution elements +within a flow may only transition among themselves; they may not +transition to elements outside of the flow. A flow may also contain the +transition elements next, stop, fail, and end. See section xref:_transition_elements[8.6] for more +on transition elements. + +Syntax: + +[source,xml] +---- + + ... ... + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|id |Specifies the logical _name_ of the flow and is used for +identification purposes. It must be a valid XML string value. This is a +required attribute. + +|next |Specifies the next step, flow, split, or decision to run after +this step is complete. It must be a valid XML string value. This is an +optional attribute. The default is this flow is the last execution +element in the job. Note: next attributes cannot be specified such that +a loop occurs among steps. +|======================================================================= + +=== Split + +A split defines a set of flows that execute concurrently. A split may +include only flow elements as children. See section xref:_flow[8.3] for more on +flows. Each flow runs on a separate thread. The split is finished after +all flows complete. When the split is finished, it is the entire split +that transitions to the next execution element. A split may transition +to a step, flow, decision, or another split. + +Syntax: + +[source,xml] +---- + + ... + ... + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|id |Specifies the logical _name_ of the split and is used for +identification purposes. It must be a valid XML string value. This is a +required attribute. + +|next |Specifies the next step, flow, split, or decision to run after +this step is complete. It must be a valid XML string value. This is an +optional attribute. The default is this split is the last execution +element in the job. Note: next attributes cannot be specified such that +a loop occurs among steps. +|======================================================================= + +==== Split Termination Processing Incomplete + +The effort of the initial 1.0 final release specification to define +split termination processing is recognized as incomplete. This is +related to the recognition that flow transitioning is incomplete +(section xref:_flow_level_transitions[8.9.5]). + +As such, there is no well-defined mechanism for "passing back" status +from the individual child flows of a split and aggregating them into a +status at the split level. There is, accordingly, no termination based +on the status of the constituent flows performed after a split +execution. + +However, the implementor must be aware that a split may have a child +flow where the flow itself or a flows child (step, decision, etc.) +causes the job execution to terminate. This could be via an end, stop, +or fail transition element, or via an unhandled exception. + +In such a case the job should then cease execution before transitioning +past the current, containing split, on to the next execution element. + +Typically only one such element (in one single flow) would terminate job +execution, with a corresponding batch and exit status that would then be +set by the implementation as the job-level batch status and exit status, +since typically the whole split would be intended to complete. + +The spec does not make an effort, then, to define the outcome if more +than one flow within a split produced a terminating status. A +suggestion, though, is that a FAILED batch status should be given +preference to STOPPED, which should be given preference to COMPLETED +status, and a natural corollary might be to bubble up the associate exit +status as the job-level exit status as well. + +=== Decision + +A decision provides a customized way of determining sequencing among +steps, flows, and splits. The decision element may follow a step, flow, +or split. A job may contain any number of decision elements. A decision +element is the target of the "next" attribute from a job-level step, +flow, split, or another decision. A decision must supply a decider batch +artifact (see section xref:_decider_interface[9.6]). The decider's purpose is to decide the next +transition. The decision uses any of the transition elements, stop, +fail, end, and next elements to select the next transition. See section +xref:_transition_elements[8.6] for further information on transition elements. The decider return +value will also be set as the current value of the job exit status, in +addition to being matched against the decisions own child transition +elements to decide the next transition. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|id |Specifies the logical _name_ of the decision and is used for +identification purposes. It must be a valid XML string value. This is a +required attribute. + +|ref |Specifies the name of a batch artifact. +|======================================================================= +Example: + +[source,xml] +---- + + ... + +---- + +==== Decision Properties + +The 'properties' element may be specified as a child element of the +decision element. It is used to pass property values to a decider. Any +number of properties may be specified. + +Syntax: + +[source,xml] +---- + + + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|name |Specifies a unique property name within the current scope. It +must be a valid XML string value. If it matches a named property in the +associated batch artifact, its value is assigned to that property. If +not, it is ignored. This is a required attribute. + +|value |Specifies the value corresponding to the named property. It must +be a valid XML string value. This is a required attribute. +|======================================================================= + +==== Decision Exception Handling + +Any exception thrown by a batch artifact invoked during decision +handling will end the job with a batch status of FAILED. This exception +is visible to job-level listeners. + +=== Transition Elements + +Transition elements may be specified in the containment scope of a step, +flow, or decision (but not a split) to direct job execution sequence or +to terminate job execution. There are fo ur +transition elements: + +1. next - directs execution flow to the next execution element. +2. fail - causes a job to end with FAILED batch status. +3. end - causes a job to end with COMPLETED batch status. +4. stop - causes a job to end with STOPPED batch status. + +Fail, end, and stop are considered "terminating elements" because they +cause a job execution to terminate. + +==== Next Element +The next element is used to transition execution to the next execution element. +Multiple next elements may be specified in the current containment +scope. +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|on |Specifies the exit status value that activates this end element. It +must be a valid XML string value. Wildcards of "*" and "" may be used. +"*" matches zero or more characters. "" matches exactly one character. +It must match an exit status value in order to have effect. This is a +required attribute. + +|to |Specifies the execution element to which +to transition after this decision. It must be a valid XML string value. +This is a required attribute. Note: the to value cannot specify the next +execution element such that a loop occurs in the batch job. +|======================================================================= +Example: + +[source,xml] +---- + + + +---- + +==== Fail Element + +The fail element is used to terminate the job at the conclusion of the +current step or flow. The job batch status is +set to FAILED. This does not, however, directly affect the batch status +of the step containing the fail element. + Multiple fail elements may be specified in the +current containment scope. The fail element is supported as a child of +the step, flow, and decision elements. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|on |Specifies the exit status value that activates this fail element. +It must be a valid XML string value. Wildcards of "*" and "" may be +used. "*" matches zero or more characters. "" matches exactly one +character. It must match an exit status value in order to have effect. +This is a required attribute. + +|exit-status |Specifies the new exit status for the job. It + must be a valid XML string value. This is an +optional attribute. If not specified, the job-level exit status is +unchanged. This attribute does not directly change any step exit status +(particularly the step which contains this +fail element). +|======================================================================= + +Example: +[source,xml] +---- + + + +---- + +==== End Element + +The end element is used to terminate the job at the current step. The +job batch status is set to COMPLETED. This does +not, however, directly affect the batch status of the step containing +the end element. Multiple end elements may be +specified in the current containment scope. The end element is supported +as a child of the step, flow, and decision elements. + +Syntax: + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|on |Specifies the exit status value that activates this end element. It +must be a valid XML string value. Wildcards of "*" and "" may be used. +"*" matches zero or more characters. "" matches exactly one character. +It must match an exit status value in order to have effect. This is a +required attribute. + +|exit-status |Specifies the new exit status for the job. It + must be a valid XML string value. This is an +optional attribute. If not specified, the job-level exit status is +unchanged. This attribute does not directly change any step exit status +(particularly the step which contains this end +element). +|======================================================================= + +Example: + +[source,xml] +---- + + + +---- + +==== Stop Element + +The stop element is used to terminate the job after the current step or +flow. If the stop element matches the exit status, the job-level batch +status is then set to STOPPED. This does not, however, directly affect +the batch status of the step containing the + . +Multiple stop elements may be specified in the current containment +scope. The stop element is supported as a child of step, flow, and +decision elements. + +[source,xml] +---- + +---- + +Where: + +[width="100%",cols="<50%,<50%",] +|======================================================================= +|on |Specifies the exit status value that activates this end element. It +must be a valid XML string value. Wildcards of "*" and "" may be used. +"*" matches zero or more characters. "" matches exactly one character. +It must match an exit status value in order to have effect. This is a +required attribute. + +|exit-status |Specifies the exit status for the job. It + must be a valid XML string value. This is an +optional attribute. If not specified, the job-level exit status is +unchanged. This attribute does not directly change any step exit status +(particularly the step which contains this +stop element). + +|restart |Specifies the job-level step, flow, or split at which to +restart when the job is restarted. It must be a valid XML string value. +This is an optional attribute. +|======================================================================= + +Example: + +[source,xml] +---- + + + +---- + +=== Batch and Exit Status + +Batch execution reflects a sequence of state changes, culminating in an +end state after a job has terminated. These state changes apply to the +entire job as a whole, as well as to each step within the job. These +state changes are exposed through the programming model as status +values. There is both a runtime status value, called "batch status", as +well as a user-defined value, called "exit status". + +A job and each step in a job end with a batch status and exit status +value. Batch status is set by the batch runtime; exit status may be set +through the Job XML or by the batch application. The exit status for a +job and a step will be initially set to null. +At the time that the job or step completes execution, if the exit status +is equal to null, it will then be set by the runtime implementation + to the string value of the batch status, which +will be its final value. The batch and exit status values are available +in the JobContext and StepContext runtime objects, and the exit status +can be set explicitly via any batch artifact. The overall batch and exit +status for the job are available through the JobOperator interface. +Batch and exit status values are strings. The following batch status +values are defined: + +|======================================================================= +|Value|Meaning +|STARTING|Batch job has been passed to the batch runtime for execution through the JobOperator interface start or restart operation. A step has a status of STARTING before it actually begins execution. +|STARTED|Batch job has begun execution by the batch runtime. A step has a status of STARTED once it has begun execution. +|STOPPING|Batch job has been requested to stop through the JobOperator interface +stop operation or by a element in the Job XML. A step has a +status of STOPPING as soon as JobOperator.stop receives control. +|STOPPED|Batch job has been stopped through the JobOperator interface stop +operation or by a element in the Job XML. A step has a status of +STOPPED once it has actually been stopped by the batch runtime. +|FAILED|Batch job has ended due to an unresolved exception or by a +element in the Job XML. A step has a status of FAILED under the same +conditions. +|COMPLETED|Batch job has ended normally or by an element in the Job XML. A +step has a status of COMPLETED under the same conditions. +|ABANDONED|Batch job has been marked abandoned through the JobOperator interface +abandon operation. An abandoned job is still visible through the +JobOperator interface, but is not running, nor can it be restarted. It +exists only as a matter of history. +|======================================================================= + +A job execution will end under the following conditions: + +. A job-level execution element (step, flow, or split) finishes +execution, without specifying a "next" attribute and without the exit +status matching any transition elements. (See section xref:_transitioning_precedence_rules[8.9.2] for +details). In this case, the batch status is set +to COMPLETED. +. A step throws an exception to the batch runtime that does not match +skip or retry criteria, with the exit status not matching any transition +elements. In this case, the batch status is set to FAILED. (See section +xref:_transitioning_precedence_rules[8.9.2] for details). In the case of partitioned +or concurrent (split) step execution, all other still-running parallel +instances are allowed to complete before the job ends with FAILED batch +status. +. A step, flow, or decision terminates execution with a stop, end, or +fail element. In this case, the batch status is STOPPED, COMPLETED, or +FAILED, respectively . + +The batch and exit status of the job is set as follows: + +. Batch status is initially set to STARTING by the batch runtime. +Immediately before starting the first step, the batch runtime sets the +batch status to STARTED . +. Exit status can be overridden by any artifact by invoking the exit +status setter method on the JobContext object. +. Exit status can be overridden by a decision element. +. Exit status can be overridden by a terminating transition element on +a step, flow, or split. See section xref:_transition_elements[8.6]. +. Final batch status is set by the batch runtime depending on the +outcome of the job. See table above. Exit status is set to the final +batch status if it was not overridden by any of the override means +described earlier in this list. Note the last override to set exit +status during the course of job execution takes precedence over all +others. + +In addition to these conditions and events +which are well-defined by this specification, it is also recognized that +the runtime may be forced to make another transition of job and step +batch status. + +For example, a JVM hang may cause a job to appear in STARTED state even +though it is no longer running. The specification forbids running +multiple executions of a given job instance at the same time. In order +to recover and allow restart it is expect that a batch runtime +implementation might provide a mechanism to automatically or through +user intervention mark the appropriate job and step execution(s) as +FAILED (i.e. set the batch status as FAILED). + +The details are left entirely to the implementation, we are just +recognizing here that this is a valid state transition. + +==== Batch and Exit Status for Steps + +Step batch status is set initially, and then again at the conclusion of +the step, by the batch runtime. [line-through]#Step exit status is +initially set to the same value as batch +status.# Step exit status may be set by any +batch artifact configured to the step by invoking the exit status setter +method in the StepContext object. See section xref:_batch_contexts[9.4] for further +information about the StepContext object. Setting the step exit status +does not alter the execution of the current step, but rather, is +available to influence the execution of subsequent steps via transition +elements (see xref:_transition_elements[8.6]) and deciders (see xref:_decider_interface[9.6]). If no batch artifact sets the +exit status, the batch runtime will default the value to the string form +of the batch status value of the step when step execution completes. +An important point to note is that transition elements do not affect the +batch and exit status of their containing step (for a step with one or +more child transition elements), but only potentially affect the batch +and exit status of the job. + +Example: +[source,xml] +---- + + + + + + +---- + +Suppose for the above example JSL snippet, FS1s batchlet executes +normally with an exit status of "RC4". Then step FS1s batch status will +end up as COMPLETED, and FS1s exit status will end up as "RC4". The jobs +batch status will end up as FAILED and the jobs exit status will end up +as "BAD". Likewise, if the batchlet completes with an exit status of +"RC8" the steps batch and exit status will be COMPLETED and "RC8", +respectively, while the jobs batch and exit status will be FAILED and +"FAILED" (assuming the job exit status hasnt been set and defaults in +this case). + +Note the implications for restart processing. For example, a completed +step wont re-run just because the step includes a transition element +failing the job on the original step executions exit status. See section +xref:_supporting_classes[10.8] for more on restart processing. + +==== Exit Status for Partitioned Steps + +The exit status for a partitioned step follows the same rules as for a +regular step except for an exit status set by batch artifacts processing +individual partitions . This means any batch +artifact running on the main thread of the partitioned step can set the +steps exit status via the exit status setter method on the StepContext +object , the same as for a non-partitioned step.E.g. a steps partition +analyzer, partition reducer, or step listener could each potentially set +the steps exit status in this simple manner (since each of these +artifacts run on the initial thread, not the threads processing an +individual partition). If the exit status is not set it defaults to +batch status at the end of step execution , the +same as for a non-partitioned step. + +For a partitioned batchlet, each thread processing a partition may +return a separate exit status. However, these exit status values are +ignored unless a partition analyzer is used to coalesce these separate +exit status values into a final exit status value for the step. + +The batch runtime maintains a StepContext clone per partition. For a +partitioned batchlet or chunk, any batch artifact running on any of the +threads processing a partition would merely set a separate exit status +through the StepContext clone. These exit status values are ignored +unless a partition analyzer is used to coalesce these separate exit +status values into a final exit status value for the step. + +=== Job XML Substitution + +Job XML supports substitution as part of any attribute value. The +following expression language is supported on all attributes: + +---- + ::= ' " ' [] ' " ' + + ::= + + ::= "#\{""}" | [ ] + + ::= ":" ";" + + ::= | | | | + + ::= "jobParameters" "[" "]" + + ::= "jobProperties" "[" "]" + + ::= "systemProperties" "[" "]" + + ::= "partitionPlan" "[" "]" + + ::= " ' " " ' " + + is a valid XML string value. +---- + +==== Substitution Processing Rules + +Substitution expressions are processed for both initial job start and on +job restart. All substitution expressions must be resolved before the +job can be started or restarted, except for the partitionPlan operator, +which has deferred resolution - see section 8.8.1.4 for more on that. +After substitution expression resolution, the resultant XML document +must be checked for validity, according to the guidelines outlined in +section xref:_job_specification_language_2[13], Job Specification Language XSD. + +A substitution expression may reference a job parameter or a job +property by specifying the name of the parameter or property through a +substitution expression operator. This name is referred to generally in +substitution expression syntax as a "target name". There are four +substitution operators: + +. jobParameters - specifies to use a named parameter from the job +parameters. +. jobProperties - specifies to use a named property from among the +job's properties. +. systemProperties - specifies to use a named property from the system +properties. +. partitionPlan - specifies to use a named property from the partition +plan of a partitioned step. + +===== jobParameters Substitution Operator +The jobParameters substitution operator resolves to the value of the +job parameter with the specified target name. + +===== jobProperties Substitution Operator +The jobProperties substitution operator resolves to the value of the +job property with the specified target name. This property is found by +recursively searching from the innermost containment scope (this +includes earlier properties within the current scope) to the outermost +scope until a property with the specified target name is found. + +E.g. The batch runtime would attempt resolution of the jobProperties +operator specification in each of the two following reader property +definitions by first searching for earlier property definitions within +the reader properties collection, then the step properties collection +(there are none in this example), then the job properties collection (if +any). The search stops at the first occurrence of the specified target +name. + +[source,xml] +---- + + + + + + + + + + + + + + + + + +---- + +The resolved value for reader property "infile.name" would be +"postings.txt". + +The resolved value for reader property "outfile.name" would be +"readermessages.txt". + +===== systemProperties Substitution Operator + +The systemProperties substitution operator resolves to the value of the +system property with the specified target name. + +===== partitionPlan Substitution Operator + +The partitionPlan substitution operator resolves to the value of the +partition plan property with the specified target name from the +PartitionPlan returned by the PartitionMapper. Partition plan properties +are in scope only for the step to which the partition plan is defined. +The partitionPlan operator is resolved separately for each partition +before the partition execution begins. + +E.g. Given job, job1: + +[source,xml] +---- + + + + + + + + + + + + + + +---- + +And MyMapper implementation: + +[[app-listing]] +[source,java] +---- +public class MyMapper implements PartitionMapper \{ + public PartitionPlan mapPartitions() \{ + PartitionPlanImpl pp= new PartitionPlanImpl(); + pp.setPartitions(2); + + Properties p0= new Properties(); + p0.setProperty("myPartitionNumber", "0"); + p0.setProperty("outFile", "outFileA.txt"); + + Properties p1= new Properties(); + p1.setProperty("myPartitionNumber", "1"); + p1.setProperty("outFile", "outFileB.txt"); + + Properties[] partitionProperties= new Properties[2]; + partitionProperties[0]= p0; + partitionProperties[1]= p1; + pp.setPartitionProperties(partitionProperties); + + return pp; + } +} +---- + +The step1 chunk would run as two partitions, with the itemReader +property "infile.name" resolved to "file0.txt" and "file1.txt" for +partitions 0 and 1, respectively. Also, itemReader property +"outfile.name" would resolve to "outFileA.txt", and "outFileB.txt" for +partitions 0 and 1, respectively. + +===== Substitution Expression Default + +Substitutions expressions may include a default value using the ":" +operator. The default is applied if the substitution's principle value +expression resolves to the empty string "". + +===== Property Resolution Rule + +Properties specified by a substitution operator must be defined before +they can be used in a substitution expression. + +Examples: + +_Resolvable Property Reference_ + +The batch runtime will resolve a substitution reference to a property +that occurs before it is referenced. In the following example, property +"infile.name" is defined before it is used to form the value of property +"tmpfile.name". This is a resolvable reference.E.g. + +[source,xml] +---- + + +---- + +The batch runtime resolves a resolvable reference with the resolved +value of the specified property reference. + +_Unresolvable Property Reference_ + +The batch runtime will not resolve a substitution reference to a +property whose first occurrence is after it is referenced. In the +following example, property "infile.name" is defined after it is used to +form the value of property "tmpfile.name". This is a unresolvable +reference.E.g. + +[source,xml] +---- + + +---- + +The batch runtime resolves an unresolvable reference in XML to the +empty string "". + +===== Undefined Target Name Rule +A substitution expression operator that specifies an undefined target +name is assigned the empty string in XML. + +===== Job Restart Rule +Job Parameters may be specified on job restart. Substitution expression +resolution occurs on each restart. This makes it possible for new values +to be used in Job XML attributes during job restart. While all +substitution expressions resolve the same way on restart as on initial +start, there is a special rule for the number of partitions in a +partitioned step: + +The number of partitions in a partition plan + +The batch runtime determines the number of partitions in a partitioned +step the first time the step is attempted. The batch runtime remembers +that decision and applies it to that step on the next job execution, +once the previous job execution is restarted. The decision cannot be +altered by a substitution expression. The decision can be altered, +however, through a PartitionMapper artifact by specifying the "override" +option in the PartitionPlan object. See section 10.9.4 for details on +the PartitionPlan class. + +==== Examples +[source,xml] +---- + +---- + +Resolved property: infile.name="in.txt" + +[source,xml] +---- + +---- + +Resolved property: infile.name= value of infile.name job parameter + +[source,xml] +---- + +---- + +Resolved property: infile.name= value of infile.name system property + +[source,xml] +---- + +---- + +Resolved property: infile.name= value of infile.name job property + +[source,xml] +---- + +---- + +Resolved property: infile.name= value of infile.name from partition +plan for the current partition + +[source,xml] +---- + +---- + +Resolved property: infile.name = value of infile.name job parameter or +"in.txt" if infile.name job parameter is unspecified. + +=== Transitioning Rules + +==== Combining Transition Elements + +Any combination of transition elements can be included at the end of a +step, flow, or decision definition. Combinations can include zero, one, +or more than one instance of a single type of execution element,E.g. +next. + +Transition elements are evaluated in sequential order as they occur +within the JSL document. I.e. the appropriate exit status is compared +with the on attribute value of the first transition element in the +sequence and, if it matches, then the corresponding transition is +perfomed, and the rest of the transition elements are ignored. If not, +the second transition element is evaluated, etc. + +Example: +[source,xml] +---- + + + + + + +---- +==== Transitioning Precedence Rules + +The transition elements are always "evaluated" first, and if a match is +found, execution transitions accordingly (either to another execution +element or the job is stopped or failed). + +If a match is not found among the transition elements (which would +always be the case if there are no transition elements), then transition +proceeds as follows: + +1. If execution resulted in an unhandled exception, then the job ends +with batch status of FAILED. +2. If execution ended normally, and the execution element whose +execution is completing contains a next attribute, then execution +transitions to the element named by this next attribute value. +3. If execution ended normally, and the execution element whose +execution is completing does not contain a next attribute, then the job +ends normally (with COMPLETED batch status). For transitioning from a +step within a flow, this statement doesnt apply. See section xref:_transitioning_from_within_flows[8.9.4] for +details. + +The following examples illustrate how the above rules might be employed: + +Example 1: Transition to Step2, unless exit status of RC_ABORT seen, in +which case fail the job + +[source,xml] +---- + + + +---- + +Example 2: Transition to Step2, but if exception thrown, transition to +RecoveryStep. + +[source,xml] +---- + + + + + +---- + +Note that the second example shows it is possible for a job to executed +to COMPLETED status, even though a constituent step ends with FAILED +batch status (See section xref:_step_exception_handling[8.2.7]). + +==== Loop definition + +The specification prohibits next and to attribute values that result in +a "loop". More precisely, this means that no execution element can be +transitioned to twice within a single job execution. + +This wording is purposely written this way rather than merely saying no +execution element can be executed twice within a single job execution. +Say "step1" executed to completion during an initial execution which +ultimately failed, and upon restart we transitioned past "step1" without +executing it since it had already completed, but we subsequently +transitioned (back) to "step1". This may only be a single execution of +"step1" during a single job execution, but it still violates the looping +prohibition. + +The runtime may detect potential loops in an initial validation phase, +as described in section xref:_validation_rules[13.1], or may only detect loops once they occur. + +==== Transitioning From Within Flows + +. As mentioned in section xref:_flow[8.3], an execution element which is a child of a +flow may only transition to another execution element within the same +flow. The flows transition elements, however, would transition execution +to the next execution element at the level of the execution scope +containing the flow ,E.g. the job. + +. For terminating transitions (stop, end, fail) as well as failures caused +by unhandled exceptions, it is the entire job execution which is +terminated. It is not just the case that the flow alone is somehow +failed or ended yet with another level of transitioning occurring at the +containing (e.g. job) level. + +.. Note: transition via next outside of the flow is not permitted. If +this is not detected during job validation (see section xref:_validation_rules[13.1]), then at +runtime the job execution will end at this point with batch status of +FAILED. + +. When a child of a flow completes normally, and when there are no +matching transition elements as well as no next attribute at the level +of this child of a flow, then the flow ends. + +Another way of stating rules #2 and #3 in this section would be to say +that all the rules in section xref:_transitioning_precedence_rules[8.9.2] apply to transitions within flows +(i.e. among children of flows) and are effective at the job level, +except for rule #3 in section xref:_transitioning_precedence_rules[8.9.2] (this case does not necessarily end +the job). + +See the example at the end of section xref:_flow_level_transitions[8.9.5] for further clarification. + +==== Flow-level Transitions Undefined + +It is recognized that the specification is incomplete with respect to +how exactly flow transition elements are evaluated. Though the list in +section xref:_partitionplan[10.8.4] has an assertion in rule 3.e. that suggests using the +exit status of the last contained execution element as a flow-level exit +status, this does not seem to be a complete definition. For example, +what if the last execution element within the flow is a split + +This might be rectified in a later revision of this specification. In +the meantime it is suggested to avoid using flow-level transition +elements in light of this ambiguity. + +On the other hand, a transition from a flow via the next attribute of +the flow element is well-defined at the current spec level, and is +suggested. + +Example: +[source,xml] +---- + + + + + + + + + + + + + + + + +---- + +As noted in the comments inline, this example makes the following +points: + +* that a child of a flow can only transition to another child of +the same flow (Item 1. in section xref:_transitioning_from_within_flows[8.9.4]) + +* that a terminating transition terminates the job, not just the +flow somehow (Item 2. in section xref:_transitioning_from_within_flows[8.9.4]) + +* that a transition element which is a direct child of the flow +itself is currently UNDEFINED (section xref:_flow_level_transitions[8.9.5]) diff --git a/spec/src/main/asciidoc/job_specification_language_xml.adoc b/spec/src/main/asciidoc/job_specification_language_xml.adoc new file mode 100644 index 0000000..af897da --- /dev/null +++ b/spec/src/main/asciidoc/job_specification_language_xml.adoc @@ -0,0 +1,440 @@ +== Job Specification Language + +Jobs are described by a declarative Job Specification Language (JSL) +defined by an XML schema, also known informally as Job XML. + +=== Validation Rules + +The batch runtime must perform schema validation during JobOperator +start processing before the start method returns to the caller. A schema +validation error results in JobStartException. The implementation has +two choices for handling semantic errors in the JSL: + +1. Do semantic validation during JobOperator start processing before +returning to the caller. If there is a semantic validation error, the +implementation must throw JobStartException. +2. Do semantic validation after job execution begins. If a semantic +validation error occurs, the implementation must end the job in the +FAILED state. The implementation is advised to log sufficient error +information to enable problem resolution. + +Typical semantic validation the batch runtime should detect and handle +include, but is not limited to: + +1. no executable elements +2. non-existent transitions (e.g. next="value" where "value" does not +exist) +3. cycles among next values (e.g. step1:next=step2; step2:next=step1) + +=== JSL XSD +[[app-listing.jsl_xsd]] +[source,xml] +---- + + + + + Job Specification Language (JSL) specifies a job, + its steps, and directs their execution. + JSL also can be referred to as "Job XML". + + + + + + This is a helper type. Though it is not otherwise + called out by this name + in the specification, it captures the fact + that the xs:string value refers + to a batch artifact, across numerous + other JSL type definitions. + + + + + + + +The type of a job definition, whether concrete or +Abstract. This is the type of the root element of any JSL document. + + + + + + +The job-level properties, which are accessible + via the JobContext.getProperties() API in a batch +Artifact. + + + + + + + Note that "listeners" sequence order in XML does + not imply order of execution by +The batch runtime, per the + specification. + + + + + + + + + + + + + + + + + +The definition of an job, whether concrete or +Abstract. This is the + type of the root element of any JSL document. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This grouping provides allows for the reuse of the + 'end', 'fail', 'next', 'stop' element sequences which + may appear at the end of a 'step', 'flow', 'split' or 'decision'. +The term 'TransitionElements' does not formally appear in the spec, it +is +A schema convenience. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Note that "listeners" sequence order in XML does + not imply order of execution by +The batch runtime, per the + specification. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Specifies the checkpoint policy that governs + commit behavior for this chunk. + Valid values are: "item" or + "custom". The "item" policy means the + chunk is checkpointed after a + specified number of items are + processed. The "custom" policy means +The chunk is checkpointed +According to a checkpoint algorithm + implementation. Specifying + "custom" requires that the + checkpoint-algorithm element is also + specified. It is an optional +Attribute. The default policy is + "item". However, we chose not to define +A schema-specified default for this attribute. + + + + + + + Specifies the number of items to process per chunk + when using the item + checkpoint policy. It must be valid XML integer. + It is an optional +Attribute. The default is 10. The item-count +Attribute is ignored + for "custom" checkpoint policy. However, to + make it easier for implementations to support JSL inheritance + we abstain from defining a schema-specified default for this +Attribute. + + + + + + + Specifies the amount of time in seconds before + taking a checkpoint for the + item checkpoint policy. It must be valid + XML integer. It is an + optional attribute. The default is 0, which + means no limit. However, to + make it easier for implementations to + support JSL inheritance + we abstain from defining a schema-specified + default for this attribute. + When a value greater than zero is + specified, a checkpoint is taken when + time-limit is reached or + item-count items have been processed, + whichever comes first. The + time-limit attribute is ignored for + "custom" checkpoint policy. + + + + + + + Specifies the number of exceptions a step will + skip if any configured + skippable exceptions are thrown by chunk + processing. It must be a + valid XML integer value. It is an optional +Attribute. The default + is no limit. + + + + + + + Specifies the number of times a step will retry if +Any configured retryable + exceptions are thrown by chunk processing. + It must be a valid XML + integer value. It is an optional attribute. +The default is no + limit. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +---- From 96de44a13c163acb6eed21ee5b2353a01ff200ea Mon Sep 17 00:00:00 2001 From: Scott Kurz Date: Fri, 21 Feb 2020 17:55:23 -0500 Subject: [PATCH 2/2] Format JSL XSD Signed-off-by: Scott Kurz --- .../job_specification_language_xml.adoc | 839 +++++++++--------- 1 file changed, 433 insertions(+), 406 deletions(-) diff --git a/spec/src/main/asciidoc/job_specification_language_xml.adoc b/spec/src/main/asciidoc/job_specification_language_xml.adoc index af897da..1ee4794 100644 --- a/spec/src/main/asciidoc/job_specification_language_xml.adoc +++ b/spec/src/main/asciidoc/job_specification_language_xml.adoc @@ -31,410 +31,437 @@ exist) [source,xml] ---- - - - - Job Specification Language (JSL) specifies a job, - its steps, and directs their execution. - JSL also can be referred to as "Job XML". - - - - - - This is a helper type. Though it is not otherwise - called out by this name - in the specification, it captures the fact - that the xs:string value refers - to a batch artifact, across numerous - other JSL type definitions. - - - - - - - -The type of a job definition, whether concrete or -Abstract. This is the type of the root element of any JSL document. - - - - - - -The job-level properties, which are accessible - via the JobContext.getProperties() API in a batch -Artifact. - - - - - - - Note that "listeners" sequence order in XML does - not imply order of execution by -The batch runtime, per the - specification. - - - - - - - - - - - - - - - - - -The definition of an job, whether concrete or -Abstract. This is the - type of the root element of any JSL document. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This grouping provides allows for the reuse of the - 'end', 'fail', 'next', 'stop' element sequences which - may appear at the end of a 'step', 'flow', 'split' or 'decision'. -The term 'TransitionElements' does not formally appear in the spec, it -is -A schema convenience. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Note that "listeners" sequence order in XML does - not imply order of execution by -The batch runtime, per the - specification. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Specifies the checkpoint policy that governs - commit behavior for this chunk. - Valid values are: "item" or - "custom". The "item" policy means the - chunk is checkpointed after a - specified number of items are - processed. The "custom" policy means -The chunk is checkpointed -According to a checkpoint algorithm - implementation. Specifying - "custom" requires that the - checkpoint-algorithm element is also - specified. It is an optional -Attribute. The default policy is - "item". However, we chose not to define -A schema-specified default for this attribute. - - - - - - - Specifies the number of items to process per chunk - when using the item - checkpoint policy. It must be valid XML integer. - It is an optional -Attribute. The default is 10. The item-count -Attribute is ignored - for "custom" checkpoint policy. However, to - make it easier for implementations to support JSL inheritance - we abstain from defining a schema-specified default for this -Attribute. - - - - - - - Specifies the amount of time in seconds before - taking a checkpoint for the - item checkpoint policy. It must be valid - XML integer. It is an - optional attribute. The default is 0, which - means no limit. However, to - make it easier for implementations to - support JSL inheritance - we abstain from defining a schema-specified - default for this attribute. - When a value greater than zero is - specified, a checkpoint is taken when - time-limit is reached or - item-count items have been processed, - whichever comes first. The - time-limit attribute is ignored for - "custom" checkpoint policy. - - - - - - - Specifies the number of exceptions a step will - skip if any configured - skippable exceptions are thrown by chunk - processing. It must be a - valid XML integer value. It is an optional -Attribute. The default - is no limit. - - - - - - - Specifies the number of times a step will retry if -Any configured retryable - exceptions are thrown by chunk processing. - It must be a valid XML - integer value. It is an optional attribute. -The default is no - limit. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + Job Specification Language (JSL) specifies a job, + its steps, and directs their execution. + JSL also can be referred to as "Job XML". + + + + + + This is a helper type. Though it is not otherwise + called out by this name + in the specification, it captures the fact + that the xs:string value refers + to a batch artifact, across numerous + other JSL type definitions. + + + + + + + + The type of a job definition, whether concrete or + Abstract. This is the type of the root element of any JSL document. + + + + + + + The job-level properties, which are accessible + via the JobContext.getProperties() API in a batch + Artifact. + + + + + + + Note that "listeners" sequence order in XML does + not imply order of execution by + The batch runtime, per the + specification. + + + + + + + + + + + + + + + + + + The definition of an job, whether concrete or + Abstract. This is the + type of the root element of any JSL document. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + This grouping provides allows for the reuse of the + 'end', 'fail', 'next', 'stop' element sequences which + may appear at the end of a 'step', 'flow', 'split' or 'decision'. + The term 'TransitionElements' does not formally appear in the spec, it + is + A schema convenience. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Note that "listeners" sequence order in XML does + not imply order of execution by + The batch runtime, per the + specification. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Specifies the checkpoint policy that governs + commit behavior for this chunk. + Valid values are: "item" or + "custom". The "item" policy means the + chunk is checkpointed after a + specified number of items are + processed. The "custom" policy means + The chunk is checkpointed + According to a checkpoint algorithm + implementation. Specifying + "custom" requires that the + checkpoint-algorithm element is also + specified. It is an optional + Attribute. The default policy is + "item". However, we chose not to define + A schema-specified default for this attribute. + + + + + + + Specifies the number of items to process per chunk + when using the item + checkpoint policy. It must be valid XML integer. + It is an optional + Attribute. The default is 10. The item-count + Attribute is ignored + for "custom" checkpoint policy. However, to + make it easier for implementations to support JSL inheritance + we abstain from defining a schema-specified default for this + Attribute. + + + + + + + Specifies the amount of time in seconds before + taking a checkpoint for the + item checkpoint policy. It must be valid + XML integer. It is an + optional attribute. The default is 0, which + means no limit. However, to + make it easier for implementations to + support JSL inheritance + we abstain from defining a schema-specified + default for this attribute. + When a value greater than zero is + specified, a checkpoint is taken when + time-limit is reached or + item-count items have been processed, + whichever comes first. The + time-limit attribute is ignored for + "custom" checkpoint policy. + + + + + + + Specifies the number of exceptions a step will + skip if any configured + skippable exceptions are thrown by chunk + processing. It must be a + valid XML integer value. It is an optional + Attribute. The default + is no limit. + + + + + + + Specifies the number of times a step will retry if + Any configured retryable + exceptions are thrown by chunk processing. + It must be a valid XML + integer value. It is an optional attribute. + The default is no + limit. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ----