You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@batchee.apache.org by rm...@apache.org on 2015/03/31 14:34:15 UTC

incubator-batchee git commit: BATCHEE-64 providing job state as well as step execution in StepLauncher#exec

Repository: incubator-batchee
Updated Branches:
  refs/heads/master c6f4fdf85 -> 7b7e9e9a2


BATCHEE-64 providing job state as well as step execution in StepLauncher#exec


Project: http://git-wip-us.apache.org/repos/asf/incubator-batchee/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-batchee/commit/7b7e9e9a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-batchee/tree/7b7e9e9a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-batchee/diff/7b7e9e9a

Branch: refs/heads/master
Commit: 7b7e9e9a2b27f1a0c93271dc5a6ca4a086606064
Parents: c6f4fdf
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Tue Mar 31 14:34:07 2015 +0200
Committer: Romain Manni-Bucau <rm...@apache.org>
Committed: Tue Mar 31 14:34:07 2015 +0200

----------------------------------------------------------------------
 .../org/apache/batchee/test/StepBuilder.java    | 49 ++++++++++++++
 .../org/apache/batchee/test/StepLauncher.java   | 69 ++++++++++++--------
 .../apache/batchee/test/StepLauncherTest.java   | 16 ++++-
 .../batchee/test/components/SleepBatchlet.java  | 13 ++++
 .../resources/META-INF/batch-jobs/sleep.xml     |  2 +
 5 files changed, 117 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/7b7e9e9a/test/src/main/java/org/apache/batchee/test/StepBuilder.java
----------------------------------------------------------------------
diff --git a/test/src/main/java/org/apache/batchee/test/StepBuilder.java b/test/src/main/java/org/apache/batchee/test/StepBuilder.java
index 3853780..32ce57f 100644
--- a/test/src/main/java/org/apache/batchee/test/StepBuilder.java
+++ b/test/src/main/java/org/apache/batchee/test/StepBuilder.java
@@ -21,13 +21,17 @@ import org.apache.batchee.container.jsl.JobModelResolver;
 import org.apache.batchee.container.services.loader.DefaultJobXMLLoaderService;
 import org.apache.batchee.jaxb.Batchlet;
 import org.apache.batchee.jaxb.Chunk;
+import org.apache.batchee.jaxb.End;
+import org.apache.batchee.jaxb.Fail;
 import org.apache.batchee.jaxb.ItemProcessor;
 import org.apache.batchee.jaxb.ItemReader;
 import org.apache.batchee.jaxb.ItemWriter;
 import org.apache.batchee.jaxb.JSLJob;
 import org.apache.batchee.jaxb.JSLProperties;
+import org.apache.batchee.jaxb.Next;
 import org.apache.batchee.jaxb.Property;
 import org.apache.batchee.jaxb.Step;
+import org.apache.batchee.jaxb.Stop;
 
 import java.util.List;
 
@@ -90,6 +94,51 @@ public class StepBuilder {
         return this;
     }
 
