├── DCO1.1.txt ├── LICENSE ├── README.md ├── Tools └── JSR352SpecDocLinkGenerator ├── java.net.backup ├── jbatch.bugzilla.2017-04-21.csv ├── jbatch.bugzilla.2017-04-21.xml └── jbatch_public_MLM.tgz ├── pom.xml └── specification ├── README.md ├── latest └── jsr352_1_0_a.pdf ├── pom.xml └── src └── main └── asciidoc ├── acknowledgements.adoc ├── applicability.adoc ├── batch_programming_model.adoc ├── batch_runtime_spec.adoc ├── batch_xml_xsd.adoc ├── domain_language.adoc ├── forward.adoc ├── images ├── filelist.xml ├── header.htm ├── image001.png ├── image002.png ├── image003.png ├── image004.png ├── image005.png ├── image006.png ├── image007.png ├── image008.png ├── image009.png ├── image010.png ├── item0001.xml ├── props0002.xml └── themedata.xml ├── introduction.adoc ├── job_runtime_lifecycle.adoc ├── job_specification_language.adoc ├── job_specification_language_xml.adoc ├── jsr352_1_0_a.adoc └── license.adoc /DCO1.1.txt: -------------------------------------------------------------------------------- 1 | Developer Certificate of Origin 2 | Version 1.1 3 | 4 | Copyright (C) 2004, 2006 The Linux Foundation and its contributors. 5 | 1 Letterman Drive 6 | Suite D4700 7 | San Francisco, CA, 94129 8 | 9 | Everyone is permitted to copy and distribute verbatim copies of this 10 | license document, but changing it is not allowed. 11 | 12 | 13 | Developer's Certificate of Origin 1.1 14 | 15 | By making a contribution to this project, I certify that: 16 | 17 | (a) The contribution was created in whole or in part by me and I 18 | have the right to submit it under the open source license 19 | indicated in the file; or 20 | 21 | (b) The contribution is based upon previous work that, to the best 22 | of my knowledge, is covered under an appropriate open source 23 | license and I have the right under that license to submit that 24 | work with modifications, whether created in whole or in part 25 | by me, under the same open source license (unless I am 26 | permitted to submit under a different license), as indicated 27 | in the file; or 28 | 29 | (c) The contribution was provided directly to me by some other 30 | person who certified (a), (b) or (c) and I have not modified 31 | it. 32 | 33 | (d) I understand and agree that this project and the contribution 34 | are public and that a record of the contribution (including all 35 | personal information I submit with it, including my sign-off) is 36 | maintained indefinitely and may be redistributed consistent with 37 | this project or the open source license(s) involved. 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ARCHIVED (read-only) 2 | 3 | Archived former home of the Java Batch standard (JSR 352, Batch Applications for the Java Platform). 4 | 5 | Now superseded by the Jakarta Batch project: https://github.com/eclipse-ee4j/batch-api/ 6 | 7 | ### STILL OF INTEREST 8 | 9 | JSR 352 java.net site backup in this repo 10 | -------------------------------------------------------------------------------- /Tools/JSR352SpecDocLinkGenerator: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | #PURPOSE 4 | #The purpose of this script is to edit the the asciidoc source files for the JSR 352 specification document to include internal references to sections 5 | 6 | #METHOD 7 | #The section numbers are automatically generated at runtime 8 | #The in-text references are just written in, and plentiful. 9 | #This script will use an existing document to create a list of setion titles and their numbers 10 | #All instances of section number references in the text will be made into a xref to that section 11 | #The title of the section is the link, not the number. 12 | #Files are edited in place. 13 | 14 | #IMPORTANT ASSUMPTIONS 15 | #1. This script should exist in the "Tools" directory, which is even with the specification folder, README, and top pom.xml 16 | #2. For proper operation, the src docs(.adoc) should not contain any xref's when the script is run. 17 | #It will fail to find those references already in this format. If section numbers changed, existing links will not be updated. 18 | #3. The generated PDF is not currently open. if it is, the automatic build at the end of the script will fail. 19 | 20 | 21 | #For testing, if you're worried about messing up clean files 22 | #Make a clean copy of the src directory, name it "srcClean" 23 | # rm -rf ../specification/src #clean out previous run, if it exists. If not, files will be regenerated anyway 24 | # cp -r ../specification/srcClean ../specification/src 25 | 26 | #The section numbers and titles need be taken from an existing copy of the doc. 27 | #The HTML version is much easier to parse 28 | #check if the file we need exists, and build it if it doesn't 29 | if [ ! -f ../specification/target/generated-docs/jsr352_1_0_a.html ] 30 | then 31 | echo "Generated file not found, making now" 32 | cd .. 33 | mvn clean package 34 | cd Tools 35 | fi 36 | 37 | #grab the html elements that define section name, and the ID we need for the links 38 | # .h. id=\" Matches the ", check that a section number exists 41 | 42 | grep ".h. id=\"_.*\".[0-9]." ../specification/target/generated-docs/jsr352_1_0_a.html > sections 43 | 44 | # This extracts the ID and the sections number, and will have a superfluous "> in between, from the html 45 | # -Eo Use extended regex, only output the parts that match, not the whole line 46 | # -.* The section title 47 | # [0-9]{1,2}\. One or two digits followed by a period 48 | # ( ){1,5} That pattern one to five times (five is the max observed length of a section reference) 49 | 50 | grep -Eo "_.*([0-9]{1,2}\.){1,5}" sections > key 51 | 52 | # remove the extra "> and separate the fields 53 | sed "s/\">/\t/g" key > key2 54 | 55 | #arrange first field in file for easy read into array 56 | cut -f1 key2 > titlesfile 57 | 58 | # The previous greps occasionally pull in an extra "version.", because * is greedy. we can remove these because they come after spaces 59 | # All numbers come with an extra . at the end, which won't be in the doc, so we remove those too 60 | # the "." in the numbers will be parsed by regex as any char. need to escape those 61 | # \s.*$ remove anything from a space to the end of the line` 62 | # \.$ remove . at end of line 63 | # \. replace all . with \. 64 | 65 | cut -f2 key2 | sed -e "s/ .*$//" -e "s/\.$//" -e "s/\./\\\./g" > sectionsfile 66 | 67 | #Put info into parallel arrays for indexing 68 | readarray -t sects < sectionsfile 69 | readarray -t titles < titlesfile 70 | 71 | #clean up files 72 | rm -f sections key key2 sectionsfile titlesfile 73 | 74 | #start a loop to cover all references 75 | cd ../specification/src/main/asciidoc 76 | i=0; 77 | for item in "${sects[@]}"; do 78 | 79 | #It is known that these sections do not have references to them, likely because they are general and do not contain information. 80 | #Being these simple numbers, they cause a lot of matches that just need to be filtered out. It's easier and faster to not even search for them. 81 | #If the docs have been updated to include a reference to one of these sections, that section should be removed from this list. 82 | #Section 13 does in fact have a single reference 83 | if [[ "${sects[$i]}" =~ ^(1|2|3|4|5|6|7|8|9|10|11|12|14|15)$ ]]; then 84 | let "i=i+1" 85 | continue 86 | fi 87 | 88 | #The find command generates a list of files in the directory so we can change each one 89 | 90 | #Together, these 3 regexes cover all cases of how a section reference can appear 91 | #I did a lot of struggling combining them into one, with incorrect results. 92 | #If you can combine them into one that works, please do. As it is, using the ; to chain commands doesn't affect runtime 93 | 94 | #cases: Either a space, bar, or open paren in front of ref, or nothing in front; start of line 95 | #After word: make sure it's not a ".[0-9]", because that means it's part of a longer ref 96 | #sometimes there is not a second char after to check, but an EOL. These cases only occur with a ".", "," or ")" between. 97 | #These combinations cover all possible cases (there is no case with start of line, ref, EOL) 98 | find . -type f -name "*.adoc" | xargs sed -i -r "s/^${sects[$i]}(.[^0-9])/xref:${titles[$i]}[${sects[$i]}]\1/g;\ 99 | s/([ \|(])(${sects[$i]})(.[^0-9])/\1xref:${titles[$i]}[\2]\3/g;\ 100 | s/([ \|(])(${sects[$i]})([\.,)])$/\1xref:${titles[$i]}[\2]\3/g" 101 | 102 | 103 | #format is "xref:[]" where <> denotes values to enter, not actual brackets 104 | 105 | let "i=i+1" 106 | done 107 | 108 | 109 | 110 | #generate the pdf 111 | cd ../../../.. 112 | mvn clean package 113 | 114 | #return to starting directory 115 | cd Tools -------------------------------------------------------------------------------- /java.net.backup/jbatch.bugzilla.2017-04-21.csv: -------------------------------------------------------------------------------- 1 | "Bug ID","Product","Component","Assignee","Status","Resolution","Summary","Changed" 2 | 4834,"jbatch","SPEC","cvignola","NEW","---","SPEC - JobExecution handed to JobOperator client ""by reference"" or ""by value""?","2015-10-01 13:47:33" 3 | 5075,"jbatch","SPEC","ScottKurz","NEW","---","Injecting JobOperator","2015-10-01 13:47:31" 4 | 5382,"jbatch","SPEC","ScottKurz","NEW","---","Support common java types in @BatchProperty injection","2015-10-08 13:54:02" 5 | 5383,"jbatch","SPEC","ScottKurz","NEW","---","Support @PostConstruct and @PreDestroy callbacks in batch artifacts","2016-03-24 14:39:42" 6 | 5386,"jbatch","SPEC","ScottKurz","NEW","---","Consider allowing decision as first execution element within job.","2015-10-01 13:47:32" 7 | 5416,"jbatch","SPEC","ScottKurz","NEW","---","Require artifact loading via CDI when CDI is ""available"" (beans.xml is present)?","2015-10-01 13:47:32" 8 | 5432,"jbatch","SPEC","ScottKurz","NEW","---","Add getException method to StepExecution interface","2015-10-01 13:47:31" 9 | 5502,"jbatch","SPEC","ScottKurz","NEW","---","Metrics across retry","2015-10-01 13:47:31" 10 | 5515,"jbatch","SPEC","ScottKurz","NEW","---","Address propagation of contexts (JNDI, classloader?) across threads, in EE","2015-10-01 13:47:30" 11 | 5701,"jbatch","SPEC","ScottKurz","NEW","---","Support @BatchProperty injection on method, not just field","2015-10-01 13:47:32" 12 | 5728,"jbatch","SPEC","ScottKurz","NEW","---","Section 11 threading requirements for Job's and Step's should be relaxed","2015-10-01 13:47:30" 13 | 5760,"jbatch","SPEC","ScottKurz","NEW","---","Spec should clarify that reader/write close() get called after exceptions","2016-06-20 20:47:36" 14 | 5776,"jbatch","SPEC","ScottKurz","NEW","---","Support StepContext.getJobContext() method","2015-10-01 13:47:29" 15 | 5779,"jbatch","SPEC","ScottKurz","NEW","---","Clarify that on restart the ""defaults"" for the ""restartParameters"" java.util.Properties object should be used (i.e. that a getProperty is done)","2015-10-06 18:09:10" 16 | 5926,"jbatch","SPEC","ScottKurz","NEW","---","add attribute to job xml partition element to enable distributed/clustered execution","2016-01-13 21:29:48" 17 | 6234,"jbatch","SPEC","ScottKurz","NEW","---","Add @Documented meta-annotation to BatchProperty definition","2014-07-14 20:56:38" 18 | 6288,"jbatch","SPEC","ScottKurz","NEW","---","Consider a beforeStep/afterStep-equivalent that runs on a partition thread.","2016-03-30 15:14:36" 19 | 6356,"jbatch","SPEC","ScottKurz","NEW","---","PartitionAnalyzer transaction boundary on partitioned chunk (and batchlet) step need clarification","2015-12-10 14:06:31" 20 | 6427,"jbatch","SPEC","ScottKurz","NEW","---","Exception on analyzer thread leaves partitions executing while failing job, causing an immediate job restart to fail.","2015-09-03 16:17:25" 21 | 6456,"jbatch","SPEC","ScottKurz","NEW","---","Spec says that writer should be closed before reader. RI does things in reverse.","2016-03-10 22:15:07" 22 | 6457,"jbatch","SPEC","ScottKurz","NEW","---","On retry with rollback, we only want to process the most recent chunk with item-size = 1, even with custom checkpoint algorithm","2015-01-05 19:31:41" 23 | 6458,"jbatch","SPEC","ScottKurz","NEW","---","Should ItemReadListener get called after readItem() return null?","2014-10-22 20:16:58" 24 | 6473,"jbatch","SPEC","ScottKurz","NEW","---","AbstractItemWriteListener missing from spec.","2014-10-21 19:20:09" 25 | 6490,"jbatch","SPEC","ScottKurz","NEW","---","Add an API to get StepExecution for individual partitions","2016-02-09 15:13:07" 26 | 6509,"jbatch","SPEC","ScottKurz","NEW","---","item-count text mentions ""number of items processed"" when EG had decided on ""number of items read""","2014-11-09 21:21:51" 27 | 6511,"jbatch","SPEC","ScottKurz","NEW","---","improve working on 'skippable' and 'retryable' exceptions","2014-11-10 17:41:58" 28 | 6512,"jbatch","SPEC","ScottKurz","NEW","---","Clarify if READ_RETRY_COUNT and onReadError (and corresponding for skip) get called on error in #checkpointInfo","2014-11-10 17:46:56" 29 | 6581,"jbatch","SPEC","ScottKurz","NEW","---","Suppot script languages in certain batch artifacts","2015-09-02 16:45:02" 30 | 6587,"jbatch","SPEC","ScottKurz","NEW","---","Consider clarifying when ChunkListener#onError() is called","2015-10-19 20:23:43" 31 | 6702,"jbatch","SPEC","ScottKurz","NEW","---","skip and retry for exceptions from chunk listeners","2016-03-24 14:43:25" 32 | 6703,"jbatch","SPEC","ScottKurz","NEW","---","To clarify the behavior after skip-limit and retry-limit are exceeded","2015-02-03 18:24:05" 33 | 6790,"jbatch","SPEC","ScottKurz","NEW","---","JavaDoc clarification for JobExecution getStartTime() and getEndTime() return values","2015-09-03 16:18:23" 34 | 6796,"jbatch","SPEC","ScottKurz","NEW","---","@BatchProperty injection should keep field default value in case of no matching batch property","2015-09-01 21:23:35" 35 | 6825,"jbatch","SPEC","ScottKurz","NEW","---","Step failed with element not restartable","2016-02-10 17:01:35" 36 | 6828,"jbatch","SPEC","ScottKurz","NEW","---","Change the words ""SkipListener"" and ""RetryListener"" to specific listener names","2015-03-19 17:37:40" 37 | 6975,"jbatch","SPEC","ScottKurz","NEW","---","Clarify timepoint and status of job when JobListener#afterJob() is called","2015-05-05 19:26:56" 38 | 7282,"jbatch","SPEC","ScottKurz","NEW","---","Do we want to update XSD ?","2015-09-22 15:21:51" 39 | 7284,"jbatch","SPEC","ScottKurz","NEW","---","Standardize waiting/blocking for job termination","2015-09-05 09:11:58" 40 | 7288,"jbatch","SPEC","ScottKurz","NEW","---","Define custom CDI scopes for batch (@StepScoped, @JobScoped), possibly @ChunkScoped along with initialized/destroyed events","2016-03-24 16:17:38" 41 | 7289,"jbatch","SPEC","ScottKurz","NEW","---","Implicit conversion in chunk steps","2015-09-05 09:23:40" 42 | 7290,"jbatch","SPEC","ScottKurz","NEW","---","parallel processing for processors","2015-09-05 09:30:49" 43 | 7291,"jbatch","SPEC","ScottKurz","NEW","---","Bean Validation integration","2015-10-06 21:26:18" 44 | 7295,"jbatch","SPEC","ScottKurz","NEW","---","typed ItemWriter, ItemReader, ItemProcessor, etc","2016-03-25 19:17:33" 45 | 7318,"jbatch","SPEC","ScottKurz","NEW","---","Provider JobOperator-related DTOs","2015-09-23 19:21:06" 46 | 7337,"jbatch","SPEC","ScottKurz","NEW","---","Allow override on JSL-defined (in addition to mapper-constructed plan)","2015-10-06 18:03:17" 47 | 7338,"jbatch","SPEC","ScottKurz","NEW","---","JobOperator called from within existing global transaction","2015-10-06 21:10:24" 48 | 7342,"jbatch","SPEC","ScottKurz","NEW","---","Clarify that analyzer calls from collector are in-order (per partition)","2015-10-08 15:54:10" 49 | 7350,"jbatch","SPEC","ScottKurz","NEW","---","Consider adding onError to Batchlet","2016-04-22 18:11:39" 50 | 7361,"jbatch","SPEC","ScottKurz","NEW","---","Provide a stop() call for chunk steps","2015-10-22 18:25:40" 51 | 7368,"jbatch","SPEC","ScottKurz","NEW","---","add javax.batch.operations.JobOperator#getJobExecutions(long)","2016-03-23 17:23:46" 52 | 7374,"jbatch","SPEC","ScottKurz","NEW","---","Give app (ChunkListener?) control at end of chunk step, but before close()","2015-11-02 14:46:03" 53 | 7375,"jbatch","SPEC","ScottKurz","NEW","---","Facilitate chunk artifacts' awareness that they're in retry-with-rollback processing","2015-11-04 15:48:53" 54 | 7473,"jbatch","SPEC","ScottKurz","NEW","---","provide API for determining whether or not current execution, or given execution is a restart","2016-01-11 15:32:23" 55 | 7474,"jbatch","SPEC","ScottKurz","NEW","---","Provide API to flush persistent user data (esp. for batchlet)","2016-02-07 16:24:15" 56 | 7475,"jbatch","SPEC","ScottKurz","NEW","---","Provide ability to set property with output of some earlier portion of the execution.","2016-01-12 17:10:22" 57 | 7479,"jbatch","SPEC","ScottKurz","NEW","---","Disallow certain characters in job, step, flow, split & decision id string values","2016-01-12 18:28:33" 58 | 7647,"jbatch","SPEC","ScottKurz","NEW","---","NoSuchJobException vs. 0/empty results on getRunningExecutions() etc.","2016-04-25 15:52:30" 59 | 7656,"jbatch","SPEC","ScottKurz","NEW","---","Add a progress API","2016-05-03 06:21:24" 60 | 7684,"jbatch","SPEC","ScottKurz","NEW","---","Provide capability to avoid having a global transaction around open and close","2016-05-25 20:45:26" 61 | 112710,"jbatch","SPEC","ScottKurz","NEW","---","Clarify step exit status from batchlet process method return value and StepContext.setExitStatus","2016-09-14 15:00:35" 62 | 4798,"jbatch","SPEC","cvignola","ASSIGNED","---","SPEC - document concurrency and thread-safetyness requirement in JobOperator","2015-10-01 13:47:30" 63 | 4739,"jbatch","SPEC","ScottKurz","ASSIGNED","---","SPEC - JSL does not refer to the interfaces required","2015-10-01 13:47:31" 64 | 4518,"jbatch","source","cvignola","RESOLVED","WONTFIX","Both ItemReader and ItemWriter should extend AutoCloseable","2013-01-24 23:47:12" 65 | 6105,"jbatch","source","ScottKurz","RESOLVED","FIXED","Couldn't run ""mvn clean install"" on JSR352.API direcotyr","2015-05-22 13:59:17" 66 | 6680,"jbatch","RI","ScottKurz","RESOLVED","FIXED","jbatch RI doesn't work with Oracle Database","2015-05-22 13:41:59" 67 | 7481,"jbatch","RI","ScottKurz","RESOLVED","MOVED","The BatchUtils doesn't purge data in all tables","2016-01-14 15:11:07" 68 | 4589,"jbatch","source","cvignola","RESOLVED","INVALID","Wrong license header in all Spec (API) files and License.txt","2013-02-22 20:56:31" 69 | 4171,"jbatch","source","cvignola","RESOLVED","FIXED","ChunkContext is missing","2013-02-05 20:09:24" 70 | 4174,"jbatch","source","cvignola","RESOLVED","FIXED","Missing XSD for batch.xml","2013-02-22 17:35:39" 71 | 4284,"jbatch","source","cvignola","RESOLVED","FIXED","Do we need skip/retry or at least callback w/ exception for error on chunk commit?","2013-02-05 22:18:50" 72 | 4294,"jbatch","source","cvignola","RESOLVED","FIXED","Batch status should be an enum","2013-01-17 14:39:19" 73 | 4520,"jbatch","source","cvignola","RESOLVED","WORKSFORME","Exit status wildcards","2013-01-17 14:40:44" 74 | 4523,"jbatch","source","cvignola","RESOLVED","FIXED","Spec coding conventions","2013-01-25 18:04:02" 75 | 4524,"jbatch","source","cvignola","RESOLVED","FIXED","JobInstance definition clarification","2013-01-24 00:14:03" 76 | 4525,"jbatch","source","cvignola","RESOLVED","FIXED","JobInstance completion clarification","2013-01-24 19:24:42" 77 | 4526,"jbatch","source","cvignola","RESOLVED","FIXED","Step's next attribute clarification","2013-01-25 00:03:44" 78 | 4527,"jbatch","source","cvignola","RESOLVED","FIXED","Missing reference","2013-01-23 22:28:02" 79 | 4528,"jbatch","source","cvignola","RESOLVED","FIXED","Document abstract class methods are ""default"" not ""optional""","2013-01-24 22:44:19" 80 | 4529,"jbatch","source","cvignola","RESOLVED","FIXED","Confusing description for checkpointing","2013-01-24 01:46:10" 81 | 4530,"jbatch","source","cvignola","RESOLVED","FIXED","item-count is confusing","2013-01-23 21:30:21" 82 | 4531,"jbatch","source","cvignola","RESOLVED","WORKSFORME","remove time-limit from chunk configuration","2013-01-24 20:18:10" 83 | 4532,"jbatch","source","cvignola","RESOLVED","FIXED","buffer-items should be about reading and not writing","2013-02-01 23:23:26" 84 | 4533,"jbatch","source","cvignola","RESOLVED","FIXED","Fix Javadoc for getStepExecutions","2013-01-25 18:49:40" 85 | 4534,"jbatch","source","cvignola","RESOLVED","WORKSFORME","What is the purpose of the save-as attribute on a property?","2013-01-24 20:30:11" 86 | 4535,"jbatch","source","cvignola","RESOLVED","FIXED","next element should not allow looping (5.2.5)","2013-01-23 22:12:22" 87 | 4536,"jbatch","source","cvignola","RESOLVED","WORKSFORME","PartitionReducer seems redundant","2013-02-01 23:51:36" 88 | 4537,"jbatch","source","cvignola","RESOLVED","MOVED","How are flows identified within a split?","2013-02-02 01:19:19" 89 | 4538,"jbatch","source","cvignola","RESOLVED","FIXED","Double period at end of bullet.","2013-01-24 01:56:36" 90 | 4539,"jbatch","source","cvignola","RESOLVED","FIXED","Exit Status verbiage misleading","2013-01-23 23:22:08" 91 | 4540,"jbatch","source","cvignola","RESOLVED","FIXED","Batch and Exit status for splits","2013-01-23 21:25:09" 92 | 4541,"jbatch","source","cvignola","RESOLVED","FIXED","Incomplete sentence in 5.8","2013-02-04 20:03:26" 93 | 4542,"jbatch","source","cvignola","RESOLVED","FIXED","Merge examples of merge=false would be helpful","2013-01-25 18:36:44" 94 | 4543,"jbatch","source","cvignola","RESOLVED","WORKSFORME","checkpointInfo should take a context of some kind","2013-02-02 01:22:40" 95 | 4544,"jbatch","source","cvignola","RESOLVED","FIXED","Syntax highlighting missing for AbstractItemWriter","2013-01-25 17:52:47" 96 | 4545,"jbatch","source","cvignola","RESOLVED","FIXED","Not all listener methods define their transactional scope","2013-01-23 19:59:30" 97 | 4546,"jbatch","source","cvignola","RESOLVED","WORKSFORME","Passing the BatchContext where apropriate instead of relying solely on injection","2013-02-02 00:16:03" 98 | 4547,"jbatch","source","cvignola","RESOLVED","FIXED","ChunkListener execution is not clear via the description (6.2.3)","2013-01-23 20:23:15" 99 | 4548,"jbatch","source","cvignola","RESOLVED","DUPLICATE","Add onError to ChunkListener","2013-02-04 23:26:24" 100 | 4549,"jbatch","source","cvignola","RESOLVED","WORKSFORME","Listener Error method naming consistency","2013-02-04 23:13:34" 101 | 4550,"jbatch","source","cvignola","RESOLVED","FIXED","Odd highlighting in the syntax highlighting","2013-01-24 01:59:03" 102 | 4551,"jbatch","source","cvignola","RESOLVED","WORKSFORME","Parameter scoping","2013-01-18 20:03:41" 103 | 4552,"jbatch","source","cvignola","RESOLVED","FIXED","Mention examples of implementation-specific loaders","2013-01-25 18:19:13" 104 | 4553,"jbatch","source","cvignola","RESOLVED","WORKSFORME","Functionality for instance creation using batch.xml","2013-01-24 23:12:12" 105 | 4554,"jbatch","source","cvignola","RESOLVED","WORKSFORME","Passing data around during a batch run and BatchContext's transient data","2013-03-01 18:50:03" 106 | 4555,"jbatch","source","cvignola","RESOLVED","FIXED","Remove FlowContext interface","2013-01-23 22:09:55" 107 | 4556,"jbatch","source","cvignola","RESOLVED","INVALID","Syntax highlighting for SplitContext (7.8.5)","2013-02-28 01:27:44" 108 | 4557,"jbatch","source","cvignola","RESOLVED","FIXED","Is SplitContext necessary?","2013-02-27 21:14:20" 109 | 4558,"jbatch","source","cvignola","RESOLVED","FIXED","Using getter/setter standards for PartitionPlan (7.8.8)","2013-01-18 17:35:22" 110 | 4559,"jbatch","source","cvignola","RESOLVED","WORKSFORME","How does JobOperator#getJobNames() work?","2014-05-11 07:24:15" 111 | 4560,"jbatch","source","cvignola","RESOLVED","FIXED","JobOperator#getRunningInstances is confusing.","2013-03-01 18:00:24" 112 | 4561,"jbatch","source","cvignola","RESOLVED","DUPLICATE","Parameters apply to a JobExecution","2013-01-23 18:57:45" 113 | 4562,"jbatch","source","cvignola","RESOLVED","FIXED","JobParameters on restart","2013-02-14 18:51:02" 114 | 4563,"jbatch","source","cvignola","RESOLVED","FIXED","A JobExecution should be abandoned, not a JobInstance","2013-02-14 18:47:07" 115 | 4564,"jbatch","source","cvignola","RESOLVED","FIXED","Clarify exception definition","2013-01-23 23:47:58" 116 | 4565,"jbatch","SPEC","cvignola","RESOLVED","WONTFIX","SPEC Use diagrams instead of text based flows","2015-09-03 14:30:58" 117 | 4566,"jbatch","source","cvignola","RESOLVED","FIXED","Batchlet partitioning should be removed","2013-02-27 21:10:28" 118 | 4567,"jbatch","source","cvignola","RESOLVED","WORKSFORME","Open and Close are executed in their own transaction?","2013-01-28 22:51:28" 119 | 4568,"jbatch","source","cvignola","RESOLVED","FIXED","SplitCollector and SplitAnalyzer should be removed","2013-01-18 17:31:33" 120 | 4569,"jbatch","source","cvignola","RESOLVED","FIXED","Note that stopping a job is a request","2013-01-23 20:34:50" 121 | 4570,"jbatch","source","cvignola","RESOLVED","FIXED","Remove @BatchContext","2013-01-18 19:14:51" 122 | 4571,"jbatch","source","cvignola","RESOLVED","FIXED","Delete getExecutions method (redundant)","2013-01-18 19:39:32" 123 | 4575,"jbatch","source","cvignola","RESOLVED","FIXED","Spec should say to use TCCL for artifact loading rather than System CL (SE) or EE CL","2013-01-25 18:46:48" 124 | 4578,"jbatch","source","cvignola","RESOLVED","FIXED","JobOperator.getJobInstances() ordering? zero-based vs. one-based","2013-01-28 18:56:29" 125 | 4579,"jbatch","source","cvignola","RESOLVED","INVALID","Should we say anything about resolution of systemProperties value","2013-02-04 22:14:43" 126 | 4582,"jbatch","source","cvignola","RESOLVED","FIXED","Property default value expression may not contain default value expression","2013-01-26 20:05:53" 127 | 4586,"jbatch","source","cvignola","RESOLVED","FIXED","Removing Language of EE in Lifecycle flows","2013-01-24 20:26:24" 128 | 4590,"jbatch","source","cvignola","RESOLVED","FIXED","Minor wording suggestion on 'filter' from process returning 'null'","2013-01-28 19:12:23" 129 | 4596,"jbatch","source","cvignola","RESOLVED","FIXED","2 Introduction to JSR 352 should go on next page","2013-01-31 19:36:25" 130 | 4597,"jbatch","source","cvignola","RESOLVED","FIXED","4 Domain Language of Batch - ItemProcessor is optional","2013-01-31 19:43:39" 131 | 4598,"jbatch","source","cvignola","RESOLVED","FIXED","4.1.1 JobInstance parenthesized sentence","2013-01-31 19:55:16" 132 | 4599,"jbatch","source","cvignola","RESOLVED","FIXED","4.1.2 JobParameters","2013-01-31 20:50:45" 133 | 4600,"jbatch","source","cvignola","RESOLVED","FIXED","4.2 Step","2013-02-01 20:27:12" 134 | 4601,"jbatch","source","cvignola","RESOLVED","FIXED","4.5 - 4.7 Inconsistent use of interface name casing","2013-02-01 22:33:07" 135 | 4602,"jbatch","source","cvignola","RESOLVED","FIXED","5.1.3 Job Level Properties","2013-02-01 22:44:12" 136 | 4603,"jbatch","source","cvignola","RESOLVED","FIXED","5.2.1.4 Chunk Exception Handling incomplete sentence","2013-02-01 22:50:46" 137 | 4604,"jbatch","source","cvignola","RESOLVED","FIXED","5.2.3 Step Level Properties","2013-02-01 22:58:44" 138 | 4605,"jbatch","source","cvignola","RESOLVED","FIXED","5.2.4.1 Step Level Listener Properties","2013-01-31 18:39:23" 139 | 4606,"jbatch","source","cvignola","RESOLVED","FIXED","5.2.6.1 Partition Plan incomplete XML","2013-01-31 19:06:10" 140 | 4607,"jbatch","source","cvignola","RESOLVED","FIXED","5.2.6.2 Partition Properties","2013-01-31 19:39:01" 141 | 4608,"jbatch","source","cvignola","RESOLVED","FIXED","5.2.6.3 Partition Mapper","2013-01-31 19:45:51" 142 | 4609,"jbatch","source","cvignola","RESOLVED","FIXED","5.2.6.3.1 Mapper Properties","2013-01-31 20:01:27" 143 | 4610,"jbatch","source","cvignola","RESOLVED","FIXED","5.3 Flow","2013-01-31 20:52:59" 144 | 4611,"jbatch","source","cvignola","RESOLVED","FIXED","5.4 Split","2013-02-01 20:34:41" 145 | 4612,"jbatch","source","cvignola","RESOLVED","FIXED","5.5 Batch and Exit Status","2013-02-01 22:36:22" 146 | 4613,"jbatch","source","cvignola","RESOLVED","FIXED","5.5.1.2 End Element","2013-02-01 22:45:22" 147 | 4614,"jbatch","source","cvignola","RESOLVED","FIXED","5.6 Decision","2013-02-01 22:53:48" 148 | 4615,"jbatch","source","cvignola","RESOLVED","FIXED","5.6.1 Fail Element","2013-02-01 23:00:48" 149 | 4616,"jbatch","source","cvignola","RESOLVED","FIXED","5.6.2 End Element","2013-01-31 18:42:00" 150 | 4617,"jbatch","source","cvignola","RESOLVED","FIXED","5.6.3 Stop Element","2013-01-31 19:07:30" 151 | 4618,"jbatch","source","cvignola","RESOLVED","FIXED","5.6.4 Next Element","2013-01-31 19:40:57" 152 | 4619,"jbatch","source","cvignola","RESOLVED","FIXED","5.7 Job XML Substitution","2013-01-31 19:52:48" 153 | 4620,"jbatch","source","cvignola","RESOLVED","FIXED","6.1.1.2 ItemProcessor Interface","2013-01-31 20:49:04" 154 | 4621,"jbatch","source","cvignola","RESOLVED","FIXED","6.2.2 StepListener Interface","2013-01-31 20:59:14" 155 | 4622,"jbatch","source","cvignola","RESOLVED","FIXED","6.7 Transactionality","2013-02-01 20:37:49" 156 | 4623,"jbatch","source","cvignola","RESOLVED","FIXED","7.3 JobOperator","2013-02-01 22:37:32" 157 | 4624,"jbatch","source","cvignola","RESOLVED","FIXED","7.4 Batch Artifact Loading","2013-02-01 22:47:39" 158 | 4625,"jbatch","source","cvignola","RESOLVED","FIXED","7.5 Job XML Loading","2013-02-01 22:55:46" 159 | 4626,"jbatch","source","cvignola","RESOLVED","FIXED","7.6.1 META-INF/batch.xml","2013-01-31 18:31:55" 160 | 4627,"jbatch","source","cvignola","RESOLVED","FIXED","7.6.2 META-INF/batch-jobs","2013-01-31 18:51:43" 161 | 4634,"jbatch","source","cvignola","RESOLVED","WORKSFORME","support subclass of java.lang.Throwable in all ExceptionClassFilter elements","2013-01-31 19:01:14" 162 | 4641,"jbatch","source","cvignola","RESOLVED","FIXED","Page 8 Stop Processing has text in TOC","2013-02-22 17:59:53" 163 | 4642,"jbatch","source","cvignola","RESOLVED","FIXED","Clarify include/exclude for skip/retry and also rollback vs no-rollback retry exceptions in JSL","2013-02-28 21:45:15" 164 | 4643,"jbatch","source","cvignola","RESOLVED","FIXED","OK if flow and split do not contain 'next, stop, end, fail' child elements?","2013-03-20 03:25:49" 165 | 4644,"jbatch","source","cvignola","RESOLVED","INVALID","StepStatus not defined; ordering not defined on array parm: public String decide(StepStatus[] statuses)","2013-03-01 13:57:21" 166 | 4645,"jbatch","source","cvignola","RESOLVED","FIXED","Decider Javadoc language on exitStatus is misleading","2013-03-01 14:34:40" 167 | 4647,"jbatch","source","cvignola","RESOLVED","FIXED","More detail on JobStartException / JobRestartException? Job - abstract / restartable","2013-03-01 18:23:33" 168 | 4648,"jbatch","source","cvignola","RESOLVED","FIXED","Do chunk ItemXXXXListener onXXXXError get called for skip/retried exceptions?","2013-03-01 18:45:56" 169 | 4654,"jbatch","source","cvignola","RESOLVED","FIXED","pkg-qualify @Inject at least once in spec","2013-02-08 19:09:56" 170 | 4655,"jbatch","source","cvignola","RESOLVED","FIXED","clarify that @Inject is required for BatchProperty, BatchContext (though CDI, or a particular injection is not).","2013-02-08 19:52:28" 171 | 4659,"jbatch","source","cvignola","RESOLVED","WORKSFORME","JobOperator.getParameters should throw NoSuchJobInstanceException, not NoSuchJobExecutionException","2013-03-01 18:14:28" 172 | 4660,"jbatch","source","cvignola","RESOLVED","FIXED","Implications of Sec 8.* pseudocode don't match rest of spec - property substitution, persistent userdata","2013-02-09 00:02:27" 173 | 4665,"jbatch","source","cvignola","RESOLVED","FIXED","Remove property save-as","2013-02-08 23:28:44" 174 | 4670,"jbatch","source","cvignola","RESOLVED","FIXED","unknown executable elements in the job.xml","2013-02-28 22:21:39" 175 | 4672,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC: How to identify the first job element.","2013-02-28 22:47:13" 176 | 4676,"jbatch","source","cvignola","RESOLVED","FIXED","executable elements id scope","2013-03-01 14:11:38" 177 | 4679,"jbatch","source","cvignola","RESOLVED","FIXED","The persistent user data in a Step Execution should extend Externalizable","2013-03-01 13:26:10" 178 | 4687,"jbatch","source","cvignola","RESOLVED","FIXED","JobOperator.abandon should throw NoSuchJobExecutionException, not NoSuchJobInstanceException","2013-02-28 22:54:19" 179 | 4688,"jbatch","source","cvignola","RESOLVED","FIXED","PartitionAnalyzer.analyzeStatus could use BatchStatus enum as parm type for 'batchStatus' parm, not String","2013-02-28 16:44:40" 180 | 4715,"jbatch","source","cvignola","RESOLVED","FIXED","Do we want to have restart parameters applied as overrides?","2013-02-28 19:53:19" 181 | 4726,"jbatch","source","cvignola","RESOLVED","FIXED","Change Metric interface enum values to conform to Java convention.","2013-04-09 15:19:23" 182 | 4740,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Clarity around checkpoint configuration verbiage","2013-03-11 15:56:48" 183 | 4741,"jbatch","source","cvignola","RESOLVED","MOVED","SPEC - merge attribute sometime on lists and sometimes on element of lists","2013-03-13 00:28:21" 184 | 4742,"jbatch","source","cvignola","RESOLVED","WORKSFORME","SPEC - next attribute is not always optional on a step element","2013-03-11 14:50:18" 185 | 4743,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Refer to where the checkpoint-algorithm is defined","2013-03-16 21:17:00" 186 | 4744,"jbatch","source","cvignola","RESOLVED","WONTFIX","SPEC - time-limit needs a unit of measure","2013-03-20 03:07:52" 187 | 4745,"jbatch","source","cvignola","RESOLVED","MOVED","SPEC - merge default","2013-03-13 00:29:44" 188 | 4746,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Verbiage about when artifacts are created is still present","2013-03-11 14:14:15" 189 | 4747,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Verbiage about partition reducer is confusing","2013-03-08 22:23:12" 190 | 4748,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Partition Collector","2013-03-11 21:00:38" 191 | 4749,"jbatch","source","cvignola","RESOLVED","MOVED","SPEC - Decision availability","2013-03-20 03:18:13" 192 | 4750,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Incorrect statement in 8.6","2013-03-11 15:53:53" 193 | 4751,"jbatch","source","cvignola","RESOLVED","WONTFIX","SPEC - 8.6.1 decision id should be included","2013-03-20 03:00:21" 194 | 4752,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - STOPPING batch status is defined incorrectly","2013-03-11 14:46:02" 195 | 4753,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Missing reference in section 8.7.1","2013-03-11 16:04:05" 196 | 4754,"jbatch","source","cvignola","RESOLVED","MOVED","SPEC - Does not define how the ABANDONED batch status on a step works","2013-03-20 02:22:25" 197 | 4755,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Exit Status for Partitioned Steps is incorrect","2013-03-20 14:02:15" 198 | 4756,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Property misspelling.","2013-03-11 15:19:05" 199 | 4757,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - jobProperties Substitution Operator clarification","2013-03-11 14:21:06" 200 | 4759,"jbatch","source","cvignola","RESOLVED","FIXED","What does StepExecution.getStepContainment() return for direct children of job","2013-03-11 14:30:33" 201 | 4762,"jbatch","source","cvignola","RESOLVED","WONTFIX","SPEC - Property resolution","2013-03-16 21:07:13" 202 | 4763,"jbatch","source","cvignola","RESOLVED","WORKSFORME","SPEC - Parameter substitution syntax","2013-03-13 00:04:15" 203 | 4764,"jbatch","source","cvignola","RESOLVED","WONTFIX","SPEC - ItemReader Javadoc Issues","2013-03-20 02:34:49" 204 | 4765,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - ItemProcessor documentation issue","2013-03-20 02:45:05" 205 | 4766,"jbatch","source","cvignola","RESOLVED","WONTFIX","SPEC - ItemWriter javadoc issues","2013-03-20 02:46:45" 206 | 4767,"jbatch","source","cvignola","RESOLVED","WORKSFORME","SPEC - Checkpoint Algorithm interface issues","2013-03-11 19:55:36" 207 | 4768,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Batchlet.stop clarification","2013-03-20 03:30:44" 208 | 4770,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - ChunkListener.onError clarification","2013-03-20 03:51:46" 209 | 4772,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Grammer in Batch Artifact Loading","2013-03-16 20:50:14" 210 | 4773,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Thread Context Class Loader should be bullet 3","2013-03-12 18:59:51" 211 | 4774,"jbatch","source","cvignola","RESOLVED","INVALID","SPEC - batch.xml schema","2013-03-12 16:05:24" 212 | 4775,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - 10.8 is incomplete","2013-03-20 19:16:34" 213 | 4776,"jbatch","source","cvignola","RESOLVED","WONTFIX","SPEC - TransientUserData should be a key/value pair.","2014-02-25 03:43:08" 214 | 4777,"jbatch","source","cvignola","RESOLVED","MOVED","SPEC - Ability to retrieve JobExecution straight from the JobContext","2013-03-16 21:09:41" 215 | 4778,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Pull out BatchStatus from the JobOperator interface","2013-03-20 02:01:27" 216 | 4779,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - JobInstance id vs instance id","2013-03-20 03:57:29" 217 | 4780,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - The spec should not limit artifact reuse","2013-03-20 03:05:49" 218 | 4781,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - JobInstance and JobExecution creation","2013-03-20 03:36:40" 219 | 4782,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Id uniqueness is incorrect","2013-03-20 03:13:18" 220 | 4784,"jbatch","source","cvignola","RESOLVED","DUPLICATE","SPEC - Revisit Bug 4755 - exit status default in partitioned steps","2013-03-20 14:02:15" 221 | 4786,"jbatch","source","cvignola","RESOLVED","INVALID","SPEC - Sync up Partitin Plan JSL and Java Object","2013-03-12 16:41:30" 222 | 4787,"jbatch","source","cvignola","RESOLVED","WORKSFORME","SPEC - Sync up Partition Plan JSL and Java Object","2013-03-12 19:00:09" 223 | 4791,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Should we refine the StepExecution parameter reference ?","2013-03-20 16:21:11" 224 | 4792,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - Does @BatchProperty need its own definition","2013-03-20 14:03:32" 225 | 4794,"jbatch","source","cvignola","RESOLVED","FIXED","TCK: add version number and root dir to tck zip","2013-03-19 02:35:39" 226 | 4795,"jbatch","source","cvignola","RESOLVED","FIXED","RI: add version number to xml schemas","2013-03-19 02:36:01" 227 | 4797,"jbatch","source","cvignola","RESOLVED","FIXED","BatchRuntime.getJobOperator should return the same instance when called repeatedly","2013-03-16 21:22:30" 228 | 4799,"jbatch","source","cvignola","RESOLVED","WONTFIX","Untested functionality in TCK","2013-08-28 21:29:07" 229 | 4800,"jbatch","source","cvignola","RESOLVED","FIXED","Code notes from the TCK","2013-03-19 02:32:43" 230 | 4803,"jbatch","source","cvignola","RESOLVED","WONTFIX","Should we lose and elements?","2013-03-16 21:43:39" 231 | 4804,"jbatch","source","cvignola","RESOLVED","INVALID","Split-level flow (child of split) transitions are invalid","2013-03-18 17:34:38" 232 | 4811,"jbatch","source","cvignola","RESOLVED","FIXED","TCK add sig file for Java SE 6","2013-03-20 17:26:16" 233 | 4812,"jbatch","TCK","cvignola","RESOLVED","MOVED","TCK automate signature test run","2015-09-03 13:12:37" 234 | 4813,"jbatch","RI","cvignola","RESOLVED","FIXED","RI: JobExecution returned by jobOperator.getJobExecutions(jobInstance) return null jobName","2013-08-28 22:02:24" 235 | 4818,"jbatch","TCK","cvignola","RESOLVED","FIXED","TCK property jsr352.impl.runtime not sufficient","2013-08-28 22:04:31" 236 | 4826,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - StepExecution.getUserPersistentData() vs StepContext.getPersistentUserData()","2013-08-28 18:40:21" 237 | 4827,"jbatch","SPEC","cvignola","RESOLVED","FIXED","SPEC: Misspoke on collector role on exit status","2015-09-03 20:37:26" 238 | 4828,"jbatch","SPEC","cvignola","RESOLVED","WORKSFORME","SPEC - 8.5.2 Decision exception handling is confusing","2014-01-08 15:42:44" 239 | 4829,"jbatch","source","cvignola","RESOLVED","FIXED","SPEC - add BatchException as common base class","2013-08-28 21:24:21" 240 | 4830,"jbatch","SPEC","cvignola","RESOLVED","FIXED","8.6.1 Transition Next Element","2015-05-22 14:00:45" 241 | 4833,"jbatch","source","cvignola","RESOLVED","WONTFIX","SPEC -transition elements and/or next attribute","2013-08-28 22:08:24" 242 | 4849,"jbatch","source","cvignola","RESOLVED","FIXED","no package summary for javax.batch.*","2013-08-28 14:52:05" 243 | 4865,"jbatch","SPEC","cvignola","RESOLVED","FIXED","SPEC Partition Plan example confusing","2015-09-03 21:23:14" 244 | 4866,"jbatch","SPEC","cvignola","RESOLVED","FIXED","SPEC Partition Properties example has a invalid tag","2015-09-03 16:26:39" 245 | 4887,"jbatch","source","cvignola","RESOLVED","FIXED","Exception When Using Null Parameter Lists","2013-08-28 15:02:10" 246 | 4962,"jbatch","source","cvignola","RESOLVED","FIXED","metadata of javax.batch-api does not comply with https://wikis.oracle.com/display/GlassFish/Maven+Versioning+Rules","2013-08-28 14:51:32" 247 | 5218,"jbatch","source","cvignola","RESOLVED","WONTFIX","Add generics where it makes sense","2013-08-28 14:46:00" 248 | 5315,"jbatch","RI","cvignola","RESOLVED","MOVED","Broken PostgreSQL Support in SE mode","2015-09-01 20:51:17" 249 | 4702,"jbatch","source","ScottKurz","RESOLVED","FIXED","TCK ChunkTests issues","2013-08-29 14:46:55" 250 | 4705,"jbatch","source","ScottKurz","RESOLVED","WONTFIX","TCK ContextGetIdTests issues","2013-03-18 06:17:39" 251 | 4706,"jbatch","source","ScottKurz","RESOLVED","WONTFIX","TCK ExecutionTests issues","2013-08-29 14:25:08" 252 | 4707,"jbatch","source","ScottKurz","RESOLVED","FIXED","TCK FlowTransitioningTests issues","2013-08-29 16:49:21" 253 | 4708,"jbatch","source","ScottKurz","RESOLVED","FIXED","TCK JobAttributeAbstractTests Issues","2013-03-18 06:16:38" 254 | 4709,"jbatch","source","ScottKurz","RESOLVED","FIXED","TCK JobExecutableSequenceTests Issues","2013-08-28 21:53:09" 255 | 4710,"jbatch","SPEC","ScottKurz","RESOLVED","DUPLICATE","Consider clarifying that JobContext/StepContext may contain implementation-specific properties other than JSL properties.","2014-01-07 18:54:10" 256 | 4711,"jbatch","source","ScottKurz","RESOLVED","FIXED","TCK JobOperatorTests Issues","2013-03-18 19:38:16" 257 | 4712,"jbatch","source","ScottKurz","RESOLVED","WONTFIX","TCK ParallelExecutionTests Issues","2013-09-06 19:19:42" 258 | 4713,"jbatch","source","ScottKurz","RESOLVED","WONTFIX","TCK TransactionTests Issues","2013-08-29 16:44:37" 259 | 4714,"jbatch","source","ScottKurz","RESOLVED","WONTFIX","TCK does not validate artifact creation behavior","2013-08-28 21:49:02" 260 | 4724,"jbatch","source","ScottKurz","RESOLVED","FIXED","SPEC: Remove listeners from split and flow elements in jsl xsd","2013-03-01 19:42:27" 261 | 4733,"jbatch","RI","ScottKurz","RESOLVED","FIXED","RI ItemProcessor need to be optional, throws NPE","2013-08-28 21:32:05" 262 | 4734,"jbatch","source","ScottKurz","RESOLVED","FIXED","RI maven sources.jar is empty","2013-03-11 18:42:43" 263 | 4991,"jbatch","SPEC","ScottKurz","RESOLVED","WONTFIX","Add Java Based JSL","2016-03-17 17:13:06" 264 | 5164,"jbatch","TCK","ScottKurz","RESOLVED","FIXED","JobContext.getExecutionId() returns wrong value (an internal value) when invoked on a partition thread.","2015-10-06 16:38:16" 265 | 5335,"jbatch","TCK","ScottKurz","RESOLVED","FIXED","Metrics timestamp assertions should be loosened with a precision buffer","2013-11-05 19:05:26" 266 | 5370,"jbatch","SPEC","ScottKurz","RESOLVED","FIXED","Spec is unclear whether JobOperator methods may/must execute synchronously or not (with TCK implications)","2015-09-03 21:07:38" 267 | 5371,"jbatch","TCK","ScottKurz","RESOLVED","FIXED","JobOperatorTests#testAbandoned() assumes earlier JobExecution instance will reflect subsequent status changes","2013-11-05 19:05:28" 268 | 5372,"jbatch","TCK","ScottKurz","RESOLVED","MOVED","Evaluation order of multiple transition elements","2016-03-17 16:10:38" 269 | 5373,"jbatch","TCK","ScottKurz","RESOLVED","MOVED","Co-existence of transition elements with @next attribute PLUS behavior if no transition element @on is matched","2016-03-17 16:12:16" 270 | 5374,"jbatch","TCK","ScottKurz","RESOLVED","MOVED","Details of exception handling (by container)","2016-03-17 16:39:39" 271 | 5375,"jbatch","SPEC","ScottKurz","RESOLVED","FIXED","Spec contradicts itself when talking about uninitialized exit status (TCK assumes 'null')","2015-09-03 16:35:29" 272 | 5379,"jbatch","SPEC","ScottKurz","RESOLVED","FIXED","TCK ExecutionTests.testInvokeJobChunkWithFullAttributes challenge: SB wants to fail JSL","2013-11-06 20:10:27" 273 | 5385,"jbatch","TCK","ScottKurz","RESOLVED","FIXED","TCK tests (DeciderTests#testDeciderCannotbeFirstElementOnStart, etc. ) do not properly support either JobStartException or execution with FAILED","2013-11-05 19:05:27" 274 | 5389,"jbatch","SPEC","ScottKurz","RESOLVED","FIXED","In Sec. 10.7.1, should we have said we require a ""no-arg"" explicit or implicit constructor rather than a ""default constructor""","2015-09-03 14:58:17" 275 | 5401,"jbatch","TCK","ScottKurz","RESOLVED","MOVED","Clean up assertion messages","2015-09-03 13:15:17" 276 | 5403,"jbatch","TCK","ScottKurz","RESOLVED","MOVED","Spec unclear on skipping part of an Exception hierarchy","2016-03-17 17:10:55" 277 | 5407,"jbatch","RI","ScottKurz","RESOLVED","FIXED","JobThreadRootControllerImpl throws NPE on transitioner when partitioned batchlet stopped","2015-09-01 21:28:59" 278 | 5412,"jbatch","TCK","ScottKurz","RESOLVED","FIXED","DeciderTests#testDeciderExitStatusIsSetOnJobContext and step looping","2014-01-03 03:47:20" 279 | 5431,"jbatch","TCK","ScottKurz","RESOLVED","FIXED","ItemProcessListener#onProcessError has javadoc from ItemProcessListener#afterProcess","2015-10-22 02:07:50" 280 | 5490,"jbatch","SPEC","ScottKurz","RESOLVED","FIXED","Clarify JobContext/StepContext properties; fix TCK to not depend on writable Properties","2015-09-03 21:22:51" 281 | 5498,"jbatch","SPEC","ScottKurz","RESOLVED","FIXED","Add ""mark FAILED"" to BatchStatus state transitions","2015-09-03 20:57:26" 282 | 5533,"jbatch","SPEC","ScottKurz","RESOLVED","FIXED","stop/end/fail exit-status should affect job exit status, not step (as claimed in spec).","2015-09-03 21:24:32" 283 | 5583,"jbatch","SPEC","ScottKurz","RESOLVED","FIXED","CheckpointAlgorithm needs to specify timeunit (seconds) and other javadoc fixes","2015-09-03 17:42:26" 284 | 5597,"jbatch","TCK","ScottKurz","RESOLVED","FIXED","BatchletRestartStateMachineTests#testAllowStartIfCompleteRestartExecution off-by-1 error omits test clause","2014-01-03 03:38:16" 285 | 5602,"jbatch","RI","ScottKurz","RESOLVED","FIXED","BatchStatus in JobStatus should be always initialised","2015-09-03 16:11:56" 286 | 5614,"jbatch","TCK","ScottKurz","RESOLVED","FIXED","TCK expects JobExecution to be updated as job runs","2014-01-03 03:42:22" 287 | 5655,"jbatch","TCK","ScottKurz","RESOLVED","MOVED","ChunkTests for skipping writes don't go far enough","2015-09-03 14:24:51" 288 | 5675,"jbatch","RI","ScottKurz","RESOLVED","FIXED","Metric values are 0 when batch runs in a partition","2015-09-01 21:05:52" 289 | 5690,"jbatch","SPEC","ScottKurz","RESOLVED","FIXED","Flow/Split transitioning & termination not fully defined","2015-09-03 20:56:26" 290 | 5691,"jbatch","TCK","ScottKurz","RESOLVED","MOVED","""Looping"" should be clarified?","2016-03-17 19:48:12" 291 | 5746,"jbatch","TCK","ScottKurz","RESOLVED","MOVED","@Inject @BatchProperty should work for job level properties","2017-04-08 08:25:33" 292 | 5748,"jbatch","RI","ScottKurz","RESOLVED","FIXED","#{jobProperties} property resolution unavailable within JSL partition","2015-09-01 20:45:50" 293 | 5752,"jbatch","RI","ScottKurz","RESOLVED","FIXED","Weld reinitializes for every bean lookup","2015-09-01 20:48:31" 294 | 5780,"jbatch","TCK","ScottKurz","RESOLVED","MOVED","Spec should clarify StepExecution values passed to Decider on a restart","2016-03-17 19:51:24" 295 | 5784,"jbatch","SPEC","ScottKurz","RESOLVED","WONTFIX","Consider declaring StepExecution/JobExecution/Metric to implements Serializable in future?","2016-03-09 22:18:19" 296 | 5806,"jbatch","RI","ScottKurz","RESOLVED","FIXED","JobExecution returned by jobOperator.getJobExecutions(jobInstance) has null parameters","2015-09-01 21:00:06" 297 | 5833,"jbatch","TCK","ScottKurz","RESOLVED","FIXED","Ant build does not properly set exit code on failure","2015-09-03 14:14:24" 298 | 5834,"jbatch","TCK","ScottKurz","RESOLVED","MOVED","deploy tcks on central","2015-09-02 19:59:26" 299 | 5873,"jbatch","TCK","ScottKurz","RESOLVED","MOVED","Clarify when CheckpointAlgorithm#beginCheckpoint is invoked","2016-03-17 19:52:03" 300 | 5875,"jbatch","TCK","ScottKurz","RESOLVED","MOVED","When the first readItem() in a chunk return 'null', is this a zero-item chunk or is this not a new chunk after all?","2016-03-17 19:52:38" 301 | 5878,"jbatch","TCK","ScottKurz","RESOLVED","MOVED","Tests needed for property injection (see Bug 5746)","2015-09-03 14:26:54" 302 | 5879,"jbatch","TCK","ScottKurz","RESOLVED","MOVED","Tests needed for include/exclude exceptions in hierarchy for skip/retry (See Bug 5403)","2015-09-03 14:27:24" 303 | 5911,"jbatch","SPEC","ScottKurz","RESOLVED","FIXED","Clarify partition restart processing, PartitionPlan properties, and persistent user data for partitioned steps.","2015-09-03 16:25:22" 304 | 5919,"jbatch","TCK","ScottKurz","RESOLVED","MOVED","Spec doesn't fully describe PartitionPlan override and the use of PartitionMapper","2016-03-17 19:53:58" 305 | 6155,"jbatch","TCK","ScottKurz","RESOLVED","FIXED","ExternalizableString requires a no-args constructor","2015-09-03 15:39:45" 306 | 6259,"jbatch","RI","ScottKurz","RESOLVED","FIXED","Exception in ChunkStepControllerImpl causes rollback of subsequent step/job status","2014-10-07 14:50:08" 307 | 6415,"jbatch","RI","ScottKurz","RESOLVED","FIXED","SkipHandler Logging to System.out","2015-09-01 21:29:49" 308 | 6420,"jbatch","RI","ScottKurz","RESOLVED","FIXED","Partition Plan won't work when inside a split","2015-09-01 20:15:41" 309 | 6424,"jbatch","RI","ScottKurz","RESOLVED","WONTFIX","jbatch does not work within a OSGi war and ejb in Glassfish","2014-11-17 09:47:03" 310 | 6426,"jbatch","RI","ScottKurz","RESOLVED","FIXED","Stop during a partitioned step blows up if some partitions are already complete (leaving others still executing)","2015-09-01 21:27:13" 311 | 6494,"jbatch","SPEC","ScottKurz","RESOLVED","FIXED","For partitioned steps, allow-start-if-complete=true does not result in re-running the partitions","2016-04-20 15:21:42" 312 | 6742,"jbatch","RI","ScottKurz","RESOLVED","FIXED","Stopping a Chunk causes IllegalStateException","2015-09-03 16:04:27" 313 | 6830,"jbatch","RI","ScottKurz","RESOLVED","WORKSFORME","ChunkListener.onError() method not invoked before retry rollback","2015-05-14 13:55:49" 314 | 7287,"jbatch","SPEC","ScottKurz","RESOLVED","WONTFIX","Add a HTTP API on top of JobOperator","2016-03-16 14:43:14" 315 | 7292,"jbatch","SPEC","ScottKurz","RESOLVED","WONTFIX","chains support","2016-03-16 14:20:39" 316 | 7514,"jbatch","RI","ScottKurz","RESOLVED","MOVED","BatchJobUtils#purgeOwnedRepositoryData(String tagName) throws unexpected exception","2016-02-03 14:44:00" 317 | 115857,"jbatch","source","ScottKurz","RESOLVED","INVALID","a good behavier +1-855 880-8488 What is the Number for delta Airlines","2016-10-06 17:59:37" 318 | 209338,"jbatch","source","ScottKurz","RESOLVED","INVALID","बाहर निकल जाओ }{cALIFORNIA}{ 855 [755]] 0044 ''teXAS'' sUPPORT fOR qUICKBOOKS eNTERPRISE tOLL fREE pHONE nUMBER USA 2017 uPGRADE NUMBER INTUIT QUICKBOOKS PAYROLL APPLICITION","2017-04-05 20:07:51" 319 | 479618,"jbatch","source","ScottKurz","RESOLVED","INVALID","BOBLEE__1+888_809-3891+++==Charter technical support contact number,__1+888_809-3891+++==","2017-04-05 20:07:32" 320 | 4385,"jbatch","source","cvignola","CLOSED","FIXED","Spec must specify the effect of throwing Exceptions from Listeners","2013-01-16 15:17:47" 321 | 4304,"jbatch","source","chrisschaefer","CLOSED","FIXED","Requirement to use @Named?","2013-01-16 17:44:21" 322 | 3472,"jbatch","source","cvignola","CLOSED","FIXED","Link to ANSI/ISA S88 Batch Standard seems to be broken","2013-01-16 18:14:22" 323 | 3473,"jbatch","source","cvignola","CLOSED","FIXED","Missing Mailing List for public discussion","2013-01-16 17:52:51" 324 | 4051,"jbatch","source","cvignola","CLOSED","FIXED","How to get StepExecution","2013-01-16 23:09:26" 325 | 4085,"jbatch","source","cvignola","CLOSED","FIXED","Missing spec detail on problematic inheritance cases","2013-01-16 18:29:36" 326 | 4091,"jbatch","source","cvignola","CLOSED","FIXED","JobOperator missing 'abandon' operation","2013-01-16 18:39:36" 327 | 4092,"jbatch","source","cvignola","CLOSED","FIXED","Exit status globbing tweaks suggested","2013-01-16 23:03:41" 328 | 4098,"jbatch","source","cvignola","CLOSED","FIXED","More detail needed on execution sequence during restart","2013-01-16 17:45:42" 329 | 4110,"jbatch","source","cvignola","CLOSED","FIXED","Clarify at what point the JobOperator.stop returns (and maybe start/restart?)","2013-01-16 23:04:52" 330 | 4111,"jbatch","source","cvignola","CLOSED","FIXED","spec should point out that you can't repeat steps/splits/flows within a single job execution","2013-01-16 23:05:05" 331 | 4113,"jbatch","source","cvignola","CLOSED","FIXED","JobOperator checked exceptions should be fully defined in Sec. 7.10","2013-01-16 23:05:22" 332 | 4115,"jbatch","source","cvignola","CLOSED","FIXED","Spec should mention chunk loops ends when reader returns null","2013-01-16 23:05:48" 333 | 4117,"jbatch","source","cvignola","CLOSED","FIXED","LogicalTx* in RI and namespace","2013-01-16 23:01:40" 334 | 4118,"jbatch","source","cvignola","CLOSED","FIXED","For Sec. 5.2.1 Chunk JSL, need to update ""Syntax"" to match the table descriptions:","2013-01-16 23:06:17" 335 | 4124,"jbatch","source","cvignola","CLOSED","FIXED","For global tran chunk step, are open/close performed in global tran?","2013-01-16 23:06:41" 336 | 4125,"jbatch","source","cvignola","CLOSED","FIXED","Do @AfterJob and @AfterStep run after job, step batch status / exit status have been hardened/persisted?","2013-01-16 23:07:07" 337 | 4135,"jbatch","source","cvignola","CLOSED","WONTFIX","The JobOperator interface in the RI is different than what's listed in the specification document.","2013-01-16 23:03:16" 338 | 4136,"jbatch","source","cvignola","CLOSED","FIXED","The RI use of batch.xml is not consistent with the specification document","2013-01-16 23:04:01" 339 | 4137,"jbatch","source","cvignola","CLOSED","FIXED","In the RI, the applyTo attribute in the chunk properties doesn't work as expected","2013-01-16 18:39:54" 340 | 4138,"jbatch","source","cvignola","CLOSED","FIXED","Processor shouldn't be a required attribute to a chunk type step","2013-01-16 23:09:03" 341 | 4139,"jbatch","source","cvignola","CLOSED","FIXED","It is not possible to provide my own implementation of BatchArtifactFactory when using the RI","2013-01-16 20:55:52" 342 | 4148,"jbatch","source","cvignola","CLOSED","FIXED","Interaction between retryable-exception-classes, no-rollback-exception-classes, and skippable-exception-classes","2013-01-16 23:05:34" 343 | 4149,"jbatch","source","cvignola","CLOSED","FIXED","XSD inconsistencies","2013-01-16 18:30:07" 344 | 4150,"jbatch","source","cvignola","CLOSED","FIXED","Difference between @OnRetryReadException and @OnRetryReadItem","2013-01-16 23:06:03" 345 | 4151,"jbatch","source","cvignola","CLOSED","WORKSFORME","spec questions on skippable exceptions: write, runtime exceptions, exclude","2013-01-16 23:06:28" 346 | 4155,"jbatch","source","cvignola","CLOSED","FIXED","Do @AfterJob/@AfterStep etc. run for failed/stopped jobs, steps, etc. (on best-effort basis)?","2013-01-16 23:06:50" 347 | 4156,"jbatch","source","cvignola","CLOSED","FIXED","what does buffer-size=0 wording mean?","2013-01-16 23:08:48" 348 | 4157,"jbatch","source","cvignola","CLOSED","FIXED","CDI language should be removed from spec","2013-01-16 23:03:30" 349 | 4158,"jbatch","source","cvignola","CLOSED","FIXED","Job Repository not clearly defined in the spec","2013-01-16 23:04:15" 350 | 4159,"jbatch","source","cvignola","CLOSED","FIXED","Definition needed for ""item-time"" checkpoint policy (see email to issues list)","2013-01-16 23:04:38" 351 | 4160,"jbatch","source","cvignola","CLOSED","FIXED","checkpoint-policy configuration needs clarification (5.2.1)","2013-01-16 18:45:58" 352 | 4161,"jbatch","source","cvignola","CLOSED","FIXED","Clarification needed around retry (5.2.1.2.2)","2013-01-16 20:56:35" 353 | 4162,"jbatch","source","cvignola","CLOSED","FIXED","Clarification around property names","2013-01-16 20:58:24" 354 | 4163,"jbatch","source","cvignola","CLOSED","FIXED","Partition numbering is 1 based","2013-01-16 23:08:17" 355 | 4164,"jbatch","source","cvignola","CLOSED","FIXED","Clarifications with the Flow element (5.3)","2013-01-16 23:02:02" 356 | 4165,"jbatch","source","cvignola","CLOSED","FIXED","Inheritance clarifications (5.8)","2013-01-16 23:08:32" 357 | 4166,"jbatch","source","cvignola","CLOSED","FIXED","ItemReader annotation @Open shouldn't be required","2013-01-16 23:02:32" 358 | 4167,"jbatch","source","cvignola","CLOSED","FIXED","@CheckpointInfo clarification","2013-01-16 23:03:05" 359 | 4168,"jbatch","source","cvignola","CLOSED","FIXED","@Stop on a batchlet shouldn't be required.","2013-01-16 23:03:50" 360 | 4169,"jbatch","source","cvignola","CLOSED","FIXED","CheckpointListener clarification","2013-01-16 23:04:26" 361 | 4170,"jbatch","source","cvignola","CLOSED","FIXED","Parameter order of Listener API","2013-01-16 23:07:37" 362 | 4172,"jbatch","source","cvignola","CLOSED","FIXED","Parallelization clarifications","2013-01-16 20:56:53" 363 | 4173,"jbatch","source","cvignola","CLOSED","FIXED","Decider does not get context","2013-01-16 23:01:01" 364 | 4175,"jbatch","source","cvignola","CLOSED","FIXED","JobOperator interface incorrectly cited","2013-01-16 23:09:16" 365 | 4182,"jbatch","source","cvignola","CLOSED","WORKSFORME","The transient user data in a Job Context needs to be cloneable or serializable.","2013-01-16 23:02:17" 366 | 4183,"jbatch","source","cvignola","CLOSED","FIXED","There is no way to access the parent job context at the end of a Split","2013-01-16 23:02:50" 367 | 4197,"jbatch","source","cvignola","CLOSED","FIXED","issues with JobPath (Sec 7.5), should it be in the spec?","2013-01-16 23:09:39" 368 | 4198,"jbatch","source","cvignola","CLOSED","FIXED","use of JobOperatorFactory SPI unclear","2013-01-16 23:07:19" 369 | 4199,"jbatch","source","cvignola","CLOSED","FIXED","Use of batch.xml in JEE environment","2013-01-16 18:32:19" 370 | 4202,"jbatch","source","cvignola","CLOSED","FIXED","transaction text should say resources get auto-enlisted","2013-01-16 23:07:50" 371 | 4232,"jbatch","source","cvignola","CLOSED","FIXED","Clarification for onRetryProcessItem and onRetryWriteItems methods","2013-01-16 23:08:01" 372 | 4233,"jbatch","source","cvignola","CLOSED","FIXED","Step level properties shouldn't be available through Job Context","2013-01-16 20:57:44" 373 | 4234,"jbatch","source","cvignola","CLOSED","FIXED","Transitions within a split are not valid","2013-01-16 23:01:14" 374 | 4241,"jbatch","source","cvignola","CLOSED","FIXED","Clarify when the Batch Container guarantees global transaction mode sematics","2013-01-16 23:01:51" 375 | 4259,"jbatch","source","cvignola","CLOSED","FIXED","chunk properties naming","2013-01-16 17:49:20" 376 | 4265,"jbatch","source","cvignola","CLOSED","FIXED","Clarification of JobExecution","2013-01-16 16:15:42" 377 | 4266,"jbatch","source","cvignola","CLOSED","FIXED","Step's start-limit","2013-01-16 16:33:43" 378 | 4267,"jbatch","source","cvignola","CLOSED","INVALID","checkpoint-alghrithm is not defined by the spec","2013-01-16 15:53:19" 379 | 4268,"jbatch","source","cvignola","CLOSED","WONTFIX","commit-interval attribute unit","2013-01-16 17:25:29" 380 | 4269,"jbatch","source","cvignola","CLOSED","FIXED","buffer-size should be a boolean","2013-01-16 15:19:52" 381 | 4270,"jbatch","source","cvignola","CLOSED","FIXED","Step Sequence allows for looping","2013-01-16 17:04:54" 382 | 4271,"jbatch","source","cvignola","CLOSED","FIXED","planplan typo in section 5.2.6.1","2013-01-16 17:25:18" 383 | 4272,"jbatch","source","cvignola","CLOSED","FIXED","Nested flows should be supported","2013-01-16 15:27:11" 384 | 4273,"jbatch","source","cvignola","CLOSED","FIXED","Split Collector and analyzer should not be allowed","2013-01-16 15:36:04" 385 | 4274,"jbatch","source","cvignola","CLOSED","FIXED","Parallel step instances should not stop when another step fails","2013-01-16 16:07:20" 386 | 4275,"jbatch","source","cvignola","CLOSED","INVALID","Stop element inconsistent with other decision elements","2013-01-16 16:25:57" 387 | 4276,"jbatch","source","cvignola","CLOSED","FIXED","ItemReader and ItemWriter interface requires unnecessary methods","2013-01-16 15:18:33" 388 | 4277,"jbatch","source","cvignola","CLOSED","FIXED","CheckpointAlgorithm requires checkpointTimeout method","2013-01-16 15:57:54" 389 | 4278,"jbatch","source","cvignola","CLOSED","FIXED","Batchlet interface requires stop method","2013-01-16 16:17:50" 390 | 4280,"jbatch","source","cvignola","CLOSED","FIXED","Are the ChunkListener.beforeCheckpoint and afterCheckpoint methods necessary?","2013-01-16 15:29:17" 391 | 4281,"jbatch","source","cvignola","CLOSED","FIXED","Clarification needed around RetryListener methods","2013-01-16 17:48:54" 392 | 4282,"jbatch","source","cvignola","CLOSED","FIXED","Checkpoint and application updates should be in the same transaction","2013-01-16 16:15:21" 393 | 4283,"jbatch","source","cvignola","CLOSED","INVALID","TransactionManagerSPI is missing enlist (for enlisting checkpoint resources)","2013-01-16 15:28:15" 394 | 4286,"jbatch","source","cvignola","CLOSED","WONTFIX","Schema allows for an empty job","2013-01-16 15:27:25" 395 | 4288,"jbatch","source","cvignola","CLOSED","WORKSFORME","What does Batchlet.stop apply to?","2013-01-16 16:09:24" 396 | 4290,"jbatch","source","cvignola","CLOSED","FIXED","Typo in 4.2 Step","2013-01-16 15:24:05" 397 | 4291,"jbatch","source","cvignola","CLOSED","FIXED","4.5 ItemReader more details reference","2013-01-16 15:35:08" 398 | 4292,"jbatch","source","cvignola","CLOSED","FIXED","4.6 Item Writer more details reference","2013-01-16 17:54:32" 399 | 4293,"jbatch","source","cvignola","CLOSED","FIXED","4.7 Item Processor more details reference","2013-01-16 17:31:36" 400 | 4295,"jbatch","source","cvignola","CLOSED","FIXED","Typos in 5.2.6 Step Partitioning","2013-01-16 17:51:21" 401 | 4296,"jbatch","source","cvignola","CLOSED","FIXED","5.2.6.3 typo","2013-01-16 18:22:29" 402 | 4297,"jbatch","source","cvignola","CLOSED","FIXED","7.6.3 why StepContext implements Externalizable?","2013-01-16 15:31:09" 403 | 4298,"jbatch","source","cvignola","CLOSED","FIXED","5.4.1 Split Collection has references to wrong sections","2013-01-16 17:50:01" 404 | 4300,"jbatch","source","cvignola","CLOSED","FIXED","5.4.2 SplitAnalyzer references wrong section","2013-01-16 18:06:51" 405 | 4301,"jbatch","source","cvignola","CLOSED","FIXED","Typo in 5.6 xml attribute","2013-01-16 17:44:35" 406 | 4302,"jbatch","source","cvignola","CLOSED","FIXED","5.8 invalid closing xml tag","2013-01-16 17:48:06" 407 | 4303,"jbatch","source","cvignola","CLOSED","FIXED","Break RetryListener down into multiple interfaces?","2013-01-16 17:55:31" 408 | 4319,"jbatch","source","cvignola","CLOSED","FIXED","JobOperator does not provide a simple way to get the current JobExecution","2017-04-08 08:21:40" 409 | 4327,"jbatch","source","cvignola","CLOSED","FIXED","Remove InterruptedException from stop processing and require stop() on Batchlet.","2012-12-06 16:45:13" 410 | 4329,"jbatch","source","cvignola","CLOSED","FIXED","5.5.2 link to FlowContext","2013-01-16 17:33:15" 411 | 4330,"jbatch","source","cvignola","CLOSED","FIXED","5.5.3 link to SplitContext","2013-01-16 17:47:49" 412 | 4331,"jbatch","source","cvignola","CLOSED","FIXED","Formatting of rules in 5.8","2013-01-16 17:54:00" 413 | 4332,"jbatch","source","cvignola","CLOSED","FIXED","Typos in 6.1.1.1 javadoc","2013-01-16 17:28:32" 414 | 4333,"jbatch","source","cvignola","CLOSED","FIXED","6.1.1.3 missing javadoc","2013-01-16 17:46:42" 415 | 4334,"jbatch","source","cvignola","CLOSED","FIXED","6.2.4 typo","2013-01-16 17:50:21" 416 | 4335,"jbatch","source","cvignola","CLOSED","FIXED","Usage of ""Impl"" in class names","2012-12-06 16:46:52" 417 | 4336,"jbatch","source","cvignola","CLOSED","FIXED","6.4.1 JobContext reference","2013-01-16 17:45:56" 418 | 4337,"jbatch","source","cvignola","CLOSED","FIXED","6.5 typos","2013-01-16 17:49:39" 419 | 4338,"jbatch","source","cvignola","CLOSED","FIXED","6.5.1 reference to PartitionPlan","2013-01-16 18:21:22" 420 | 4339,"jbatch","source","cvignola","CLOSED","FIXED","7.2 typos","2013-01-16 17:45:11" 421 | 4340,"jbatch","source","cvignola","CLOSED","FIXED","7.6.2 missing javadoc","2013-01-16 17:48:22" 422 | 4341,"jbatch","source","cvignola","CLOSED","FIXED","7.6.6 metric names as enum rather than strings","2013-01-16 18:06:16" 423 | 4348,"jbatch","source","cvignola","CLOSED","FIXED","Do artifacts need no-arg constructor?","2013-01-16 16:28:44" 424 | 4349,"jbatch","source","cvignola","CLOSED","FIXED","Spec should be clear that properties are not ""inherited"" or visible from containing scopes in JSL","2013-01-16 17:05:57" 425 | 4350,"jbatch","source","cvignola","CLOSED","FIXED","Need any late-binding/late-resolution of JSL substitution properties","2013-01-16 16:09:57" 426 | 4351,"jbatch","source","cvignola","CLOSED","FIXED","BatchContext getBatchContexts() type parameterization shouldn't be ","2013-01-16 16:26:29" 427 | 4352,"jbatch","source","cvignola","CLOSED","INVALID","Any point to 7.6.8 BatchRuntime.getJobOperator()?","2013-01-16 15:34:52" 428 | 4353,"jbatch","source","cvignola","CLOSED","WONTFIX","Worth definining int-type properties?","2013-01-16 17:52:26" 429 | 4354,"jbatch","source","cvignola","CLOSED","FIXED","JSR352-defined exceptions use non-standard constructors, setCause()..why RuntimeException","2013-01-16 16:26:11" 430 | 4355,"jbatch","source","cvignola","CLOSED","FIXED","Is wording ""It must specify a valid XML boolean value"" specific enough?","2013-01-16 17:46:25" 431 | 4356,"jbatch","source","cvignola","CLOSED","WORKSFORME","Function of skipCount across restart","2013-01-16 15:58:10" 432 | 4357,"jbatch","source","cvignola","CLOSED","FIXED","Clarify that batch artifact explicitly setting exit status to 'null' or empty string preempts defaulting to batch status.","2013-01-16 17:21:03" 433 | 4363,"jbatch","source","cvignola","CLOSED","WORKSFORME","start-limit: on restart, start-limit applies only to actual re-execution of step or even step's decision logc","2013-01-16 15:29:30" 434 | 4364,"jbatch","source","cvignola","CLOSED","WORKSFORME","Interaction of start-limit and allow-start-if-complete","2013-01-16 15:55:28" 435 | 4365,"jbatch","source","cvignola","CLOSED","WORKSFORME","How is the completion of flows/splits persisted and treated on restart?","2013-01-16 18:20:38" 436 | 4366,"jbatch","source","cvignola","CLOSED","WORKSFORME","@BatchProperty only way to inject properties into an artifact?","2013-01-16 17:44:58" 437 | 4381,"jbatch","source","cvignola","CLOSED","FIXED","Job identifiers clarification","2013-01-16 15:41:25" 438 | 4382,"jbatch","source","cvignola","CLOSED","FIXED","Status parameter of PartitionReducer.afterPartitionedStepCompletion should be an enum","2013-01-16 17:56:21" 439 | 4383,"jbatch","source","cvignola","CLOSED","FIXED","Change JobOperator parameters from primitive types to Objects","2013-01-16 15:27:45" 440 | 4384,"jbatch","source","cvignola","CLOSED","WORKSFORME","{Job, Step, Chunk}Listeners don't receive enough information","2013-01-16 15:20:06" 441 | 4393,"jbatch","source","cvignola","CLOSED","WORKSFORME","Enough specified for step (and job) inheritance ?","2013-01-16 15:25:21" 442 | 4395,"jbatch","source","cvignola","CLOSED","FIXED","PartitionPlan interface should match JSL attributes","2013-01-16 16:35:48" 443 | 4447,"jbatch","source","cvignola","CLOSED","FIXED","Simplify the '?:' grammar and semantics (5.7)","2013-01-16 16:05:48" 444 | 4458,"jbatch","source","cvignola","CLOSED","WORKSFORME","PartitionPlan interface should only have getters","2013-01-16 15:23:13" 445 | 4474,"jbatch","source","cvignola","CLOSED","FIXED","Clarify if reader/processor/writer are stateful (and so the same instance is used within a step).","2013-01-16 17:47:00" 446 | 4497,"jbatch","source","cvignola","CLOSED","WONTFIX","EE","2013-01-16 17:52:12" 447 | 4285,"jbatch","source","mminella","CLOSED","FIXED","Transaction Mode Property and Transaction Management SPI should be left to the implementations","2013-01-16 17:55:58" 448 | 4287,"jbatch","source","mminella","CLOSED","WORKSFORME","Stop processing is not correct","2012-12-06 16:24:48" -------------------------------------------------------------------------------- /java.net.backup/jbatch.bugzilla.2017-04-21.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WASdev/standards.jsr352.batch-spec/8476fa71d6e4dd72e538c4e658d225bcdde93cf9/java.net.backup/jbatch.bugzilla.2017-04-21.xml -------------------------------------------------------------------------------- /java.net.backup/jbatch_public_MLM.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WASdev/standards.jsr352.batch-spec/8476fa71d6e4dd72e538c4e658d225bcdde93cf9/java.net.backup/jbatch_public_MLM.tgz -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | 4 | javax.enterprise 5 | batch-spec 6 | pom 7 | 1.1-SNAPSHOT 8 | 9 | Parent module for Batch Specification 10 | 11 | https://github.com/WASdev/standards.jsr352.batch-spec 12 | 13 | 14 | 15 | The Apache Software License, Version 2.0 16 | http://www.apache.org/licenses/LICENSE-2.0.txt 17 | repo 18 | 19 | 20 | 21 | 22 | net.java 23 | jvnet-parent 24 | 1 25 | 26 | 27 | 28 | 29 | scottkurz 30 | Scott Kurz 31 | skurz@us.ibm.com 32 | 33 | 34 | 35 | 36 | 37 | 38 | 1.1 39 | 40 | 41 | 42 | 43 | 44 | specification 45 | 46 | 47 | 48 | clean package 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /specification/README.md: -------------------------------------------------------------------------------- 1 | # JSR 352 Specification 1.0a as AsciiDoc 2 | 3 | ## Overview 4 | This folder contains the JSR-352 1.0a Specification in Ascii Doc format. The conversion was largely automated, with several 5 | manual passes and edits. 6 | 7 | jsr352-1_0_a.asc is the main document, and includes the individual parts. 8 | 9 | ## Rendering 10 | GitHub currently [renders includes as a document link](http://asciidoctor.org/news/2014/02/04/github-asciidoctor-0.1.4-upgrade-5-things-to-know/#3-swap-an-include-for-a-link) 11 | instead of palcing the include in-line... this makes it look terrible when viewed online! 12 | 13 | If you clone this repository and render the document using AsciiDocter, you'll get one comprehensive specification document, 14 | complete with table of contents. 15 | 16 | ## Outstanding Tasks 17 | 18 | ### Code Wrapping 19 | I have been running the Java source examples through a pretty printer, and wrapping them with AsciiDoc app-listing macros. When I do each block, I run the code through a pretty-printer, so it appears consistent and clean. 20 | 21 | [[app-listing]] 22 | [source,java] 23 | ---- 24 | // Java Code Goes Here... 25 | ---- 26 | 27 | XML code blocks can be wrapped similarly, and the JSL examples and snippets still need to be wrapped. 28 | 29 | [[app-listing]] 30 | [source,xml] 31 | ---- 32 | 33 | ---- 34 | 35 | ### Verification Against the Spec 36 | 37 | The conversion to AsciiDoc was largely automated, but some more complex sections of the specification needed to be reworked manually. This applies especially to the Job Runtime Lifecycle section (job_runtime_lifecycle.adoc). 38 | 39 | Each section should be carefully reviewed against the [the Maintenance Release Specification](https://jcp.org/aboutJava/communityprocess/mrel/jsr352/index.html) 40 | 41 | ### Psuedo Code Blocks 42 | 43 | The subsections under job_runtime_lifecycle.adoc contain psuedo-code descriptions, which were represented as a nested-list 44 | structure in the original specification document. This didn't translate well into AsciiDoc. It looks bad in text, and renders slightly different than the original document. 45 | 46 | I tried my best to ensure the nested levels all match, so it flows the same. But I would very much like to see these Psuedo Code elements re-written into a more readable form. 47 | -------------------------------------------------------------------------------- /specification/latest/jsr352_1_0_a.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WASdev/standards.jsr352.batch-spec/8476fa71d6e4dd72e538c4e658d225bcdde93cf9/specification/latest/jsr352_1_0_a.pdf -------------------------------------------------------------------------------- /specification/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | 5 | 6 | javax.enterprise 7 | batch-spec 8 | 1.1-SNAPSHOT 9 | 10 | 11 | batch-spec-doc 12 | pom 13 | 14 | 15 | Batch Specification documentation 16 | 17 | 18 | 1.5.2.1 19 | 1.5.3.2 20 | 1.5.0-alpha.10.1 21 | MMMM dd, yyyy 22 | ${maven.build.timestamp} 23 | 24 | 25 | 26 | clean package 27 | 28 | 29 | org.asciidoctor 30 | asciidoctor-maven-plugin 31 | ${asciidoctor-maven.version} 32 | 33 | 34 | org.asciidoctor 35 | asciidoctorj 36 | ${asciidoctorj.version} 37 | 38 | 39 | org.asciidoctor 40 | asciidoctorj-pdf 41 | ${asciidoctorj-pdf.version} 42 | 43 | 44 | 45 | 46 | generate-pdf-doc 47 | generate-resources 48 | 49 | process-asciidoc 50 | 51 | 52 | pdf 53 | 54 | 55 | 56 | output-html 57 | generate-resources 58 | 59 | process-asciidoc 60 | 61 | 62 | html5 63 | 64 | 65 | 66 | 67 | jsr352_1_0_a.adoc 68 | book 69 | coderay 70 | 71 | asl2 72 | 73 | 74 | 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /specification/src/main/asciidoc/acknowledgements.adoc: -------------------------------------------------------------------------------- 1 | == Acknowledgements 2 | A number of individuals deserve special recognition for their contributions to forming this specification: 3 | 4 | * Kevin Conner 5 | * Tim Fanelli 6 | * Cheng Fang 7 | * Mahesh Kannan 8 | * Scott Kurz 9 | * Wayne Lund 10 | * Simon Martinelli 11 | * Michael Minella 12 | * Kaushik Mukherjee 13 | * Joe Pullen 14 | -------------------------------------------------------------------------------- /specification/src/main/asciidoc/applicability.adoc: -------------------------------------------------------------------------------- 1 | == Applicability of Specification 2 | This specification applies to Java SE and Java EE environments. It requires Java 6 or higher. 3 | -------------------------------------------------------------------------------- /specification/src/main/asciidoc/batch_runtime_spec.adoc: -------------------------------------------------------------------------------- 1 | == Batch Runtime Specification 2 | 3 | === Batch Properties Reserved Namespace 4 | The batch runtime supports properties at job, step, partition, and artifact level. The property name prefix, 'javax.batch', is reserved for 5 | use by the batch runtime, as prescribed by this specification and future 6 | revisions of same. Applications and specification implementations must 7 | not define properties for their own use that begin with this prefix. 8 | Applications that do so risk undefined behavior. 9 | 10 | === Job Metrics 11 | 12 | The batch runtime supports the following chunk-type step metrics: 13 | 14 | [arabic] 15 | . readCount - the number of items successfully read. 16 | . writeCount - the number of items successfully written. 17 | . filterCount - the number of items filtered by ItemProcessor. 18 | . commitCount - the number of transactions committed. 19 | . rollbackCount - the number of transactions rolled back. 20 | . readSkipCount - the number of skippable exceptions thrown by the ItemReader. 21 | . processSkipCount - the number of skippable exceptions thrown by the ItemProcessor. 22 | . writeSkipCount - the number of skippable exceptions thrown by the ItemWriter. 23 | 24 | These metrics are available through the StepExecution runtime object. 25 | See section 10.9.10 for further information on StepExecution. 26 | 27 | === Job Runtime Identifiers 28 | 29 | Job runtime artifacts are uniquely defined at runtime with the following 30 | operational identifiers: 31 | 32 | [width="100%",cols="<50%,<50%",] 33 | |======================================================================= 34 | |instanceId |Is a long that represents an instance of a job. A new job 35 | instance is created everytime a job is started with the JobOperator 36 | "start" method. 37 | 38 | |executionId |Is a long that represents the next attempt to run a 39 | particular job instance. A new execution is created the first time a job 40 | is started and everytime thereafter when an existing job execution is 41 | restarted with the JobOperator "restart" method. Note there can be no 42 | more than one executionId in the STARTED state at one time for a given 43 | job instance. 44 | 45 | |stepExecutionId |Is a long that represents the attempt to execute a 46 | particular step within a job execution. 47 | |======================================================================= 48 | 49 | Note instanceId, executionId, and stepExecutionId are all globally 50 | unique values within a job repository. See section xref:_job_repository[7.4] for explanation 51 | of job repository. 52 | 53 | === JobOperator 54 | 55 | The JobOperator interface provides a set of operations to start, stop, 56 | restart, and inspect jobs. See 10.9.6 for detailed description of this 57 | interface. The JobOperator interface is accessible via a factory 58 | pattern: 59 | 60 | JobOperator jobOper = BatchRuntime.getJobOperator(); 61 | 62 | See section 10.9.5 for details on the BatchRuntime class. 63 | === Batch Artifact Loading 64 | 65 | All batch artifacts comprising a batch application are loadable by the 66 | following loaders in the order specified: 67 | 68 | 1. Implementation-specific loader + 69 | + 70 | The batch runtime implementation _may_provide an 71 | 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 72 | instance or null. + 73 | + 74 | An example of an implementation-specific loader might be CDI or Spring DI. 75 | 2. Archive loader + 76 | + 77 | If an implementation-specific mechanism does not exist or fails toresolve a batch artifact reference (returns null), then the batch 78 | runtime implementation must resolve the reference with an archive 79 | loader. The implementation must provide an archive loader that resolves 80 | the reference by looking up the reference in a `batch.xml` file, which 81 | maps reference name to implementation class name. The loader must return 82 | an instance or null. + 83 | + 84 | 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). + 85 | + 86 | See xref:_job_parameters_on_restart[10.7.1] for more about the `batch.xml` file. 87 | 88 | 3. Thread Context Class Loader + 89 | + 90 | 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. 91 | 92 | === Job XML Loading 93 | 94 | Job XML is specified by name on the JobOperator.start command (see 95 | 10.9.6) to start a job. 96 | 97 | All Job XML references are loadable by the following loaders in the 98 | order specified: 99 | 100 | 1. implementation-specific loader + 101 | + 102 | The batch runtime implementation _must_provide an implementation-specific means by which Job XML references are resolved to a Job XML document. + 103 | + 104 | 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. 105 | 106 | 2. archive loader + 107 | + 108 | 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 109 | from the `META-INF/batch-jobs` directory. + 110 | + 111 | 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). + 112 | + 113 | See xref:_job_xml_substitution_during_restart[10.7.2] for more about the `META-INF/batch-jobs`. 114 | 115 | === Application Packaging Model 116 | The batch artifacts that comprise a batch application requiring no 117 | unique packaging. They may be packaged in a standard jar file or can be 118 | included inside any Java archive type, as supported by the target 119 | execution platform in question.E.g. batch artifacts may be included in 120 | wars, EJB jars, etc, so long as they exist in the class loader scope of 121 | the program initiating the batch jobs (i.e. using the JobOperator start 122 | method). 123 | 124 | ==== `META-INF/batch.xml` 125 | 126 | A batch application may use the archive loader (see section xref:_job_xml_loading[10.5]) to 127 | load batch artifacts. The application can direct artifact loading by 128 | supplying an optional `batch.xml` file. The `batch.xml` file must be stored 129 | under the `META-INF` directory. For .jar files it is the standard `META-INF` 130 | directory. For .war files it is the `WEB-INF/classes/META-INF` directory. 131 | The format and content of the `batch.xml` file follows: 132 | 133 | ---- 134 | 135 | 136 | 137 | ---- 138 | Where: 139 | 140 | [width="100%",cols="<50%,<50%",] 141 | |======================================================================= 142 | | |Specifies the reference name of the batch artifact. 143 | This is the value that is specified on the ref= attribute of the Job 144 | XML. 145 | 146 | | |Specifies the fully qualified class name of the 147 | batch artifact implementation. 148 | |======================================================================= 149 | Notes: 150 | 151 | 1. If an implementation-specific loader is used (see 152 | xref:_job_xml_loading[10.5]) any artifact it loads takes precedence over artifacts specified in `batch.xml`. 153 | 154 | 2. Use of `batch.xml` to load batch artifacts requires the 155 | availability of a zero-argument constructor (either a default 156 | constructor or an explicitly-defined, no-arg 157 | constructor ). 158 | 159 | ==== `META-INF/batch-jobs` 160 | 161 | A batch application may use the archive loader (see section xref:_application_packaging_model[10.6]) to 162 | load Job XML documents. The application does this by storing the Job XML 163 | documents under the `META-INF/batch-jobs` directory. For .jar files the 164 | batch-jobs directory goes under the standard `META-INF` directory. For 165 | .war files it goes under the `WEB-INF/classes/META-INF` directory. Note 166 | Job XML documents are valid only in the batch-jobs directory: 167 | sub-directories are ignored. 168 | Job XML documents stored under `META-INF/batch-jobs` are named with the 169 | convention ``.xml`,Where: 170 | [width="100%",cols="<50%,<50%",] 171 | |======================================================================= 172 | | |Specifies the name of a Job XML. This is the value that is 173 | specified on the JobOperator.start command. 174 | 175 | |.xml |Specifies required file type of a Job XML file under 176 | `META-INF/batch-jobs`. 177 | |======================================================================= 178 | Note if an implementation-specific loader (see xref:_application_packaging_model[10.6]) loads a Job XML 179 | document that document takes precedence over documents stored under 180 | `META-INF/batch-jobs`. 181 | 182 | === Restart Processing 183 | 184 | The JobOperator restart method is used to restart a JobExecution. A 185 | JobExecution is eligible for restart if: 186 | 187 | * Its batch status is STOPPED or FAILED. 188 | * It is the most recent JobExecution. 189 | 190 | ==== Job Parameters on Restart 191 | 192 | Job parameter values are not remembered from one execution to the next. 193 | All Job Parameter substitution during job restart is performed based 194 | exclusively on the job parameters specified on that restart. 195 | 196 | ==== Job XML Substitution during Restart 197 | 198 | See section 8.8.1.8 Job Restart Rule. 199 | 200 | ==== Execution Sequence on Restart – Overview 201 | 202 | On the initial execution of a JobInstance, the sequence of execution is 203 | essentially: 204 | 205 | [arabic] 206 | . Start at initial execution element 207 | . Execute the current execution element 208 | . Either: 209 | .. Transition to next execution element (and go to step 2. above) OR 210 | .. Terminate execution 211 | 212 | On a restart, i.e. a subsequent execution of a JobInstance, the sequence 213 | of execution is similar, but the batch implementation must, in addition, 214 | determine which steps it does and does not need to re-execute. 215 | 216 | So on a restart, the sequence of execution looks like: 217 | 218 | [arabic] 219 | . Start at restart position 220 | . Decide whether or not to execute (or re-execute) the current execution element 221 | . Either: 222 | .. Transition to next execution element (and go to step 2. above) OR 223 | .. Terminate execution 224 | 225 | So it follows that for restart we need: a definition of where in the job 226 | definition to begin; rules for deciding whether or not to execute the 227 | current execution element; and rules for performing transitioning, 228 | especially taking into account that all steps relevant to transitioning 229 | may not have executed on this (restart) execution. These rules are 230 | provided below. 231 | 232 | ==== Execution Sequence on Restart – Detailed Rules 233 | Upon restart, the job is processed as follows: 234 | 235 | [arabic] 236 | . Job XML Substitution is performed (see section xref:_job_xml_substitution[8.8]). 237 | . Start by setting the current position to the restart position. The restart position is either: 238 | .. the execution element identified by the elements "restart" 239 | attribute if that is how the previous execution ended; else 240 | .. the initial execution element determined the same as upon initial 241 | job start, as described in section xref:_step_sequence[8.2.5] Step Sequence; 242 | . Determine if the current execution element should re-execute: 243 | .. 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 244 | is a terminating transition such as end, stop, or fail, then terminate 245 | the restart execution accordingly. 246 | .. If the current execution element is a COMPLETED step that specifies 247 | allow-restart-if-complete=true, then re-run the step and transition 248 | based on the new exit status from the new step execution. As above, 249 | either repeat step 3 with the next execution element or terminate the 250 | new execution as the transition element 251 | .. If the current execution element is a 252 | STOPPED or FAILED step then restart the step and transition based on the 253 | exit status from the new step execution.+ 254 | + 255 | Note if the step is a partitioned step, only the partitions that did not 256 | complete previously are restarted. This behavior may be overridden via a 257 | PartitionMapper (see section xref:_batchruntime[10.8.5]). Note 258 | for a partitioned step, the checkpoints and persistent user data are 259 | loaded from the persistent store on a per-partition basis (this is not a 260 | new rule, but a fact implied by the discussion of checkpoints in section 261 | xref:_step_partitioning[8.2.6] and the Step Context in section 9.4.1.1, which is summarized here 262 | for convenience). 263 | .. If the current execution element is a decision, execute the decision 264 | (i.e. execute the Decider) unconditionally. The Deciders "decide" method 265 | is passed a StepExecution array as a parameter. This array will be 266 | populated with the most-recently completed StepExecution(s) for each 267 | corresponding step.E.g. some StepExecution(s) may derive from previous 268 | job executions and some from the current restart (execution). A single 269 | decision following a split could even have a mix of old, new 270 | StepExecution(s) in the same array. 271 | .. If the current execution element is a flow, transition to the first 272 | execution element in the flow and perform step 3 with this as the 273 | current element. When restart processing of the flow has completed, then 274 | follow the same rules which apply during the original execution (see 275 | section xref:_transitioning_rules[8.9]) to transition at the flow level to the next execution 276 | element, and repeat step 3 with that element as the current element. + 277 | + 278 | Note the same rules regarding transitioning within a flow during an 279 | original execution apply during restart processing as well. 280 | .. If the current execution element is a split, proceed in parallel for 281 | each flow in the split. For each flow, repeat step 3 with the flow 282 | element as the current element. When all flows in the split have been 283 | processed, follow the split's transition to the next execution element 284 | and repeat step 3 with that element as the current element. 285 | 286 | ==== PartitionMapper on Restart 287 | 288 | When the PartitionMapper is invoked at the beginning of a step which has 289 | been executed within a previous job execution, the first and most 290 | important decision for the mapper implementor to make is whether or not 291 | to keep the previous partitions or to begin the new execution with new 292 | partition definitions. 293 | 294 | This decision is communicated to the batch implementation via the 295 | 'partitionsOverride' property of the PartitionPlan built by the mapper, 296 | i.e. the result of PartitionPlan's getPartitionsOverride() method. 297 | 298 | This property directs whether or not the partitions used in the previous 299 | execution of this step will or will be used (i.e. the relevant data 300 | carried forward and applied) within the current execution of this step. 301 | (As a consequence, the value of this property has no real meaning when 302 | the mapper is first called on the first execution of this step). 303 | 304 | ===== partitionsOverride = False 305 | 306 | Three rules apply in the case where override is set to 'false': 307 | 308 | ====== Number of Partitions Must Be Same 309 | 310 | The key idea here is that the mapper must build a partition plan with 311 | the same number of partitions that were used in the previous execution 312 | of this step. As a consequence, it is an error for the partition plan to 313 | return (via getPartitions()) a different number than the number of 314 | partitions established by the plan the last time this step was executed. 315 | 316 | ====== Partition Properties Populated From Current Plan 317 | 318 | Though the number of partitions in the previous plan is persisted, the 319 | Properties[] returned by the previous PartitionPlan's 320 | getPartitionProperties() is not. On a new execution of this step, it is 321 | the current return value of PartitionPlan#getPartitionProperties() which 322 | is used to populate the pool of potential 'partitionPlan' substitutions 323 | (see section 8.8.1.4). 324 | 325 | ====== "Numbering" of Partitions via Partition Properties 326 | 327 | Upon execution of this step, the batch implementation will associate 328 | each element of the Properties[] returned by 329 | PartitionPlan#getPartitionProperties() with a single partition, in order 330 | to potentially resolve 'partitionPlan' substitutions (see section 331 | 8.8.1.4) for a single partition. During the course of execution of each 332 | partition, the batch implementation will capture data such as checkpoint 333 | values, persistent user data, etc. 334 | 335 | Upon a new execution of this step during restart, the batch 336 | implementation must ensure that a similar mapping occurs. That is, the 337 | elements of the new Properties[] returned by the 338 | PartitionPlan#getPartitionProperties() built by the mapper must be 339 | mapped to the partitions in the same order as the earlier elements of 340 | the earlier Properties[] were mapped (for resolving 'partitionPlan' 341 | substitutions). 342 | 343 | E.g., the following must hold: 344 | 345 | Earlier Execution: 346 | ---- 347 | partitionPlanProps[] = 348 | mapper.getPartitionPlan().getPartitionProperties(); 349 | 350 | partitionPlanProps[0] ---maps to---> partition leaving off at 351 | checkpoints R0, W0 352 | 353 | partitionPlanProps[1] ---maps to---> partition leaving off at 354 | checkpoints R1, W1 355 | ---- 356 | Current Execution: 357 | ---- 358 | newPartitionPlanProps[] = 359 | mapper.getPartitionPlan().getPartitionProperties(); 360 | 361 | newPartitionPlanProps[0] ---maps to---> partition resuming at 362 | checkpoints R0, W0 363 | 364 | newPartitionPlanProps [1] ---maps to---> partition resuming at 365 | checkpoints R1, W1 366 | ---- 367 | In the shorthand above, "maps to" simply means that the Properties 368 | object on the left is used to potentially resolve the 'partitionPlan' 369 | substitutions for the give partition, before it executes as described. 370 | 371 | ===== partitionsOverride = True 372 | 373 | In this case, all partition execution data: checkpoints, persistent user 374 | data, etc. from the earlier execution are discarded, and the new 375 | PartitionPlan built by the new execution of the PartitionMapper may 376 | define either the same or a different number of partitions; the new P 377 | artitionPlan's getPartitionProperties() return value will be used to 378 | resolve 'partitionPlan' substitutions. 379 | 380 | === Supporting Classes 381 | 382 | ==== JobContext 383 | [[app-listing]] 384 | [source,java] 385 | .JobContext.java 386 | ---- 387 | package javax.batch.runtime.context; 388 | /** 389 | * 390 | * A JobContext provides information about the current 391 | * job execution. 392 | * 393 | */ 394 | import java.util.Properties; 395 | import javax.batch.runtime.BatchStatus; 396 | public interface JobContext 397 | { 398 | /** 399 | * Get job name 400 | * *@return* value of 'id' attribute from 401 | */ 402 | public String getJobName(); 403 | /** 404 | * The getTransientUserData method returns a transient data object 405 | * belonging to the current Job XML execution element. 406 | * *@return* user-specified type 407 | */ 408 | public Object getTransientUserData(); 409 | /** 410 | * The setTransientUserData method stores a transient data object into 411 | * the current batch context. 412 | * @param data is the user-specified type 413 | */ 414 | public void setTransientUserData(Object data); 415 | /** 416 | * The getInstanceId method returns the current job's instance 417 | * id. 418 | * *@return* job instance id 419 | */ 420 | public *long* getInstanceId(); 421 | /** 422 | * The getExecutionId method returns the current job's current 423 | * execution id. 424 | * *@return* job execution id 425 | */ 426 | public *long* getExecutionId(); 427 | /** 428 | * The getProperties method returns the job level properties 429 | * specified in a job definition. 430 | *

