Creating Batch Artifacts (original) (raw)

After you define a job in terms of its batch artifacts using the Job Specification Language (JSL), you create these artifacts as Java classes that implement the interfaces in the javax.batch.api package and its subpackages.

This section lists the main batch artifact interfaces, demonstrates how to access context objects from the batch runtime, and provides some examples.

The following topics are addressed here:

Batch Artifact Interfaces

The following tables list the interfaces that you implement to create batch artifacts. The interface implementations are referenced from the elements described in Using the Job Specification Language.

Table 58-3 lists the interfaces to implement batch artifacts for chunk steps, task steps, and decision elements.

Table 58-4 lists the interfaces to implement batch artifacts for partitioned steps.

Table 58-5 lists the interfaces to implement batch artifacts for job and step listeners.

Table 58-3 Main Batch Artifact Interfaces

Package Interface Description
javax.batch.api Batchlet Implements the business logic of a task-oriented step. It is referenced from the batchlet element.
javax.batch.api Decider Decides the next step, flow, or split to execute based on information from the execution of the previous step, flow, or split. It is referenced from the decision element.
javax.batch.api.chunk CheckPointAlgorithm Implements a custom checkpoint policy for chunk steps. It is referenced from thecheckpoint-algorithm element inside the chunk element.
javax.batch.api.chunk ItemReader Reads items from an input source in a chunk step. It is referenced from the reader element inside thechunk element.
javax.batch.api.chunk ItemProcessor Processes input items to obtain output items in chunk steps. It is referenced from theprocessor element inside the chunk element.
javax.batch.api.chunk ItemWriter Writes output items in chunk steps. It is referenced from the writer element inside the chunkelement.

Table 58-4 Partition Batch Artifact Interfaces

Package Interface Description
javax.batch.api.partition PartitionPlan Provides details on how to execute a partitioned step, such as the number of partitions, the number of threads, and the parameters for each partition. This artifact is not referenced directly from the job definition file.
javax.batch.api.partition PartitionMapper Provides aPartitionPlan object. It is referenced from the mapper element inside the partition element.
javax.batch.api.partition PartitionReducer Receives control when a partitioned step begins, ends, or rolls back. It is referenced from the reducer element inside the partition element.
javax.batch.api.partition PartitionCollector Sends intermediary results from each partition to a partition analyzer. It is referenced from the collector element inside the partition element.
javax.batch.api.partition PartitionAnalyzer Processes data and final results from each partition. It is referenced from the analyzerelement inside the partition element.

Table 58-5 Listener Batch Artifact Interfaces

Package Interface Description
javax.batch.api.listener JobListener Intercepts job execution before and after running a job. It is referenced from the listenerelement inside the job element.
javax.batch.api.listener StepListener Intercepts step execution before and after running a step. It is referenced from the listenerelement inside the step element
javax.batch.api.chunk.listener ChunkListener Intercepts chunk processing in chunk steps before and after processing each chunk, and on errors. It is referenced from the listener element inside the stepelement.
javax.batch.api.chunk.listener ItemReadListener Intercepts item reading in chunk steps before and after reading each item, and on errors. It is referenced from the listener element inside the stepelement.
javax.batch.api.chunk.listener ItemProcessListener Intercepts item processing in chunk steps before and after processing each item, and on errors. It is referenced from the listener element inside thestep element.
javax.batch.api.chunk.listener ItemWriteListener Intercepts item writing in chunk steps before and after writing each item, and on errors. It is referenced from the listener element inside the stepelement.
javax.batch.api.chunk.listener RetryReadListener Intercepts retry item reading in chunk steps when an exception occurs. It is referenced from the listener element inside the step element.
javax.batch.api.chunk.listener RetryProcessListener Intercepts retry item processing in chunk steps when an exception occurs. It is referenced from the listener element inside the step element.
javax.batch.api.chunk.listener RetryWriteListener Intercepts retry item writing in chunk steps when an exception occurs. It is referenced from the listener element inside the step element.
javax.batch.api.chunk.listener SkipReadListener Intercepts skippable exception handling for item readers in chunk steps. It is referenced from the listener element inside the step element.
javax.batch.api.chunk.listener SkipProcessListener Intercepts skippable exception handling for item processors in chunk steps. It is referenced from the listener element inside the step element.
javax.batch.api.chunk.listener SkipWriteListener Intercepts skippable exception handling for item writers in chunk steps. It is referenced from the listener element inside the step element.

Dependency Injection in Batch Artifacts

To ensure that Contexts and Dependency Injection (CDI) works in your batch artifacts, follow these steps.

  1. Define your batch artifact implementations as CDI named beans using the Named annotation.
    For example, define an item reader implementation in a chunk step as follows:
@Named("MyItemReaderImpl")  
public class MyItemReaderImpl implements ItemReader {  
    /* ... Override the ItemReader interface methods ... */  
}  
  1. Provide a public, empty, no-argument constructor for your batch artifacts.
    For example, provide the following constructor for the artifact above:
public MyItemReaderImpl() {}  
  1. Specify the CDI name for the batch artifacts in the job definition file, instead of using the fully qualified name of the class.
    For example, define the step for the artifact above as follows:
<step id="stepA" next="stepB">  
  <chunk>  
    <reader ref="MyItemReaderImpl"></reader>  
    ...  
  </chunk>  
</step>  

This example uses the CDI name (MyItemReaderImpl) instead of the fully qualified name of the class (com.example.pkg.MyItemReaderImpl) to specify a batch artifact. 4. Ensure that your module is a CDI bean archive by annotating your batch artifacts with the javax.enterprise.context.Dependent annotation or by including an empty beans.xml deployment description with your application. For example, the following batch artifact is annotated with@Dependent:

@Dependent  
@Named("MyItemReaderImpl")  
public class MyItemReaderImpl implements ItemReader { ... }  
Note: Contexts and Dependency Injection (CDI) is required in order to access context objects from the batch runtime in batch artifacts.

You may encounter the following errors if you do not follow this procedure.

Using the Context Objects from the Batch Runtime

The batch runtime provides context objects that implement theJobContext and StepContext interfaces in thejavax.batch.runtime.context package. These objects are associated with the current job and step, respectively, and enable you to do the following:

You can inject context objects from the batch runtime inside batch artifact implementations like item readers, item processors, item writers, batchlets, listeners, and so on. The following example demonstrates how to access property values from the job definition file in an item reader implementation:

@Dependent
@Named("MyItemReaderImpl")
public class MyItemReaderImpl implements ItemReader {
    @Inject
    JobContext jobCtx;

    public MyItemReaderImpl() {}

    @Override
    public void open(Serializable checkpoint) throws Exception {
        String fileName = jobCtx.getProperties()
                                .getProperty("log_file_name");
        ...
    }
    ...
}

See Dependency Injection in Batch Artifacts for instructions on how to define your batch artifacts to use dependency injection.

Note: Do not access batch context objects inside artifact constructors. Because the job does not run until you submit it to the batch runtime, the batch context objects are not available when CDI instantiates your artifacts upon loading your application. The instantiation of these beans fails and the batch runtime cannot find your batch artifacts when your application submits the job.