+    public StepBuilder failOn(final String on) {
+        return failOn(on, null);
+    }
+
+    public StepBuilder failOn(final String on, final String exitStatus) {
+        final Fail fail = new Fail();
+        fail.setOn(on);
+        fail.setExitStatus(exitStatus);
+        step.getTransitionElements().add(fail);
+        return this;
+    }
+
+    public StepBuilder endOn(final String on) {
+        return endOn(on, null);
+    }
+
+    public StepBuilder endOn(final String on, final String exitStatus) {
+        final End end = new End();
+        end.setOn(on);
+        end.setExitStatus(exitStatus);
+        step.getTransitionElements().add(end);
+        return this;
+    }
+
+    public StepBuilder stopOn(final String on, final String restart) {
+        return stopOn(on, restart, null);
+    }
+
+    public StepBuilder stopOn(final String on, final String restart, final String exitStatus) {
+        final Stop stop = new Stop();
+        stop.setOn(on);
+        stop.setExitStatus(exitStatus);
+        stop.setRestart(restart);
+        step.getTransitionElements().add(stop);
+        return this;
+    }
+
+    public StepBuilder nextOn(final String on, final String to) {
+        final Next next = new Next();
+        next.setOn(on);
+        next.setTo(to);
+        step.getTransitionElements().add(next);
+        return this;
+    }
+
     public Step create() {
         if (step.getId() == null) {
             step.setId("batchee-test"); // can't be null

http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/7b7e9e9a/test/src/main/java/org/apache/batchee/test/StepLauncher.java
----------------------------------------------------------------------
diff --git a/test/src/main/java/org/apache/batchee/test/StepLauncher.java b/test/src/main/java/org/apache/batchee/test/StepLauncher.java
index ddeb150..96f46bf 100644
--- a/test/src/main/java/org/apache/batchee/test/StepLauncher.java
+++ b/test/src/main/java/org/apache/batchee/test/StepLauncher.java
@@ -18,34 +18,28 @@ package org.apache.batchee.test;
 
 import org.apache.batchee.container.impl.JobContextImpl;
 import org.apache.batchee.container.impl.StepContextImpl;
-import org.apache.batchee.container.impl.controller.batchlet.BatchletStepController;
-import org.apache.batchee.container.impl.controller.chunk.ChunkStepController;
+import org.apache.batchee.container.impl.controller.JobController;
 import org.apache.batchee.container.impl.jobinstance.RuntimeJobExecution;
 import org.apache.batchee.container.modelresolver.PropertyResolverFactory;
 import org.apache.batchee.container.navigator.JobNavigator;
-import org.apache.batchee.container.proxy.InjectionReferences;
-import org.apache.batchee.container.proxy.ListenerFactory;
 import org.apache.batchee.container.services.JobStatusManagerService;
 import org.apache.batchee.container.services.ServicesManager;
 import org.apache.batchee.container.services.persistence.MemoryPersistenceManagerService;
-import org.apache.batchee.container.util.PartitionDataWrapper;
 import org.apache.batchee.jaxb.JSLJob;
 import org.apache.batchee.jaxb.JSLProperties;
 import org.apache.batchee.jaxb.Step;
-import org.apache.batchee.spi.BatchArtifactFactory;
 import org.apache.batchee.spi.PersistenceManagerService;
 import org.apache.batchee.spi.SecurityService;
 
+import java.util.Properties;
 import javax.batch.runtime.BatchStatus;
+import javax.batch.runtime.JobExecution;
 import javax.batch.runtime.JobInstance;
 import javax.batch.runtime.StepExecution;
-import java.util.Properties;
-import java.util.concurrent.ArrayBlockingQueue;
 
 public class StepLauncher {
     private static final Properties EMPTY_PROPERTIES = new Properties();
     private static final JSLProperties EMPTY_JSL_PROPERTIES = new JSLProperties();
-    private static final JSLJob EMPTY_JOB = new JSLJob();
 
     private static final Properties TEST_PROPERTIES = new Properties();
 
@@ -60,45 +54,62 @@ public class StepLauncher {
     /**
      * @param step the step to execute, Note: it can be modified by this method
      * @param jobParams the job parameters properties
-     * @return the step execution
+     * @return the job execution
      */
-    public static StepExecution execute(final Step step, final Properties jobParams) {
+    public static Result exec(final Step step, final Properties jobParams) {
         // services
         final ServicesManager manager = new ServicesManager();
         manager.init(TEST_PROPERTIES);
 
         final PersistenceManagerService persistenceManagerService = manager.service(PersistenceManagerService.class);
-        final BatchArtifactFactory factory = manager.service(BatchArtifactFactory.class);
+
+        final JSLJob job = new JSLJob();
+        PropertyResolverFactory.createStepPropertyResolver(false).substituteProperties(step, jobParams);
+        job.getExecutionElements().add(step);
 
         // contextual data
         final JobInstance jobInstance = persistenceManagerService.createJobInstance(step.getId(), manager.service(SecurityService.class).getLoggedUser(), null);
         manager.service(JobStatusManagerService.class).createJobStatus(jobInstance.getInstanceId());
 
-        final JobContextImpl jobContext = new JobContextImpl(new JobNavigator(EMPTY_JOB), EMPTY_JSL_PROPERTIES);
+        final JobContextImpl jobContext = new JobContextImpl(new JobNavigator(job), EMPTY_JSL_PROPERTIES);
         final StepContextImpl stepContext = new StepContextImpl(step.getId());
 
-        final RuntimeJobExecution runtimeJobExecution = persistenceManagerService.createJobExecution(jobInstance, EMPTY_PROPERTIES, BatchStatus.STARTED);
-        final InjectionReferences injectionRefs = new InjectionReferences(jobContext, stepContext, EMPTY_JSL_PROPERTIES.getPropertyList());
-        final ListenerFactory listenerFactory = new ListenerFactory(factory, EMPTY_JOB, injectionRefs, runtimeJobExecution);
+        final RuntimeJobExecution runtimeJobExecution = persistenceManagerService.createJobExecution(jobInstance, jobParams, BatchStatus.STARTED);
 
         // execute it!
-        runtimeJobExecution.setListenerFactory(listenerFactory);
         runtimeJobExecution.prepareForExecution(jobContext, null);
+        new JobController(runtimeJobExecution, manager).originateExecutionOnThread();
+        return new Result(stepContext, runtimeJobExecution, persistenceManagerService);
+    }
+
+    /**
+     * @param step the step to execute, Note: it can be modified by this method
+     * @param jobParams the job parameters properties
+     * @return the step execution
+     */
+    public static StepExecution execute(final Step step, final Properties jobParams) {
+        final Result execution = exec(step, jobParams);
+        return execution.stepExecution();
+    }
 
-        if (step.getChunk() != null) {
-            step.setChunk(PropertyResolverFactory.createChunkPropertyResolver(false).substituteProperties(step.getChunk(), jobParams));
-            new ChunkStepController(runtimeJobExecution, step, stepContext, jobInstance.getInstanceId(),
-                new ArrayBlockingQueue<PartitionDataWrapper>(1), manager)
-                .execute();
-        } else { // batchlet
-            step.setBatchlet(PropertyResolverFactory.createBatchletPropertyResolver(false).substituteProperties(step.getBatchlet(), jobParams));
-            new BatchletStepController(
-                runtimeJobExecution, step, stepContext, jobInstance.getInstanceId(),
-                new ArrayBlockingQueue<PartitionDataWrapper>(1), manager)
-                .execute();
+    public static class Result {
+        private final StepContextImpl stepContext;
+        private final RuntimeJobExecution jobExecution;
+        private final PersistenceManagerService persistenceManagerService;
+
+        public Result(final StepContextImpl stepContext, final RuntimeJobExecution jobExecution, final PersistenceManagerService persistenceManagerService) {
+            this.stepContext = stepContext;
+            this.jobExecution = jobExecution;
+            this.persistenceManagerService = persistenceManagerService;
+        }
+
+        public StepExecution stepExecution() {
+            return persistenceManagerService.getStepExecutionByStepExecutionId(stepContext.getStepInternalExecID());
         }
 
-        return persistenceManagerService.getStepExecutionByStepExecutionId(stepContext.getStepInternalExecID());
+        public JobExecution jobExecution() {
+            return jobExecution.getJobOperatorJobExecution();
+        }
     }
 
     private StepLauncher() {

http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/7b7e9e9a/test/src/test/java/org/apache/batchee/test/StepLauncherTest.java
----------------------------------------------------------------------
diff --git a/test/src/test/java/org/apache/batchee/test/StepLauncherTest.java b/test/src/test/java/org/apache/batchee/test/StepLauncherTest.java
index 9d96df4..44c2052 100644
--- a/test/src/test/java/org/apache/batchee/test/StepLauncherTest.java
+++ b/test/src/test/java/org/apache/batchee/test/StepLauncherTest.java
@@ -18,19 +18,20 @@ package org.apache.batchee.test;
 
 import org.testng.annotations.Test;
 
+import java.io.Serializable;
+import java.util.List;
+import java.util.Properties;
 import javax.batch.api.BatchProperty;
 import javax.batch.api.Batchlet;
 import javax.batch.api.chunk.AbstractItemReader;
 import javax.batch.api.chunk.AbstractItemWriter;
 import javax.batch.api.chunk.ItemProcessor;
 import javax.batch.runtime.BatchStatus;
+import javax.batch.runtime.JobExecution;
 import javax.batch.runtime.StepExecution;
 import javax.batch.runtime.context.JobContext;
 import javax.batch.runtime.context.StepContext;
 import javax.inject.Inject;
-import java.io.Serializable;
-import java.util.List;
-import java.util.Properties;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
@@ -41,6 +42,15 @@ public class StepLauncherTest {
     public static final String BATCHLET_REF = SimpleBatchlet.class.getName();
 
     @Test
+    public void stepFail() {
+        final JobExecution execution = StepLauncher.exec(StepBuilder.extractFromXml("sleep.xml", "doSleep"), new Properties() {{
+            setProperty("exitStatus", "failed");
+        }}).jobExecution();
+        assertEquals(execution.getExitStatus(), "oops");
+        assertEquals(execution.getBatchStatus(), BatchStatus.FAILED);
+    }
+
+    @Test
     public void stepFromXml() {
         final StepExecution execution = StepLauncher.execute(StepBuilder.extractFromXml("sleep.xml", "doSleep"));
         assertEquals("OK", execution.getExitStatus());

http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/7b7e9e9a/test/src/test/java/org/apache/batchee/test/components/SleepBatchlet.java
----------------------------------------------------------------------
diff --git a/test/src/test/java/org/apache/batchee/test/components/SleepBatchlet.java b/test/src/test/java/org/apache/batchee/test/components/SleepBatchlet.java
index abafb2a..d1cc933 100644
--- a/test/src/test/java/org/apache/batchee/test/components/SleepBatchlet.java
+++ b/test/src/test/java/org/apache/batchee/test/components/SleepBatchlet.java
@@ -18,6 +18,7 @@ package org.apache.batchee.test.components;
 
 import javax.batch.api.BatchProperty;
 import javax.batch.api.Batchlet;
+import javax.batch.runtime.context.StepContext;
 import javax.inject.Inject;
 
 public class SleepBatchlet implements Batchlet {
@@ -27,10 +28,22 @@ public class SleepBatchlet implements Batchlet {
     @BatchProperty
     private String duration = "50";
 
+    @Inject
+    @BatchProperty
+    private String exitStatus;
+
+    @Inject
+    private StepContext stepContext;
+
     private volatile boolean stopped = false;
 
     @Override
     public String process() throws Exception {
+        if (exitStatus != null) {
+            stepContext.setExitStatus(exitStatus);
+            return exitStatus;
+        }
+
         final long pauses = Long.parseLong(duration) / SLEEP_DURATION;
         for (long i = 0; i < pauses; i++) {
             if (stopped) {

http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/7b7e9e9a/test/src/test/resources/META-INF/batch-jobs/sleep.xml
----------------------------------------------------------------------
diff --git a/test/src/test/resources/META-INF/batch-jobs/sleep.xml b/test/src/test/resources/META-INF/batch-jobs/sleep.xml
index a6df21d..f78cc78 100644
--- a/test/src/test/resources/META-INF/batch-jobs/sleep.xml
+++ b/test/src/test/resources/META-INF/batch-jobs/sleep.xml
@@ -18,7 +18,9 @@
     <batchlet ref="org.apache.batchee.test.components.SleepBatchlet">
       <properties>
         <property name="duration" value="#{jobParameters['duration']}" />
+        <property name="exitStatus" value="#{jobParameters['exitStatus']}" />
       </properties>
     </batchlet>
+    <fail on="failed" exit-status="oops" />
   </step>
 </job>