431 | * A couple notes: 432 | *

    433 | *
  • There is no guarantee that the same Properties object instance 434 | * is always returned in the same (job) scope. 435 | *
  • Besides the properties which are defined in JSL within a child 436 | * < 437 | properties> 438 | element of a < 439 | job> 440 | element, the batch 441 | * runtime implementation may choose to include additional, 442 | * implementation-defined properties. 443 | *
444 | * 445 | * *@return* job level properties 446 | */ 447 | public Properties getProperties(); 448 | /** 449 | * The getBatchStatus method simply returns the batch status value * set 450 | by the batch runtime into the job context. 451 | * *@return* batch status string 452 | */ 453 | public BatchStatus getBatchStatus(); 454 | /** 455 | * The getExitStatus method simply returns the exit status value stored 456 | * into the job context through the setExitStatus method or null. 457 | * *@return* exit status string 458 | */ 459 | public String getExitStatus(); 460 | /** 461 | * The setExitStatus method assigns the user-specified exit status for 462 | * the current job. When the job ends, the exit status of the job is 463 | * the value specified through setExitStatus. If setExitStatus was not 464 | * called or was called with a null value, then the exit status 465 | * defaults to the batch status of the job. 466 | * @param status string 467 | */ 468 | public void setExitStatus(String status); 469 | } 470 | ---- 471 | 472 | ==== StepContext 473 | [[app-listing]] 474 | [source,java] 475 | .StepContext.java 476 | ---- 477 | package javax.batch.runtime.context; 478 | import java.io.Serializable; 479 | import java.util.Properties; 480 | import javax.batch.runtime.BatchStatus; 481 | import javax.batch.runtime.Metric; 482 | /** 483 | * 484 | * A StepContext provides information about the current step 485 | * of a job execution. 486 | * 487 | */ 488 | public interface StepContext 489 | { 490 | /** 491 | * Get step name 492 | * *@return* value of 'id' attribute from 493 | * 494 | */ 495 | public String getStepName(); 496 | /** 497 | * The getTransientUserData method returns a transient data object 498 | * belonging to the current Job XML execution element. 499 | * *@return* user-specified type 500 | */ 501 | public Object getTransientUserData(); 502 | /** 503 | * The setTransientUserData method stores a transient data object into 504 | * the current batch context. 505 | * @param data is the user-specified type 506 | */ 507 | public void setTransientUserData(Object data); 508 | /** 509 | * The getStepExecutionId method returns the current step's 510 | * execution id. 511 | * *@return* step execution id 512 | */ 513 | public *long* getStepExecutionId(); 514 | /** 515 | * The getProperties method returns the step 516 | level properties 517 | * specified in a job definition. 518 | *

519 | * A couple notes: 520 | *

    521 | *
  • There is no guarantee that the same Properties object instance 522 | * is always returned in the same (step) scope. 523 | *
  • Besides the properties which are defined in JSL within a child 524 | * < 525 | properties> 526 | element of a < 527 | step> 528 | element, the batch 529 | * runtime implementation may choose to include additional, 530 | * implementation-defined properties. 531 | *
532 | * *@return* step level properties 533 | */ 534 | public Properties getProperties(); 535 | /** 536 | * The getPersistentUserData method returns a persistent data object 537 | * belonging to the current step. The user data type must implement 538 | * java.util.Serializable. This data is saved as part of a step's 539 | * checkpoint. For a step that does not do checkpoints, it is saved 540 | * after the step ends. It is available upon restart. 541 | * *@return* user-specified type 542 | */ 543 | public Serializable getPersistentUserData(); 544 | /** 545 | * The setPersistentUserData method stores a persistent data object 546 | * into the current step. The user data type must implement 547 | * java.util.Serializable. This data is saved as part of a step's 548 | * checkpoint. For a step that does not do checkpoints, it is saved 549 | * after the step ends. It is available upon restart. 550 | * @param data is the user-specified type 551 | */ 552 | public void setPersistentUserData(Serializable data); 553 | /** 554 | * The getBatchStatus method returns the current batch status of the 555 | * current step. This value is set by the batch runtime and changes as 556 | * the batch status changes. 557 | * *@return* batch status string 558 | */ 559 | public BatchStatus getBatchStatus(); 560 | /** 561 | * The getExitStatus method simply returns the exit status value stored 562 | * into the step context through the setExitStatus method or null. 563 | * *@return* exit status string 564 | */ 565 | public String getExitStatus(); 566 | /** 567 | * The setExitStatus method assigns the user-specified exit status for 568 | * the current step. When the step ends, the exit status of the step is 569 | * the value specified through setExitStatus. If setExitStatus was not 570 | * called or was called with a null value, then the exit status 571 | * defaults to the batch status of the step. 572 | * @param status string 573 | */ 574 | public void setExitStatus(String status); 575 | /** 576 | * The getException method returns the last exception thrown from a 577 | * step level batch artifact to the batch runtime. 578 | * *@return* the last exception 579 | */ 580 | public Exception getException(); 581 | /** 582 | * The getMetrics method returns an array of step level metrics. These 583 | * are things like commits, skips, etc. 584 | * *@see* javax.batch.runtime.metric.Metric for definition of standard 585 | * metrics. 586 | * *@return* metrics array 587 | */ 588 | public Metric[] getMetrics(); 589 | } 590 | ---- 591 | 592 | ==== Metric 593 | 594 | [[app-listing]] 595 | [source,java] 596 | .Metric.java 597 | ---- 598 | package javax.batch.runtime; 599 | /** 600 | * 601 | * The Metric interface defines job metrics recorded by 602 | * the batch runtime. 603 | * 604 | */ 605 | public interface Metric 606 | { 607 | public *enum* MetricType 608 | { 609 | READ_COUNT_, _WRITE_COUNT_, 610 | _COMMIT_COUNT_, 611 | _ROLLBACK_COUNT_, _READ_SKIP_COUNT_, _PROCESS_SKIP_COUNT_, 612 | _FILTER_COUNT_, 613 | _WRITE_SKIPCOUNT 614 | } 615 | /** 616 | * The getName method returns the metric type. 617 | * *@return* metric type. 618 | */ 619 | public MetricType getType(); 620 | /** 621 | * The getValue method returns the metric value. 622 | * *@return* metric value. 623 | */ 624 | public *long* getValue(); 625 | } 626 | ---- 627 | 628 | 629 | ==== PartitionPlan 630 | [[app-listing]] 631 | [source,java] 632 | .PartitionPlan.java 633 | ---- 634 | package javax.batch.api.partition; 635 | /** 636 | * 637 | * PartitionPlan is a helper class that carries partition processing 638 | * information set by the *@PartitionMapper* method. 639 | * 640 | * A PartitionPlan contains: 641 | *
    642 | *
  1. number of partition instances
  2. 643 | *
  3. number of threads on which to execute the partitions
  4. 644 | *
  5. substitution properties for each Partition (which can be 645 | * referenced using the # 646 | { 647 | partitionPlan['propertyName'] 648 | } 649 | 650 | * syntax.
  6. 651 | *
652 | */ 653 | import java.util.Properties; 654 | public interface PartitionPlan 655 | { 656 | /** 657 | * Set number of partitions. 658 | * @param count specifies the partition count 659 | */ 660 | public void setPartitions(int count); 661 | /** 662 | * Specify whether or not to override the partition 663 | * count from the previous job execution. This applies 664 | * only to step restart . 665 | *

666 | * When false is specified, the 667 | * partition count from the previous job execution is used 668 | * and any new value set for partition count in the current run 669 | * is ignored. In addition, partition results from the previous 670 | * job execution are remembered, and only incomplete partitions 671 | * are reprocessed. 672 | *

673 | * When true is specified, the partition count from the current run 674 | * is used and all results from past partitions are discarded. Any 675 | * resource cleanup or back out of work done in the previous run is the 676 | * responsibility of the application. The PartitionReducer artifact's 677 | * rollbackPartitionedStep method is invoked during restart before any 678 | * partitions begin processing to provide a cleanup hook. 679 | */ 680 | public void setPartitionsOverride(boolean override); 681 | /** 682 | * Return current value of partition override setting. 683 | * *@return* override setting. 684 | */ 685 | public boolean getPartitionsOverride(); 686 | /** 687 | * Set maximum number of threads requested to use to run 688 | * partitions for this step. A value of '0' requests the batch 689 | * implementation to use the partition count as the thread 690 | * count. Note the batch runtime is not required to use 691 | * this full number of threads; 692 | it may not have this many 693 | * available, and may use less. 694 | * 695 | * @param count specifies the requested thread count 696 | */ 697 | public void setThreads(int count); 698 | /** 699 | * Sets array of substitution Properties objects for the set of 700 | Partitions. 701 | * @param props specifies the Properties object array 702 | * @see PartitionPlan#getPartitionProperties() 703 | */ 704 | public void setPartitionProperties(Properties[] props); 705 | /** 706 | * Gets count of Partitions. 707 | * *@return* Partition count 708 | */ 709 | public int getPartitions(); 710 | /** 711 | * Gets maximum number of threads requested to use to run 712 | * partitions for this step. A value of '0' requests the batch 713 | * implementation to use the partition count as the thread 714 | * count. Note the batch runtime is not required to use 715 | * this full number of threads; 716 | it may not have this many 717 | * available, and may use less. 718 | * 719 | * *@return* requested thread count 720 | */ 721 | public int getThreads(); 722 | /** 723 | * Gets array of Partition Properties objects for Partitions. 724 | *

725 | * These can be used in Job XML substitution using 726 | * substitution expressions with the syntax: 727 | * # 728 | { 729 | partitionPlan['propertyName'] 730 | } 731 | 732 | *

733 | * Each element of the Properties array returned can 734 | * be used to resolving substitutions for a single partition. 735 | * In the typical use case, each Properties element will 736 | * have a similar set of property names, with a 737 | * substitution potentially resolving to the corresponding 738 | * value for each partition. 739 | * 740 | * *@return* Partition Properties object array 741 | */ 742 | public Properties[] 743 | getPartitionProperties(); 744 | } 745 | ---- 746 | 747 | 748 | 749 | [[app-listing]] 750 | [source,java] 751 | .PartitionPlanImpl.java 752 | ---- 753 | package javax.batch.api.partition; 754 | import java.util.Properties; 755 | /** 756 | * The PartitionPlanImpl class provides a basic implementation 757 | * of the PartitionPlan interface. 758 | */ 759 | public class PartitionPlanImpl implements PartitionPlan 760 | { 761 | *private* int partitions= 0; 762 | *private* boolean override= *false*; 763 | *private* int threads= 0; 764 | Properties[] partitionProperties= null; 765 | @Override 766 | public void setPartitions(int count) 767 | { 768 | partitions= count; 769 | // default thread count to partition count 770 | *if* (threads == 0) threads= count; 771 | } 772 | @Override 773 | public void setThreads(int count) 774 | { 775 | threads= count; 776 | } 777 | @Override 778 | public void setPartitionsOverride(boolean override) 779 | { 780 | *this*.override= override; 781 | } 782 | @Override 783 | public boolean getPartitionsOverride() 784 | { 785 | return override; 786 | } 787 | @Override 788 | public void setPartitionProperties(Properties[] props) 789 | { 790 | partitionProperties= props; 791 | } 792 | @Override 793 | public int getPartitions() 794 | { 795 | return partitions; 796 | } 797 | @Override 798 | public int getThreads() 799 | { 800 | return threads; 801 | } 802 | @Override 803 | public Properties[] getPartitionProperties() 804 | { 805 | return partitionProperties; 806 | } 807 | } 808 | ---- 809 | 810 | ==== BatchRuntime 811 | 812 | [[app-listing]] 813 | [source,java] 814 | .BatchRuntime.java 815 | ---- 816 | package javax.batch.runtime; 817 | /** 818 | * The BatchRuntime represents the batch 819 | * runtime environment. 820 | * 821 | */ 822 | import javax.batch.operations.JobOperator; 823 | /** 824 | * BatchRuntime represents the JSR 352 Batch Runtime. 825 | * It provides factory access to the JobOperator interface. 826 | * 827 | */ 828 | public class BatchRuntime 829 | { 830 | /** 831 | * The getJobOperator factory method returns 832 | * an instance of the JobOperator interface. 833 | * *@return* JobOperator instance. 834 | */ 835 | public *static* JobOperator getJobOperator() 836 | { 837 | return null; 838 | } 839 | } 840 | ---- 841 | 842 | 843 | ==== BatchStatus 844 | [[app-listing]] 845 | [source,java] 846 | .BatchStatus.java 847 | ---- 848 | package javax.batch.runtime; 849 | 850 | /** 851 | * BatchStatus enum defines the batch status values 852 | * possible for a job. 853 | * 854 | */ 855 | public enum BatchStatus 856 | { 857 | STARTING_, _STARTED_, _STOPPING_, 858 | _STOPPED_, _FAILED_, _COMPLETED_, _ABANDONED_ 859 | } 860 | ---- 861 | 862 | ==== JobOperator 863 | [[app-listing]] 864 | [source,java] 865 | .JobOperator.java 866 | ---- 867 | package javax.batch.operations; 868 | import java.util.List; 869 | import java.util.Set; 870 | import java.util.Properties; 871 | import javax.batch.runtime.JobExecution; 872 | import javax.batch.runtime.JobInstance; 873 | import javax.batch.runtime.StepExecution; 874 | /** 875 | * JobOperator provide the interface for operating on batch jobs. 876 | * Through the JobOperator a program can start, stop, and restart jobs. 877 | * It can additionally inspect job history, to discover what jobs 878 | * are currently running and what jobs have previously run. 879 | * 880 | * The JobOperator interface imposes no security constraints. However, 881 | * the implementer is free to limit JobOperator methods with a security 882 | * scheme of its choice. The implementer should terminate any method 883 | * that is limited by the security scheme with a JobSecurityException. 884 | * 885 | */ 886 | public interface JobOperator 887 | { 888 | /** 889 | * Returns a set of all job names known to the batch runtime. 890 | * 891 | * *@return* a set of job names. 892 | * @throws JobSecurityException 893 | */ 894 | public Set getJobNames() throws JobSecurityException; 895 | /** 896 | * Returns number of instances of a job with a particular name. 897 | * 898 | * @param jobName 899 | * specifies the name of the job. 900 | * *@return* count of instances of the named job. 901 | * @throws NoSuchJobException 902 | * @throws JobSecurityException 903 | */ 904 | public int getJobInstanceCount(String jobName) throws 905 | NoSuchJobException, 906 | JobSecurityException; 907 | /** 908 | * Returns all JobInstances belonging to a job with a particular name 909 | * in reverse chronological order. 910 | * 911 | * @param jobName 912 | * specifies the job name. 913 | * @param start 914 | * specifies the relative starting number (zero based) to 915 | * return from the 916 | * maximal list of job instances. 917 | * @param count 918 | * specifies the number of job instances to return from the 919 | * starting position of the maximal list of job instances. 920 | * *@return* list of JobInstances. 921 | * @throws NoSuchJobException 922 | * @throws JobSecurityException 923 | */ 924 | public List getJobInstances(String jobName, int start, 925 | int count)throws NoSuchJobException, JobSecurityException; 926 | /** 927 | * Returns execution ids for job instances with the specified 928 | * name that have running executions. 929 | * 930 | * @param jobName 931 | * specifies the job name. 932 | * *@return* a list of execution ids. 933 | * @throws NoSuchJobException 934 | * @throws JobSecurityException 935 | */ 936 | public List getRunningExecutions(String jobName) throws 937 | NoSuchJobException, JobSecurityException; 938 | /** 939 | * Returns job parameters for a specified job instance. These are the 940 | * key/value pairs specified when the instance was originally created 941 | * by the start method. 942 | * 943 | * @param executionId 944 | * specifies the execution from which to retrieve the 945 | * parameters. 946 | * *@return* a Properties object containing the key/value job parameter 947 | * pairs. 948 | * @throws NoSuchJobExecutionException 949 | * @throws JobSecurityException 950 | */ 951 | public Properties getParameters(*long* executionId) 952 | throws NoSuchJobExecutionException, JobSecurityException; 953 | /** 954 | * Creates a new job instance and starts the first execution of that 955 | * instance, which executes asynchronously. 956 | * 957 | * Note the Job XML describing the job is first searched for by name 958 | * according to a means prescribed by the batch runtime implementation. 959 | * This may vary by implementation. If the Job XML is not found by that 960 | * means, then the batch runtime must search for the specified Job XML 961 | * as a resource from the `META-INF/batch-jobs` directory based on the 962 | * current class loader. Job XML files under `META-INF/batch-jobs` 963 | * directory follow a naming convention of "name".xml where "name" is 964 | * the value of the jobXMLName parameter (see below). 965 | * 966 | * @param jobXMLName 967 | * specifies the name of the Job XML describing the job. 968 | * @param jobParameters 969 | * specifies the keyword/value pairs for attribute 970 | * substitution in the Job XML. 971 | * *@return* executionId for the job execution. 972 | * @throws JobStartException 973 | * @throws JobSecurityException 974 | */ 975 | public *long* start(String jobXMLName, Properties jobParameters) 976 | throws 977 | JobStartException, JobSecurityException; 978 | /** 979 | * Restarts a failed or stopped job instance, which executes 980 | * asynchronously. 981 | * 982 | * @param executionId 983 | * specifies the execution to to restart. This execution 984 | * must be the most recent execution that ran. 985 | * @param restartParameters 986 | * specifies the keyword/value pairs for attribute 987 | * substitution in the Job XML. 988 | * *@return* new executionId 989 | * @throws JobExecutionAlreadyCompleteException 990 | * @throws NoSuchJobExecutionException 991 | * @throws JobExecutionNotMostRecentException, 992 | * @throws JobRestartException 993 | * @throws JobSecurityException 994 | */ 995 | public *long* restart(*long* executionId, Properties 996 | restartParameters) 997 | throws JobExecutionAlreadyCompleteException, 998 | NoSuchJobExecutionException, 999 | JobExecutionNotMostRecentException, 1000 | JobRestartException, 1001 | JobSecurityException; 1002 | /** 1003 | * Request a running job execution stops. This 1004 | * method notifies the job execution to stop 1005 | * and then returns. The job execution normally 1006 | * stops and does so asynchronously. Note 1007 | * JobOperator cannot guarantee the jobs stops: 1008 | * it is possible a badly behaved batch application 1009 | * does not relinquish control. 1010 | *

1011 | * Note for partitioned batchlet steps the Batchlet 1012 | * stop method is invoked on each thread actively 1013 | * processing a partition. 1014 | * 1015 | * @param executionId 1016 | * specifies the job execution to stop. 1017 | * The job execution must be running. 1018 | * @throws NoSuchJobExecutionException 1019 | * @throws JobExecutionNotRunningException 1020 | * @throws JobSecurityException 1021 | */ 1022 | public void stop(*long* executionId) throws 1023 | NoSuchJobExecutionException, 1024 | JobExecutionNotRunningException, JobSecurityException; 1025 | /** 1026 | * Set batch status to ABANDONED. The instance must have 1027 | * no running execution. 1028 | *

1029 | * Note that ABANDONED executions cannot be restarted. 1030 | * 1031 | * @param executionId 1032 | * specifies the job execution to abandon. 1033 | * @throws NoSuchJobExecutionException 1034 | * @throws JobExecutionIsRunningException 1035 | * @throws JobSecurityException 1036 | */ 1037 | public void abandon(*long* executionId) throws 1038 | NoSuchJobExecutionException, 1039 | JobExecutionIsRunningException, JobSecurityException; 1040 | /** 1041 | * Return the job instance for the specified execution id. 1042 | * 1043 | * @param executionId 1044 | * specifies the job execution. 1045 | * *@return* job instance 1046 | * @throws NoSuchJobExecutionException 1047 | * @throws JobSecurityException 1048 | */ 1049 | public JobInstance getJobInstance(*long* executionId) throws 1050 | NoSuchJobExecutionException, JobSecurityException; 1051 | /** 1052 | * Return all job executions belonging to the specified job instance. 1053 | * 1054 | * @param jobInstance 1055 | * specifies the job instance. 1056 | * *@return* list of job executions 1057 | * @throws NoSuchJobInstanceException 1058 | * @throws JobSecurityException 1059 | */ 1060 | public List getJobExecutions(JobInstance instance) 1061 | throws 1062 | NoSuchJobInstanceException, JobSecurityException; 1063 | /** 1064 | * Return job execution for specified execution id 1065 | * 1066 | * @param executionId 1067 | * specifies the job execution. 1068 | * *@return* job execution 1069 | * @throws NoSuchJobExecutionException 1070 | * @throws JobSecurityException 1071 | */ 1072 | public JobExecution getJobExecution(*long* executionId) throws 1073 | NoSuchJobExecutionException, JobSecurityException; 1074 | /** 1075 | * Return StepExecutions for specified execution id. 1076 | * 1077 | * @param executionId 1078 | * specifies the job execution. 1079 | * *@return* step executions (order not guaranteed) 1080 | * @throws NoSuchJobExecutionException 1081 | * @throws JobSecurityException 1082 | */ 1083 | public List getStepExecutions(*long* jobExecutionId) 1084 | throws NoSuchJobExecutionException, JobSecurityException; 1085 | } 1086 | ---- 1087 | 1088 | ==== JobInstance 1089 | [[app-listing]] 1090 | [source,java] 1091 | .JobInstance.java 1092 | ---- 1093 | package javax.batch.runtime; 1094 | public interface JobInstance 1095 | { 1096 | /** 1097 | * Get unique id for this JobInstance. 1098 | * *@return* instance id 1099 | */ 1100 | public *long* getInstanceId(); 1101 | /** 1102 | * Get job name. 1103 | * *@return* value of 'id' attribute from 1104 | */ 1105 | public String getJobName(); 1106 | } 1107 | ---- 1108 | 1109 | ==== JobExecution 1110 | 1111 | [[app-listing]] 1112 | [source,java] 1113 | .JobExecution.java 1114 | ---- 1115 | package javax.batch.runtime; 1116 | import java.util.Date; 1117 | import java.util.Properties; 1118 | public interface JobExecution 1119 | { 1120 | /** 1121 | * Get unique id for this JobExecution. 1122 | * *@return* execution id 1123 | */ 1124 | public *long* getExecutionId(); 1125 | /** 1126 | * Get job name. 1127 | * *@return* value of 'id' attribute from 1128 | */ 1129 | public String getJobName(); 1130 | /** 1131 | * Get batch status of this execution. 1132 | * *@return* batch status value. 1133 | */ 1134 | public BatchStatus getBatchStatus(); 1135 | /** 1136 | * Get time execution entered STARTED status. 1137 | * *@return* date (time) 1138 | */ 1139 | public Date getStartTime(); 1140 | /** 1141 | * Get time execution entered end status: COMPLETED, STOPPED, FAILED 1142 | * *@return* date (time) 1143 | */ 1144 | public Date getEndTime(); 1145 | /** 1146 | * Get execution exit status. 1147 | * *@return* exit status. 1148 | */ 1149 | public String getExitStatus(); 1150 | /** 1151 | * Get time execution was created. 1152 | * *@return* date (time) 1153 | */ 1154 | public Date getCreateTime(); 1155 | /** 1156 | * Get time execution was last updated updated. 1157 | * *@return* date (time) 1158 | */ 1159 | public Date getLastUpdatedTime(); 1160 | /** 1161 | * Get job parameters for this execution. 1162 | * *@return* job parameters 1163 | */ 1164 | public Properties getJobParameters(); 1165 | } 1166 | ---- 1167 | 1168 | ==== StepExecution 1169 | 1170 | [[app-listing]] 1171 | [source,java] 1172 | .StepExecution.java 1173 | ---- 1174 | package javax.batch.runtime; 1175 | import java.util.Date; 1176 | import java.io.Serializable; 1177 | public interface StepExecution 1178 | { 1179 | /** 1180 | * Get unique id for this StepExecution. 1181 | * *@return* StepExecution id 1182 | */ 1183 | public *long* getStepExecutionId(); 1184 | /** 1185 | * Get step name. 1186 | * *@return* value of 'id' attribute from 1187 | */ 1188 | public String getStepName(); 1189 | /** 1190 | * Get batch status of this step execution. 1191 | * *@return* batch status. 1192 | */ 1193 | public BatchStatus getBatchStatus(); 1194 | /** 1195 | * Get time this step started. 1196 | * *@return* date (time) 1197 | */ 1198 | public Date getStartTime(); 1199 | /** 1200 | * Get time this step ended. 1201 | * *@return* date (time) 1202 | */ 1203 | public Date getEndTime(); 1204 | /** 1205 | * Get exit status of step. 1206 | * *@return* exit status 1207 | */ 1208 | public String getExitStatus(); 1209 | /** 1210 | * Get persistent user data. 1211 | *

1212 | * For a partitioned step, this returns 1213 | * the persistent user data of the 1214 | * StepContext of the "top-level" 1215 | * or main thread (the one the PartitionAnalyzer, etc. 1216 | * execute on). It does not return the persistent user 1217 | * data of the partition threads. 1218 | * *@return* persistent data 1219 | */ 1220 | public Serializable 1221 | getPersistentUserData (); 1222 | /** 1223 | * Get step metrics 1224 | * *@return* array of metrics 1225 | */ 1226 | public Metric[] getMetrics(); 1227 | } 1228 | ---- 1229 | 1230 | ==== Batch Exception Classes 1231 | 1232 | This specification defines batch exception classes in package 1233 | javax.batch.operations. Note all batch exceptions are direct subclasses 1234 | of base class BatchRuntimeException, which itself is a direct subclass 1235 | of java.lang.RuntimeException. The following batch exception classes are 1236 | defined: 1237 | 1238 | 1. JobExecutionAlreadyCompleteException 1239 | 1240 | 2. JobExecutionIsRunningException 1241 | 1242 | 3. JobExecutionNotMostRecentException 1243 | 1244 | 4. JobExecutionNotRunningException 1245 | 1246 | 5. JobRestartException 1247 | 1248 | 6. JobSecurityException 1249 | 1250 | 7. JobStartException 1251 | 1252 | 8. NoSuchJobException 1253 | 1254 | 9. NoSuchJobExecutionException 1255 | 1256 | 10. NoSuchJobInstanceException 1257 | -------------------------------------------------------------------------------- /specification/src/main/asciidoc/batch_xml_xsd.adoc: -------------------------------------------------------------------------------- 1 | == Batch XML XSD 2 | 3 | [[app-listing]] 4 | [source,xml] 5 | ---- 6 | 7 | 11 | 12 | 13 | 14 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | ---- 24 | -------------------------------------------------------------------------------- /specification/src/main/asciidoc/domain_language.adoc: -------------------------------------------------------------------------------- 1 | == Domain Language of Batch 2 | To any experienced batch architect, the overall concepts of batch 3 | processing used by JSR 352 should be familiar and comfortable. There are 4 | "Jobs" and "Steps" and developer supplied processing units called 5 | ItemReaders and ItemWriters. However, because of the JSR 352 operations, 6 | callbacks, and idioms, there are opportunities for the following: 7 | 8 | [loweralpha] 9 | . significant improvement in adherence to a clear separation of 10 | concerns 11 | . clearly delineated architectural layers and services provided as 12 | interfaces 13 | . significantly enhanced extensibility 14 | 15 | The diagram below is a simplified version of the batch reference 16 | architecture that has been used for decades. It provides an overview of 17 | the components that make up the domain language of batch processing. 18 | This architecture framework is a blueprint that has been proven through 19 | decades of implementations on the last several generations of platforms 20 | (COBOL/Mainframe, C++/Unix, and now Java/anywhere). JCL and COBOL 21 | developers are likely to be as comfortable with the concepts as C++, C# 22 | and Java developers. JSR 352 specifies the layers, components and 23 | technical services commonly found in robust, maintainable systems used 24 | to address the creation of simple to complex batch applications. 25 | 26 | image::images/image003.png[image] 27 | 28 | The diagram above highlights the key concepts that make up the domain 29 | language of batch. A Job has one to many steps, which has no more than 30 | one ItemReader, ItemProcessor, and ItemWriter. A job needs to be 31 | launched (JobOperator), and meta data about the currently running 32 | process needs to be stored (JobRepository). 33 | 34 | === Job 35 | A Job is an entity that encapsulates an entire batch process. A Job 36 | will be wired together via a Job Specification Language. However, Job is 37 | just the top of an overall hierarchy: 38 | 39 | image::images/image005.png[http://static.springsource.org/spring-batch/trunk/reference/html-single/images/job-heirarchy.png] 40 | 41 | With JSR 352, a Job is simply a container for Steps. It combines 42 | multiple steps that belong logically together in a flow and allows for 43 | configuration of properties global to all steps, such as restartability. 44 | The job configuration contains: 45 | 46 | 1. The simple name of the job 47 | 48 | 2. Definition and ordering of Steps 49 | 50 | 3. Whether or not the job is restartable 51 | 52 | ==== JobInstance 53 | 54 | A JobInstance refers to the concept of a logical job run. Let's consider 55 | a batch job that should be run once at the end of the day, such as the 56 | 'EndOfDay' job from the diagram above. There is one 'EndOfDay' Job, but 57 | each individual run of the Job must be tracked separately. In the case 58 | of this job, there will be one logical JobInstance per day. For example, 59 | there will be a January 1st run, and a January 2nd run. If the January 60 | 1st run fails the first time and is run again the next day, it is still 61 | the January 1st run. Usually this corresponds with the data it is 62 | processing as well, meaning the January 1st run processes data for 63 | January 1st, etc. Therefore, each JobInstance can have multiple 64 | executions (JobExecution is discussed in more detail below); one or many 65 | JobInstances corresponding to a particular Job can be running at a given 66 | time. 67 | 68 | The definition of a JobInstance has absolutely no bearing on the data 69 | that will be loaded. It is entirely up to the ItemReader implementation 70 | used to determine how data will be loaded. For example, in the EndOfDay 71 | scenario, there may be a column on the data that indicates the 72 | 'effective date' or 'schedule date' to which the data belongs. So, the 73 | January 1st run would only load data from the 1st, and the January 2nd 74 | run would only use data from the 2nd. Because this determination will 75 | likely be a business decision, it is left up to the ItemReader to 76 | decide. What using the same JobInstance will determine, however, is 77 | whether or not the 'state' from previous executions will be available to 78 | the new run. Using a new JobInstance will mean 'start from the 79 | beginning' and using an existing instance will generally mean 'start 80 | from where you left off'. 81 | 82 | ==== JobParameters 83 | Job parameters can be specified each time a job is started or restarted. 84 | Job parameters are keyword/value string pairs. The JobOperator start and 85 | restart operations support the specification of job parameters. See 86 | section xref:_joboperator_2[10.4] for further details on JobOperator. 87 | 88 | ==== JobExecution 89 | A JobExecution refers to the technical concept of a single attempt to 90 | run a Job. Each time a job is started or restarted, a new JobExecution 91 | is created, belonging to the same JobInstance. 92 | 93 | === Step 94 | A Step is a domain object that encapsulates an independent, sequential 95 | phase of a batch job. Therefore, every Job is composed entirely of one 96 | or more steps. A Step contains all of the information necessary to 97 | define and control the actual batch processing. This is a necessarily 98 | vague description because the contents of any given Step are at the 99 | discretion of the developer writing it. A Step can be as simple or 100 | complex as the developer desires. A simple Step might load data from a 101 | file into the database, requiring little or no code, depending upon the 102 | implementations used. A more complex Step may have complicated business 103 | rules that are applied as part of the processing. As with Job, a Step 104 | has an individual StepExecution that corresponds with a unique 105 | JobExecution: 106 | 107 | image::images/image007.png[http://static.springsource.org/spring-batch/trunk/reference/html-single/images/jobHeirarchyWithSteps.png] 108 | 109 | ==== StepExecution 110 | A StepExecution represents a single attempt to execute a Step. A new 111 | StepExecution will be created each time a Step is run, similar to 112 | JobExecution. However, if a step fails to execute because the step 113 | before it fails, there will be no execution persisted for it. A 114 | StepExecution will only be created when its Step is actually started. 115 | 116 | === JobOperator 117 | JobOperator provides an interface to manage all aspects of job 118 | processing, including operational commands, such as start, restart, and 119 | stop, as well as job repository related commands, such as retrieval of 120 | job and step executions. See section xref:_joboperator_2[10.4] for more details about 121 | JobOperator. 122 | 123 | === Job Repository 124 | A job repository holds information about jobs currently running and 125 | jobs that have run in the past. The JobOperator interface provides 126 | access to this repository. The repository contains job instances, job 127 | executions, and step executions. For further information on this 128 | content, see sections 10.9.8, 10.9.9, 10.9.10, respectively. 129 | 130 | Note the implementation of the job repository is outside the scope of 131 | this specification. 132 | 133 | === ItemReader 134 | 135 | ItemReader is an abstraction that represents the retrieval of input for 136 | a Step, one item at a time. An ItemReader provides an indicator when it 137 | has exhausted the items it can supply. See section 9.1.1.1 for more 138 | details about ItemReaders. 139 | 140 | === ItemWriter 141 | 142 | ItemWriter is an abstraction that represents the output of a Step, one 143 | batch or chunk of items at a time. Generally, an item writer has no 144 | knowledge of the input it will receive next, only the item that was 145 | passed in its current invocation. See section 9.1.1.3 for more details 146 | about ItemWriters. 147 | 148 | === ItemProcessor 149 | 150 | ItemProcessor is an abstraction that represents the business processing 151 | of an item. While the ItemReader reads one item, and the ItemWriter 152 | writes them, the ItemProcessor provides access to transform or apply 153 | other business processing. See section 9.1.1.2 for more details about 154 | ItemProcessors. 155 | 156 | === Chunk-oriented Processing 157 | 158 | JSR 352 specifies a 'Chunk Oriented' processing style as its primary 159 | pattern. Chunk oriented processing refers to reading the data one item 160 | at a time, and creating 'chunks' that will be written out, within a 161 | transaction boundary. One item is read in from an ItemReader, handed to 162 | an ItemProcessor, and aggregated. Once the number of items read equals 163 | the commit interval, the entire chunk is written out via the ItemWriter, 164 | and then the transaction is committed. 165 | 166 | image::images/image009.png[http://static.springsource.org/spring-batch/trunk/reference/html-single/images/chunk-oriented-processing.png] 167 | 168 | === Batch Checkpoints 169 | 170 | For data intensive batch applications - particularly those that may run 171 | for long periods of time - checkpoint/restart is a common design 172 | requirement. Checkpoints allow a step execution to periodically bookmark 173 | its current progress to enable restart from the last point of 174 | consistency, following a planned or unplanned interruption. 175 | 176 | Checkpoints work naturally with chunk-oriented processing. The end of 177 | processing for each chunk is a natural point for taking a checkpoint. 178 | 179 | JSR 352 specifies runtime support for checkpoint/restart in a generic 180 | way that can be exploited by any chunk-oriented batch step that has this 181 | requirement. 182 | 183 | Since progress during a step execution is really a function of the 184 | current position of the input/output data, natural placement of function 185 | suggests the knowledge for saving/restoring current position is a 186 | reader/writer responsibility. 187 | 188 | Since managing step execution is a runtime responsibility, the batch 189 | runtime must necessarily understand step execution lifecycle, including 190 | initial start, execution end states, and restart. 191 | 192 | Since checkpoint frequency has a direct effect on lock hold times, for 193 | lockable resources, tuning checkpoint interval size can have a direct 194 | bearing on overall system throughput. 195 | -------------------------------------------------------------------------------- /specification/src/main/asciidoc/forward.adoc: -------------------------------------------------------------------------------- 1 | == Foreword 2 | 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. 3 | -------------------------------------------------------------------------------- /specification/src/main/asciidoc/images/filelist.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /specification/src/main/asciidoc/images/header.htm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WASdev/standards.jsr352.batch-spec/8476fa71d6e4dd72e538c4e658d225bcdde93cf9/specification/src/main/asciidoc/images/header.htm -------------------------------------------------------------------------------- /specification/src/main/asciidoc/images/image001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WASdev/standards.jsr352.batch-spec/8476fa71d6e4dd72e538c4e658d225bcdde93cf9/specification/src/main/asciidoc/images/image001.png -------------------------------------------------------------------------------- /specification/src/main/asciidoc/images/image002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WASdev/standards.jsr352.batch-spec/8476fa71d6e4dd72e538c4e658d225bcdde93cf9/specification/src/main/asciidoc/images/image002.png -------------------------------------------------------------------------------- /specification/src/main/asciidoc/images/image003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WASdev/standards.jsr352.batch-spec/8476fa71d6e4dd72e538c4e658d225bcdde93cf9/specification/src/main/asciidoc/images/image003.png -------------------------------------------------------------------------------- /specification/src/main/asciidoc/images/image004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WASdev/standards.jsr352.batch-spec/8476fa71d6e4dd72e538c4e658d225bcdde93cf9/specification/src/main/asciidoc/images/image004.png -------------------------------------------------------------------------------- /specification/src/main/asciidoc/images/image005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WASdev/standards.jsr352.batch-spec/8476fa71d6e4dd72e538c4e658d225bcdde93cf9/specification/src/main/asciidoc/images/image005.png -------------------------------------------------------------------------------- /specification/src/main/asciidoc/images/image006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WASdev/standards.jsr352.batch-spec/8476fa71d6e4dd72e538c4e658d225bcdde93cf9/specification/src/main/asciidoc/images/image006.png -------------------------------------------------------------------------------- /specification/src/main/asciidoc/images/image007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WASdev/standards.jsr352.batch-spec/8476fa71d6e4dd72e538c4e658d225bcdde93cf9/specification/src/main/asciidoc/images/image007.png -------------------------------------------------------------------------------- /specification/src/main/asciidoc/images/image008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WASdev/standards.jsr352.batch-spec/8476fa71d6e4dd72e538c4e658d225bcdde93cf9/specification/src/main/asciidoc/images/image008.png -------------------------------------------------------------------------------- /specification/src/main/asciidoc/images/image009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WASdev/standards.jsr352.batch-spec/8476fa71d6e4dd72e538c4e658d225bcdde93cf9/specification/src/main/asciidoc/images/image009.png -------------------------------------------------------------------------------- /specification/src/main/asciidoc/images/image010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WASdev/standards.jsr352.batch-spec/8476fa71d6e4dd72e538c4e658d225bcdde93cf9/specification/src/main/asciidoc/images/image010.png -------------------------------------------------------------------------------- /specification/src/main/asciidoc/images/item0001.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /specification/src/main/asciidoc/images/props0002.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /specification/src/main/asciidoc/images/themedata.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/WASdev/standards.jsr352.batch-spec/8476fa71d6e4dd72e538c4e658d225bcdde93cf9/specification/src/main/asciidoc/images/themedata.xml -------------------------------------------------------------------------------- /specification/src/main/asciidoc/introduction.adoc: -------------------------------------------------------------------------------- 1 | == Introduction to JSR 352 2 | 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. 3 | 4 | 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. 5 | 6 | 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. 7 | -------------------------------------------------------------------------------- /specification/src/main/asciidoc/job_runtime_lifecycle.adoc: -------------------------------------------------------------------------------- 1 | == Job Runtime Lifecycle 2 | 3 | The following sections describe an ordered flow of artifact method 4 | invocations. Simple symbols are used to denote actions as follows: 5 | 6 | [width="100%",cols="<50%,<50%",] 7 | |====================================================================== 8 | |Symbol |Meaning 9 | | |An action performed by the batch runtime. 10 | | < - > method |Invocation of a batch artifact method by the batch runtime. 11 | |[method] |Optional method. 12 | |// comment |Comment to clarify behavior. 13 | |LABEL: |Label used for flow control comments. 14 | |====================================================================== 15 | 16 | === Batch Artifact Lifecycle 17 | 18 | All batch artifacts are instantiated prior to their use in the scope in 19 | which they are declared in the Job XML and are valid for the life of 20 | their containing scope. There are three scopes that pertain to artifact 21 | lifecycle: job, step, and step-partition. 22 | 23 | One artifact per Job XML reference is instantiated. In the case of a 24 | partitioned step, one artifact per Job XML reference per partition is 25 | instantiated. This means job level artifacts are valid for the life of 26 | the job. Step level artifacts are valid for the life of the step. Step 27 | level artifacts in a partition are valid for the life of the partition. 28 | 29 | No artifact instance may be shared across concurrent scopes. The same 30 | instance must be used in the applicable scope for a specific Job XML 31 | reference. 32 | 33 | === Job Repository Artifact Lifecycle 34 | 35 | All job repository artifacts are created by the batch runtime during job 36 | processing and exist until deleted by an implementation provided means. 37 | 38 | === Job Processsing 39 | 40 | [arabic] 41 | . 42 | . 43 | . < - >[JobListener.beforeJob...] // thread A 44 | . 45 | . < - >[JobListener.afterJob...] // thread A 46 | . 47 | 48 | === Regular Batchlet Processsing 49 | 50 | [arabic] 51 | . 52 | . 53 | . < - > [StepListener.beforeStep...] // thread A 54 | . < - > Batchlet.process // thread A 55 | . // if stop issued: 56 | . < - >[Batchlet.stop] // thread B, StepContext is available 57 | . < - >[StepListener.afterStep...] // thread A 58 | . 59 | . 60 | 61 | === Partitioned Batchlet Processsing 62 | 63 | [arabic] 64 | . 65 | . 66 | . < - >[StepListener.beforeStep...] // thread A 67 | . < - >[PartitionReducer.beginPartitionedStep] // thread A 68 | . < - >[PartitionMapper.mapPartitions] // thread A 69 | . // per partition: 70 | .. < - >Batchlet.process // thread Px 71 | .. // if stop issued: 72 | .. < - >[Batchlet.stop] // thread Py, StepContext is available 73 | .. < - >[PartitionCollector.collectPartitionData] // thread Px 74 | . // when collector payload arrives: 75 | .. < - >[PartitionAnalyzer.analyzeCollectorData] // thread A 76 | . // when partition ends: 77 | .. < - >[PartitionAnalyzer.analyzeStatus] // thread A 78 | . // if rollback condition occurs: 79 | . < - >[PartitionReducer.rollbackPartitionedStep] // thread A 80 | . < - >[PartitionReducer.beforePartitionedStepCompletion] // thread A 81 | . < - >[PartitionReducer.afterPartitionedStepCompletion] // thread A 82 | . < - >[StepListener.afterStep...] // thread A 83 | . 84 | . 85 | 86 | === Regular Chunk Processing 87 | 88 | [arabic] 89 | . 90 | . 91 | . < - >[StepListener.beforeStep...] // thread A 92 | . [ ] 93 | . < - >ItemReader.open // thread A 94 | . < - >ItemWriter.open // thread A 95 | . [ ] 96 | . // chunk processing: 97 | . \{ 98 | .. ]> 99 | .. \{ 100 | ...< - >ItemReader.readItem // thread A 101 | ... // if readItem returns non-null 102 | .... < - >ItemProcessor.processItem // thread A 103 | .... // if processItem returns non-null, 105 | .. } 106 | .. // if at least one non-null value has been successfully read inthe present chunk 107 | ... < - >ItemWriter.writeItems // thread A 108 | .. < - >[ItemReader.checkpointInfo] // thread A 109 | .. < - >[ItemWriter.checkpointInfo] // thread A 110 | .. 111 | .. [] 112 | . } 113 | . [ ] 114 | . < - >ItemWriter.close // thread A 115 | . < - >ItemReader.close // thread A 116 | . [ ] 117 | . < - >[StepListener.afterStep...] // thread A 118 | . 119 | . 120 | 121 | === Partitioned Chunk Processing 122 | 123 | [arabic] 124 | . 125 | . 126 | . < - >[StepListener.beforeStep...] // thread A 127 | . < - >[PartitionReducer.beginPartitionedStep] // thread A 128 | . < - >[PartitionMapper.mapPartitions] // thread A+ 129 | // per partition - on thread Px: 130 | .. [ ] 131 | .. < - >ItemReader.open // thread Px 132 | .. < - >ItemWriter.open // thread Px 133 | .. [ ] 134 | .. \{ 136 | ... ]> 137 | ... \{ 138 | .... < - >ItemReader.readItem // thread Px 139 | .... // if readItem returns non-null 140 | ..... < - >ItemProcessor.processItem // thread Px 141 | ..... //if processItem returns non-null, 142 | ... } 143 | ... //if at least one non-null value has been successfully read in this partition of the present chunk 144 | .... < - >ItemWriter.writeItems // thread Px 145 | ...< - >[ItemReader.checkpointInfo] // thread Px 146 | ...< - >[ItemWriter.checkpointInfo] // thread Px 147 | ... 148 | ... [] 149 | ... < - >[PartitionCollector.collectPartitionData] // thread Px 150 | .. } 151 | .. [ ] 152 | .. < - >ItemWriter.close // thread Px 153 | .. < - >ItemReader.close // thread Px 154 | .. [ ] 155 | . [ ] // thread A 156 | . // Actions 9-12 run continuously until all partitions end. 157 | . // when collector payload arrives: 158 | .. < - >[PartitionAnalyzer.analyzeCollectorData] // thread A 159 | . // when partition ends: 160 | .. < - >[PartitionAnalyzer.analyzeStatus] // thread A 161 | . // Remaining actions run after all partitions end: 162 | . // if rollback condition occurs: 163 | .. < - >[PartitionReducer.rollbackPartitionedStep] // thread A 164 | .. [] 165 | . // else not rollback 166 | . < - >[PartitionReducer.beforePartitionedStepCompletion] // thread A 167 | . [ ] // thread A 168 | . < - >[PartitionReducer.afterPartitionedStepCompletion] // thread A 169 | . < - >[StepListener.afterStep...] // thread A 170 | . 171 | . 172 | 173 | === Chunk with Listeners (except RetryListener) 174 | 175 | [arabic] 176 | . 177 | . 178 | . < - >[StepListener.beforeStep...] // thread A 179 | . [ ] 180 | . < - >ItemReader.open // thread A 181 | . < - >ItemWriter.open // thread A 182 | . [ ] 183 | . // chunk processing: 184 | . \{ 186 | .. ]> 187 | .. < - >[ChunkListener.beforeChunk] // thread A 188 | .. { 189 | ... < - >[ItemReadListener.beforeRead] // thread A 190 | ... < - >ItemReader.readItem // thread A 191 | ... < - >[ItemReadListener.afterRead] // thread A 192 | ... // or: 193 | ... \{ 194 | ... < - >[ItemReadListener.onReadError] // thread A 195 | ... < - >[SkipListener.onSkipReadItem] // thread A 196 | ... } 197 | ... // if readItem returns non-null 198 | .... < - >[ItemProcessListener.beforeProcess] // thread A 199 | .... < - >ItemProcessor.processItem // thread A 200 | .... < - >[ItemProcessListener.afterProcess] // thread A 201 | .... //if processItem returns non-null,< add item to writeItems buffer> 202 | .... // or: 203 | .... \{ 204 | .... < - >[ItemProcessListener.onProcessError] // thread A 205 | .... < - >[SkipListener.onSkipProcessItem] // thread A 206 | .... } 207 | ... } 208 | ... //if at least one non-null value has been successfully read in 209 | the present chunk 210 | .... < - >[ItemWriteListener.beforeWrite] // thread A 211 | .... < - >ItemWriter.writeItems // thread A 212 | .... < - >[ItemWriteListener.afterWrite] // thread A 213 | .... // or: 214 | .... { 215 | .... < - >[ItemWriteListener.onWriteError] // thread A 216 | .... < - >[SkipListener.onSkipWriteItems] // thread A 217 | ... } 218 | .. < - >[ChunkListener.afterChunk] // thread A 219 | .. < - >[ItemReader.checkpointInfo] // thread A 220 | .. < - >[ItemWriter.checkpointInfo] // thread A 221 | .. 222 | .. [] 223 | . } 224 | . [ ] 225 | . < - >ItemWriter.close // thread A 226 | . < - >ItemReader.close // thread A 227 | . [ ] 228 | . < - >[StepListener.afterStep...] // thread A 229 | . 230 | . 231 | 232 | === Chunk with RetryListener 233 | 234 | Note rollback processing is also depicted in this section. 235 | 236 | [arabic] 237 | . 238 | . 239 | . < - >[StepListener.beforeStep...] // thread A 240 | . [ ] 241 | . < - >ItemReader.open // thread A 242 | . < - >ItemWriter.open // thread A 243 | . [ ] 244 | . // chunk processing: 245 | . \{ 247 | .. S1: 248 | .. ]> 249 | .. \{ 251 | ... S2: 252 | ... < - >ItemReader.readItem // thread A 253 | ... // if exception 254 | ... < - >[ItemReadListener.onReadErrror] // thread A 255 | ... < - >[RetryReadListener.onRetryReadException] // thread A 256 | ... // if retryable exception 257 | ... // if no-rollback exception 258 | ... resume S2: 259 | ... // else 260 | ... 261 | ... // else 262 | ... 263 | ... S3: 264 | ... // if readItem 265 | ... returns non-null 266 | ... < - >ItemProcessor.processItem // thread A 267 | ... // if exception 268 | ... < - >[ItemProcessListener.onProcessErrror] // thread A 269 | ... < - >[RetryProcessListener.onRetryProcessException] // thread A 270 | ... // if retryable exception 271 | ... // if no-rollback exception 272 | ... resume S3: 273 | ... // else 274 | ... 275 | ... // else 276 | ... 277 | ... // if processItem returns non-null, 278 | .. } 279 | .. // if rollback exception, execute rollback procedure (below) and 280 | resume at S1 with item-count=1 281 | .. S4: 282 | .. // if at least one non-null value has been successfully read in 283 | the present chunk 284 | .. < - >ItemWriter.writeItems (buffer) // 285 | thread A 286 | .. // if exception 287 | .. < - >[ItemWriteListener.onWriteErrror] // thread A 288 | .. < - >[RetryWriteListener.onRetryWriteException] // thread A 289 | .. // if retryable exception 290 | .. // if no-rollback exception 291 | .. resume S4: 292 | .. // else 293 | .. execute rollback procedure (below) and resume S1: 294 | .. // else execute rollback procedure (below) and resume S1: 295 | .. < - >[ItemReader.checkpointInfo] // thread A 296 | .. < - >[ItemWriter.checkpointInfo] // thread A 297 | .. // thread A 298 | .. S5: 299 | .. [] // thread A 300 | .. // if exception 301 | .. // if retryable exception 302 | .. // if no-rollback exception: 303 | .. resume S5: 304 | .. // else 305 | .. execute rollback procedure (below) and resume S1: 306 | .. // else execute rollback procedure (below) and resume S1: 307 | . } 308 | . [ ] 309 | . < - >ItemWriter.close // thread A 310 | . < - >ItemReader.close // thread A 311 | . [ ] 312 | . < - >[StepListener.afterStep...] // thread A 313 | . 314 | . 315 | 316 | 317 | *Rollback Procedure* 318 | 319 | [arabic] 320 | . < - >ItemWriter.close // thread A 321 | . < - >ItemReader.close // thread A 322 | . [ChunkListener.onError] // thread A 323 | . [rollback transaction] 324 | . [ ] 325 | . < - >ItemWriter.open // thread A, pass last committed checkpoint 326 | info 327 | . < - >ItemReader.open // thread A, pass last committed checkpoint 328 | info 329 | . [ ] 330 | 331 | === Chunk with Custom Checkpoint Processing 332 | 333 | [arabic] 334 | . 335 | . 336 | . < - >[StepListener.beforeStep...] // thread A 337 | . [ ] 338 | . < - >ItemReader.open // thread A 339 | . < - >ItemWriter.open // thread A 340 | . [ ] 341 | . // chunk processing: 342 | . \{ 344 | .. [ 345 | .. < - >[CheckpointAlgorithm.checkpointTimeout]] // thread A 346 | .. < - >[CheckpointAlgorithm.beginCheckpoint] // thread A 347 | .. ]> 348 | .. ] 349 | .. \{ 351 | .. < - >ItemReader.readItem // thread A 352 | .. // if readItem returns non-null 353 | . < - >ItemProcessor.processItem // thread A 354 | . //if processItem returns non-null, 356 | .. < - >CheckpointAlgorithm.isReadyToCheckpoint // thread A 357 | .. } 358 | .. //if at least one non-null value has been successfully read in 359 | the present chunk 360 | .. < - >ItemWriter.writeItems // thread A 361 | .. < - >[ItemReader.checkpointInfo] // thread A 362 | .. < - >[ItemWriter.checkpointInfo] // thread A 363 | .. 364 | .. [] 365 | .. < - >[CheckpointAlgorithm.endCheckpoint] // thread A 366 | . } 367 | . [ ] 368 | . < - >ItemWriter.close // thread A 369 | . < - >ItemReader.close // thread A 370 | . [ ] 371 | . < - >[StepListener.afterStep...] // thread A 372 | . 373 | . 374 | 375 | === Split Processing 376 | 377 | [arabic] 378 | . // For each flow: 379 | . // thread Fx 380 | 381 | === Flow Processing 382 | 383 | [arabic] 384 | . // For each split or step: 385 | . // thread Xy 386 | 387 | === Stop Processing 388 | 389 | The JobOperator.stop operation stops a running job execution. If a step 390 | is running at the time the stop is invoked, the batch runtime takes the 391 | following actions: 392 | 393 | Chunk Step 394 | 395 | The job and step batch status is marked STOPPING. Note the batch runtime 396 | cannot guarantee the step actually exits. The batch runtime attempts to 397 | interrupt the read/process/write chunk processing loop. The batch 398 | runtime allows the step to finish processing the current item. This 399 | means the current item is read, processed if a processor is configured, 400 | and all currently buffered items, if any, including the current item, 401 | are written. If the batch artifacts configured on the chunk type step 402 | return to the batch runtime, as expected, the job and step batch status 403 | is marked STOPPED. 404 | 405 | Batchlet Step 406 | 407 | The job and step batch status is marked STOPPING. The batch runtime 408 | invokes the batchlet's stop method. Note the batch runtime cannot 409 | guarantee the batchlet actually exits. But a well behaved batchlet will. 410 | If the batchlet returns to the batch runtime, the job and step batch 411 | status is marked STOPPED. 412 | 413 | Note for partitioned batchlet steps the Batchlet stop method is invoked 414 | on each thread actively processing a partition. 415 | -------------------------------------------------------------------------------- /specification/src/main/asciidoc/job_specification_language_xml.adoc: -------------------------------------------------------------------------------- 1 | == Job Specification Language 2 | 3 | Jobs are described by a declarative Job Specification Language (JSL) 4 | defined by an XML schema, also known informally as Job XML. 5 | 6 | === Validation Rules 7 | 8 | The batch runtime must perform schema validation during JobOperator 9 | start processing before the start method returns to the caller. A schema 10 | validation error results in JobStartException. The implementation has 11 | two choices for handling semantic errors in the JSL: 12 | 13 | 1. Do semantic validation during JobOperator start processing before 14 | returning to the caller. If there is a semantic validation error, the 15 | implementation must throw JobStartException. 16 | 2. Do semantic validation after job execution begins. If a semantic 17 | validation error occurs, the implementation must end the job in the 18 | FAILED state. The implementation is advised to log sufficient error 19 | information to enable problem resolution. 20 | 21 | Typical semantic validation the batch runtime should detect and handle 22 | include, but is not limited to: 23 | 24 | 1. no executable elements 25 | 2. non-existent transitions (e.g. next="value" where "value" does not 26 | exist) 27 | 3. cycles among next values (e.g. step1:next=step2; step2:next=step1) 28 | 29 | === JSL XSD 30 | [[app-listing]] 31 | [source,xml] 32 | ---- 33 | 34 | 38 | 39 | 40 | Job Specification Language (JSL) specifies a job, 41 | its steps, and directs their execution. 42 | JSL also can be referred to as "Job XML". 43 | 44 | 45 | 46 | 47 | 48 | This is a helper type. Though it is not otherwise 49 | called out by this name 50 | in the specification, it captures the fact 51 | that the xs:string value refers 52 | to a batch artifact, across numerous 53 | other JSL type definitions. 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | The type of a job definition, whether concrete or 62 | Abstract. This is the type of the root element of any JSL document. 63 | 64 | 65 | 66 | 68 | 69 | 70 | The job-level properties, which are accessible 71 | via the JobContext.getProperties() API in a batch 72 | Artifact. 73 | 74 | 75 | 76 | 78 | 79 | 80 | Note that "listeners" sequence order in XML does 81 | not imply order of execution by 82 | The batch runtime, per the 83 | specification. 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | The definition of an job, whether concrete or 103 | Abstract. This is the 104 | type of the root element of any JSL document. 105 | 106 | 107 | 108 | 109 | 110 | 112 | 113 | 114 | 115 | 116 | 117 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | This grouping provides allows for the reuse of the 141 | 'end', 'fail', 'next', 'stop' element sequences which 142 | may appear at the end of a 'step', 'flow', 'split' or 'decision'. 143 | The term 'TransitionElements' does not formally appear in the spec, it 144 | is 145 | A schema convenience. 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 159 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 211 | 213 | 214 | 215 | Note that "listeners" sequence order in XML does 216 | not imply order of execution by 217 | The batch runtime, per the 218 | specification. 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 228 | 231 | 232 | 233 | 234 | 236 | 237 | 238 | 239 | 240 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 250 | 251 | 253 | 255 | 258 | 261 | 262 | 264 | 265 | 266 | Specifies the checkpoint policy that governs 267 | commit behavior for this chunk. 268 | Valid values are: "item" or 269 | "custom". The "item" policy means the 270 | chunk is checkpointed after a 271 | specified number of items are 272 | processed. The "custom" policy means 273 | The chunk is checkpointed 274 | According to a checkpoint algorithm 275 | implementation. Specifying 276 | "custom" requires that the 277 | checkpoint-algorithm element is also 278 | specified. It is an optional 279 | Attribute. The default policy is 280 | "item". However, we chose not to define 281 | A schema-specified default for this attribute. 282 | 283 | 284 | 285 | 286 | 287 | 288 | Specifies the number of items to process per chunk 289 | when using the item 290 | checkpoint policy. It must be valid XML integer. 291 | It is an optional 292 | Attribute. The default is 10. The item-count 293 | Attribute is ignored 294 | for "custom" checkpoint policy. However, to 295 | make it easier for implementations to support JSL inheritance 296 | we abstain from defining a schema-specified default for this 297 | Attribute. 298 | 299 | 300 | 301 | 302 | 303 | 304 | Specifies the amount of time in seconds before 305 | taking a checkpoint for the 306 | item checkpoint policy. It must be valid 307 | XML integer. It is an 308 | optional attribute. The default is 0, which 309 | means no limit. However, to 310 | make it easier for implementations to 311 | support JSL inheritance 312 | we abstain from defining a schema-specified 313 | default for this attribute. 314 | When a value greater than zero is 315 | specified, a checkpoint is taken when 316 | time-limit is reached or 317 | item-count items have been processed, 318 | whichever comes first. The 319 | time-limit attribute is ignored for 320 | "custom" checkpoint policy. 321 | 322 | 323 | 324 | 325 | 326 | 327 | Specifies the number of exceptions a step will 328 | skip if any configured 329 | skippable exceptions are thrown by chunk 330 | processing. It must be a 331 | valid XML integer value. It is an optional 332 | Attribute. The default 333 | is no limit. 334 | 335 | 336 | 337 | 338 | 339 | 340 | Specifies the number of times a step will retry if 341 | Any configured retryable 342 | exceptions are thrown by chunk processing. 343 | It must be a valid XML 344 | integer value. It is an optional attribute. 345 | The default is no 346 | limit. 347 | 348 | 349 | 350 | 351 | 352 | 353 | 355 | 356 | 357 | 358 | 359 | 360 | 362 | 363 | 364 | 365 | 366 | 367 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 380 | 381 | 382 | 383 | 384 | 385 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 397 | 399 | 401 | 402 | 403 | 404 | 405 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 415 | 416 | 417 | 418 | 419 | 420 | 422 | 423 | 424 | 425 | 426 | 427 | 429 | 430 | 431 | 432 | 433 | 434 | 436 | 437 | 438 | 439 | 440 | ---- 441 | -------------------------------------------------------------------------------- /specification/src/main/asciidoc/jsr352_1_0_a.adoc: -------------------------------------------------------------------------------- 1 | = Batch Applications for the Java Platform 2 | :sectnums: 3 | :toclevels: 9 4 | :toc: macro 5 | :tocplacement: manual 6 | 7 | Version 1.0, Revision A 8 | 9 | Maintenance Release 10 | 11 | *Scott Kurz* 12 | 13 | Final Release: *Chris Vignola*, *18 April 2013* 14 | 15 | include::license.adoc[] 16 | 17 | include::acknowledgements.adoc[] 18 | 19 | include::forward.adoc[] 20 | 21 | == Table of Contents 22 | 23 | toc::[] 24 | 25 | include::introduction.adoc[] 26 | 27 | include::applicability.adoc[] 28 | 29 | include::domain_language.adoc[] 30 | 31 | include::job_specification_language.adoc[] 32 | 33 | include::batch_programming_model.adoc[] 34 | 35 | include::batch_runtime_spec.adoc[] 36 | 37 | include::job_runtime_lifecycle.adoc[] 38 | 39 | include::batch_xml_xsd.adoc[] 40 | 41 | include::job_specification_language_xml.adoc[] 42 | 43 | == Credits 44 | 45 | Section 7 Domain Language of Batch, was adapted from Spring Batch 46 | Reference Documentation: 47 | 48 | http://static.springsource.org/spring-batch/trunk/reference/html-single/index.html[http://static.springsource.org/spring-batch/trunk/reference/html-single/index.html] 49 | 50 | == Change Log 51 | 52 | === Version 1.0 Revision A - Maintenance Release 53 | 54 | ==== Issues List 55 | 56 | Following these links will show each original issue on our official spec 57 | issues tracking list. In most cases the bug report contains the complete 58 | text of the spec delta or addition, but not in every single case. 59 | 60 | [width="100%",cols="<50%,<50%",] 61 | |======================================================================= 62 | |https://java.net/bugzilla/show_bug.cgiid=5389[5389] |In Sec. xref:_job_parameters_on_restart[10.7.1], 63 | should we have said we require a "no-arg" explicit or implicit 64 | constructor rather than a "default constructor" 65 | 66 | |https://java.net/bugzilla/show_bug.cgiid=4827[4827] |SPEC: Misspoke on 67 | collector role on exit status 68 | 69 | |https://java.net/bugzilla/show_bug.cgiid=5490[5490] |Clarify 70 | JobContext/StepContext properties; fix TCK to not depend on writable 71 | Properties 72 | 73 | |https://java.net/bugzilla/show_bug.cgiid=5431[5431] 74 | |ItemProcessListener#onProcessError has javadoc from 75 | ItemProcessListener#afterProcess 76 | 77 | |https://java.net/bugzilla/show_bug.cgiid=5498[5498] |Add "mark FAILED" 78 | to BatchStatus state transitions 79 | 80 | |https://java.net/bugzilla/show_bug.cgiid=5370[5370] |Spec is unclear 81 | whether JobOperator methods may/must execute synchronously or not (with 82 | TCK implications) 83 | 84 | |https://java.net/bugzilla/show_bug.cgiid=5583[5583] 85 | |CheckpointAlgorithm needs to specify timeunit (seconds) and other 86 | javadoc fixes 87 | 88 | |https://java.net/bugzilla/show_bug.cgiid=5372[5372] |Evaluation order 89 | of multiple transition elements 90 | 91 | |https://java.net/bugzilla/show_bug.cgiid=5691[5691] |"Looping" should 92 | be clarified 93 | 94 | |https://java.net/bugzilla/show_bug.cgiid=5690[5690] |Flow/Split 95 | transitioning & termination not fully defined 96 | 97 | |https://java.net/bugzilla/show_bug.cgiid=5374[5374] |Details of 98 | exception handling (by container) 99 | 100 | |https://java.net/bugzilla/show_bug.cgiid=4830[4830] |xref:_next_element[8.6.1] Transition 101 | Next Element 102 | 103 | |https://java.net/bugzilla/show_bug.cgiid=4865[4865] |SPEC Partition 104 | Plan example confusing 105 | 106 | |https://java.net/bugzilla/show_bug.cgiid=5533[5533] |stop/end/fail 107 | exit-status should affect job exit status, not step (as claimed in 108 | spec). 109 | 110 | |https://java.net/bugzilla/show_bug.cgiid=5780[5780] |Spec should 111 | clarify StepExecution values passed to Decider on a restart 112 | 113 | |https://java.net/bugzilla/show_bug.cgiid=5373[5373] |Co-existence of 114 | transition elements with @next attribute PLUS behavior if no transition 115 | element @on is matched 116 | 117 | |https://java.net/bugzilla/show_bug.cgiid=5375[5375] |Spec contradicts 118 | itself when talking about uninitialized exit status (TCK assumes 'null') 119 | 120 | |https://java.net/bugzilla/show_bug.cgiid=4866[4866] |SPEC Partition 121 | Properties example has a invalid tag 122 | 123 | |https://java.net/bugzilla/show_bug.cgiid=5746[5746] |@Inject 124 | @BatchProperty should work for job level properties 125 | 126 | |https://java.net/bugzilla/show_bug.cgiid=5911[5911] |Clarify partition 127 | restart processing, PartitionPlan properties, and persistent user data 128 | for partitioned steps. 129 | 130 | |https://java.net/bugzilla/show_bug.cgiid=5873[5873] |Clarify when 131 | CheckpointAlgorithm#beginCheckpoint is invoked 132 | 133 | |https://java.net/bugzilla/show_bug.cgiid=5919[5919] |Spec doesn't fully 134 | describe PartitionPlan override and the use of PartitionMapper 135 | 136 | |https://java.net/bugzilla/show_bug.cgiid=5875[5875] |When the first 137 | readItem() in a chunk return 'null', is this a zero-item chunk or is 138 | this not a new chunk after all 139 | 140 | |https://java.net/bugzilla/show_bug.cgiid=5403[5403] |Spec unclear on 141 | skipping part of an Exception hierarchy 142 | |======================================================================= 143 | -------------------------------------------------------------------------------- /specification/src/main/asciidoc/license.adoc: -------------------------------------------------------------------------------- 1 | == License 2 | IBM Corporation (the "Spec Lead") for the Java Batch specification (the "Specification") hereby grants permission to copy and display the Specification, in any medium without fee or royalty, provided that you include the following on ALL copies, or portions thereof, that you make: 3 | 4 | 1. A link or URL to the Specification at this location: http://jcp.org/aboutJava/communityprocess/final/jsr352/index.html[http://jcp.org/aboutJava/communityprocess/final/jsr352/index.html] 5 | 6 | 2. The copyright notice as shown herein. 7 | 8 | ---- 9 | The Spec Lead offers to grant a perpetual, non-exclusive, worldwide, fully paid-up, royalty free, irrevocable license under its licensable copyrights and patent claims for which there is no technically feasible way of avoiding infringement in the course of implementing the Specification, provided that you: 10 | 11 | a. fully implement the Specification including all its required interfaces and functionality. 12 | a. do not modify, subset, superset or otherwise extend the Specification's name space; 13 | a. pass the TCK for this Specification; and 14 | a. grant a reciprocal license to any of your patents necessary to implement required portions of the Specification on terms consistent with the provisions of Section 6.A of the Java Specification Participation Agreement. 15 | 16 | THE SPECIFICATION IS PROVIDED "AS IS," AND THE SPEC LEAD AND ANY OTHER AUTHORS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR TITLE; THAT THE CONTENTS OF THE SPECIFICATION ARE SUITABLE FOR ANY PURPOSE; NOR THAT THE IMPLEMENTATION OF SUCH CONTENTS WILL NOT INFRINGE 17 | ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. THE SPEC LEAD AND ANY OTHER AUTHORS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SPECIFICATION OR THE PERFORMANCE OR IMPLEMENTATION OF THE CONTENTS THEREOF. 18 | 19 | The name and trademarks of the Spec Lead or any other Authors may NOT be used in any manner, including advertising or publicity pertaining to the Specification or its contents without specific, written prior permission. Title to copyright in the Specification will at all times remain with the Authors. No other rights are granted by implication, estoppel or otherwise. 20 | ---- 21 | --------------------------------------------------------------------------------