Uploaded image for project: 'WildFly'
  1. WildFly
  2. WFLY-3724

Batch jobs don't receive partition-specific parameters

    XMLWordPrintable

Details

    • Bug
    • Resolution: Won't Do
    • Major
    • None
    • 8.1.0.Final
    • Batch
    • None
    • Hide

      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.

      Show
      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.

    Description

      When defining a batch job chunk step to run as partitions, ItemReader doesn't receive the partition-specific parameters specified by an implementation of the PartitionPlan interface. Parameters are null. See steps to reproduce for further details.

      Attachments

        Issue Links

          Activity

            People

              elguardian@gmail.com Enrique González Martínez (Inactive)
              arialfred Ari Silvan (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: