Create a simple web application with following artifacts:
— batchtest.xml:
<?xml version="1.0" encoding="UTF-8"?>
<job id="batchtest" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0">
<step id="teststep">
<chunk checkpoint-policy="item" item-count="10">
<reader ref="TestReader"></reader>
<processor ref="TestProcessor"></processor>
<writer ref="TestWriter"></writer>
</chunk>
<partition>
<mapper ref="TestPartitionMapper"/>
</partition>
<end on="COMPLETED"/>
</step>
</job>
— TestPartitionMapper.java:
package batchtest;
import java.util.Properties;
import javax.batch.api.partition.PartitionMapper;
import javax.batch.api.partition.PartitionPlan;
import javax.batch.api.partition.PartitionPlanImpl;
import javax.enterprise.context.Dependent;
import javax.inject.Named;
@Dependent
@Named("TestPartitionMapper")
public class TestPartitionMapper implements PartitionMapper {
@Override
public PartitionPlan mapPartitions() throws Exception {
return new PartitionPlanImpl() {
@Override
public int getPartitions()
{
return 2;
}
@Override
public int getThreads() { return 2; }
@Override
public Properties[] getPartitionProperties() {
System.out.println("getPartitionProperties");
Properties[] props = new Properties[getPartitions()];
for (int i=0; i<getPartitions(); i++)
{
props[i] = new Properties();
props[i].put("testparameter", i);
}
return props;
}
};
}
}
— TestReader.java:
package batchtest;
import java.io.Serializable;
import java.util.Properties;
import javax.batch.api.chunk.ItemReader;
import javax.batch.operations.JobOperator;
import javax.batch.runtime.BatchRuntime;
import javax.batch.runtime.context.JobContext;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import javax.inject.Named;
@Dependent
@Named("TestReader")
public class TestReader implements ItemReader {
@Inject
JobContext jobCtx;
public TestReader() { }
@Override
public void open(Serializable ckpt) throws Exception {
System.out.println("open()");
/* Get the parameters for this partition */
JobOperator jobOperator = BatchRuntime.getJobOperator();
long execID = jobCtx.getExecutionId();
Properties partitionParams = jobOperator.getParameters(execID);
if (partitionParams == null)
{
System.out.println("Partition params is null, should not be.");
}
else
{
System.out.println("Partition params is not null.");
}
System.out.println("here1");
int testparameter = ((Integer)partitionParams.get("testparameter")).intValue();
System.out.println("here2" + testparameter);
}
@Override
public void close() throws Exception {
}
@Override
public Object readItem() throws Exception
{
return null;
}
@Override
public Serializable checkpointInfo() throws Exception {
return null;
}
}
— TestProcessor.java:
package batchtest;
import javax.batch.api.chunk.ItemProcessor;
import javax.batch.runtime.context.JobContext;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import javax.inject.Named;
@Dependent
@Named("TestProcessor")
public class TestProcessor implements ItemProcessor {
@Override
public Object processItem(Object billObject) throws Exception { return null; }
}
— TestWriter.java:
package batchtest;
import java.io.Serializable;
import java.util.List;
import javax.batch.api.chunk.ItemWriter;
import javax.enterprise.context.Dependent;
import javax.inject.Named;
@Dependent
@Named("TestWriter")
public class TestWriter implements ItemWriter {
@Override
public void open(Serializable ckpt) throws Exception { }
@Override
public void close() throws Exception { }
@Override
public void writeItems(List<Object> list) throws Exception
{
System.out.println("Dummy writer");
}
@Override
public Serializable checkpointInfo() throws Exception
{
return null;
}
}
— BatchStarter.java:
package batchtest;
import javax.batch.operations.JobOperator;
import javax.batch.runtime.BatchRuntime;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named
@RequestScoped
public class BatchStarter {
public void startTestBatch()
{
JobOperator jobOperator = BatchRuntime.getJobOperator();
long execId = jobOperator.start("batchtest", null);
System.out.println("Batch started: id " + execId);
}
}
— index.xhtml:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<meta charset="UTF-8" />
<title>Batch Test</title>
</h:head>
<h:body>
<h:form id="formTest">
<h:commandButton type="submit" value="Start test batch" action="#
{batchStarter.startTestBatch()}
" />
</h:form>
</h:body>
</html>
— web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>BatchTest</display-name>
<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
</web-app>
Deploy web application to WildFly, navigate to index.xhtml and press button on the web page to start the batch job. Methods at the PartitionPlan implementation are called, and batch job is started as two partitions / threads. Open method at TestReader instance is called, but partition-specific parameters are null.