@Override public String decide(StepExecution[] ses) throws Exception { for (StepExecution se : ses) { System.out.println(se.getStepName() + " " + se.getBatchStatus().toString() + " " + se.getExitStatus()); } return "foobar"; }
@Test public void testNullExitStatus() { stepExecution.setExitStatus(null); assertNull(jsrStepExecution.getExitStatus()); }
@Test public void testStepNoOverrideWhenNextAndFailedTransitionElementExists() throws Exception { JobExecution jobExecution = runJob("FlowParserTestsStepNoOverrideWhenNextAndFailedTransitionElementExists", new Properties(), 10000L); assertEquals(ExitStatus.FAILED.getExitCode(), jobExecution.getExitStatus()); JobOperator jobOperator = BatchRuntime.getJobOperator(); List<StepExecution> stepExecutions = jobOperator.getStepExecutions(jobExecution.getExecutionId()); assertEquals(1, stepExecutions.size()); StepExecution failedStep = stepExecutions.get(0); assertTrue("failedExitStatusStepDontOverride".equals(failedStep.getStepName())); assertTrue("CUSTOM_FAIL".equals(failedStep.getExitStatus())); }
@Test public void testStepGetsFailedTransitionWhenNextAttributePresent() throws Exception { JobExecution jobExecution = runJob("FlowParserTestsStepGetsFailedTransitionWhenNextAttributePresent", new Properties(), 10000L); assertEquals(ExitStatus.FAILED.getExitCode(), jobExecution.getExitStatus()); JobOperator jobOperator = BatchRuntime.getJobOperator(); List<StepExecution> stepExecutions = jobOperator.getStepExecutions(jobExecution.getExecutionId()); assertEquals(1, stepExecutions.size()); StepExecution failedStep = stepExecutions.get(0); assertTrue("failedExitStatusStep".equals(failedStep.getStepName())); assertTrue("FAILED".equals(failedStep.getExitStatus())); }
assertEquals(new Date(0), jsrStepExecution.getStartTime()); assertEquals(new Date(10000000), jsrStepExecution.getEndTime()); assertEquals("customExitStatus", jsrStepExecution.getExitStatus()); assertEquals("persisted data", jsrStepExecution.getPersistentUserData());
private String coreExitStatus(StepExecution stepExec) { String action = (String)stepExec.getPersistentUserData(); String currentExitStatus = stepExec.getExitStatus(); // "Normally" we just pass set 'normalExitStatus' as exit status. if (currentExitStatus.equals(GOOD_STEP_EXIT_STATUS)) { return action; // But if it's the magic number then we return our "SpecialExitStatus". } else { return specialExitStatus; } }
@Override public String decide(StepExecution[] stepExecutions) throws Exception { if (stepExecutions.length != 1) { throw new IllegalStateException("Expecting stepExecutions array of size 1, found one of size = " + stepExecutions.length); } StepExecution stepExecution = stepExecutions[0]; for (StepExecution stepExec : stepExecutions) { if (stepExec == null) { throw new Exception("Null StepExecution after flow."); } if (!stepExec.getBatchStatus().equals(BatchStatus.COMPLETED)) { throw new Exception("All step executions must be compelete before transitioning to a decider."); } } // for our test // <end exit-status="ThatsAllFolks" on="DECIDER_EXIT_STATUS*VERY GOOD INVOCATION" /> return DECIDER_EXIT_STATUS + "*" + stepExecution.getExitStatus(); }
String tempExitStatus = stepExec.getExitStatus(); String tempStepName = stepExec.getStepName();
@Override public void execute() throws MojoExecutionException, MojoFailureException { final List<StepExecution> executions = getOrCreateOperator().getStepExecutions(executionId); getLog().info("Step executions for job execution #" + executionId + ":"); for (final StepExecution exec : executions) { getLog().info(" - id = " + exec.getStepExecutionId()); getLog().info(" + step = " + exec.getStepName()); getLog().info(" + batch status = " + exec.getBatchStatus()); getLog().info(" + exit status = " + exec.getExitStatus()); getLog().info(" + start time = " + exec.getStartTime()); getLog().info(" + end time = " + exec.getEndTime()); getLog().info(" + metrics"); if (exec.getMetrics() != null) { for (final Metric m : exec.getMetrics()) { getLog().info(" > " + m.getType().name().replace("COUNT", "").replace("_", " ").toLowerCase(Locale.ENGLISH) + " = " + m.getValue()); } } } } }
/** * After the job is done, generate a report */ @Override public void afterJob() throws Exception { //TODO add notifications to job failure? if (jobContext.getExitStatus() != null && jobContext.getExitStatus().equals("FAILED")) { getJobLogger().log(Level.SEVERE, "Job Failed. See Log for more information."); closeJobLoggerHandlers(); return; } // run reporting and notifications doReport(); // report any unused checksums HashMap checksumHashMap = (HashMap<String, String>) jobContext.getTransientUserData(); for (Object key : checksumHashMap.keySet()) { getJobLogger().log(Level.SEVERE, "File listed in checksum manifest not found: " + key); } // job step info JobOperator jobOperator = BatchRuntime.getJobOperator(); StepExecution step = jobOperator.getStepExecutions(jobContext.getInstanceId()).get(0); getJobLogger().log(Level.INFO, "Job start = " + step.getStartTime()); getJobLogger().log(Level.INFO, "Job end = " + step.getEndTime()); getJobLogger().log(Level.INFO, "Job exit status = " + step.getExitStatus()); closeJobLoggerHandlers(); }
public static StepExecutionEntity create(final StepExecution stepExecution) { final StepExecutionEntity result = new StepExecutionEntity(); result.id = stepExecution.getStepExecutionId(); result.name = stepExecution.getStepName(); result.status = stepExecution.getBatchStatus(); result.exitStatus = stepExecution.getExitStatus(); result.endTime = stepExecution.getEndTime(); result.startTime = stepExecution.getStartTime(); // metrics result.metrics = new HashMap<>(); final Metric[] metricArr = stepExecution.getMetrics(); for (Metric m : metricArr) { result.metrics.put(m.getType().name().toLowerCase(), m.getValue()); } if (stepExecution.getPersistentUserData() != null) { result.setPersistentUserData(stepExecution.getPersistentUserData().toString()); } return result; }
@Test @org.junit.Test public void testStepContextIsUniqueForMainThreadAndPartitions() throws Exception { String METHOD = "testStepContextIsUniqueForMainThreadAndPartitions"; begin(METHOD); try { Reporter.log("Locate job XML file: job_partitioned_1step.xml<p>"); Reporter.log("Invoke startJobAndWaitForResult<p>"); JobExecution jobExecution = jobOp.startJobAndWaitForResult("job_partitioned_1step"); Reporter.log("JobExecution getBatchStatus()=" + jobExecution.getBatchStatus() + "<p>"); assertObjEquals(BatchStatus.COMPLETED, jobExecution.getBatchStatus()); List<StepExecution> stepExecs = jobOp.getStepExecutions(jobExecution.getExecutionId()); //only one step in job StepExecution stepExec = stepExecs.get(0); //verify step context is defaulted because it was never set on main thread. assertObjEquals("COMPLETED", stepExec.getExitStatus()); } catch (Exception e) { handleException(METHOD, e); } }
@Test @org.junit.Test public void testStepExecutionExitStatus() throws Exception { String METHOD = "testStepExecutionExitStatus"; begin(METHOD); try { Reporter.log("Locate job XML file: job_batchlet_failElement.xml<p>"); Reporter.log("Invoke startJobAndWaitForResult for execution #1<p>"); JobExecution jobExec = jobOp.startJobAndWaitForResult("job_batchlet_failElement"); Reporter.log("Obtaining StepExecutions for execution id: " + jobExec.getExecutionId() + "<p>"); List<StepExecution> steps = jobOp.getStepExecutions(jobExec.getExecutionId()); assertObjEquals(1, steps.size()); StepExecution step = steps.get(0); showStepState(step); assertWithMessage("Check step exit status", MyBatchletImpl.GOOD_EXIT_STATUS, step.getExitStatus()); assertWithMessage("Check step batch status", BatchStatus.COMPLETED, step.getBatchStatus()); Reporter.log("Job batch status =" + jobExec.getBatchStatus() + "<p>"); Reporter.log("Job exit status =" + jobExec.getExitStatus() + "<p>"); assertWithMessage("Check job batch status", BatchStatus.FAILED, jobExec.getBatchStatus()); assertWithMessage("Check job exit status", "TEST_FAIL", jobExec.getExitStatus()); } catch (Exception e) { handleException(METHOD, e); } }
private static Object[] asArray(final StepExecution n) { return new Object[] { n.getStepExecutionId(), n.getStepName(), n.getBatchStatus().name(), n.getExitStatus(), n.getStartTime() != null ? n.getStartTime().toString() : "", n.getEndTime() != null ? n.getEndTime().toString() : "", metric(n.getMetrics(), Metric.MetricType.READ_COUNT), metric(n.getMetrics(), Metric.MetricType.WRITE_COUNT), metric(n.getMetrics(), Metric.MetricType.COMMIT_COUNT), metric(n.getMetrics(), Metric.MetricType.ROLLBACK_COUNT), metric(n.getMetrics(), Metric.MetricType.READ_SKIP_COUNT), metric(n.getMetrics(), Metric.MetricType.PROCESS_SKIP_COUNT), metric(n.getMetrics(), Metric.MetricType.WRITE_SKIP_COUNT), metric(n.getMetrics(), Metric.MetricType.FILTER_COUNT) }; }
private void showStepState(StepExecution step) { Reporter.log("---------------------------<p>"); Reporter.log("getJobExecutionId(): " + step.getStepExecutionId() + " - "); Metric[] metrics = step.getMetrics(); for (int i = 0; i < metrics.length; i++) { Reporter.log(metrics[i].getType() + ": " + metrics[i].getValue() + " - "); } Reporter.log("getStartTime(): " + step.getStartTime() + " - "); Reporter.log("getEndTime(): " + step.getEndTime() + " - "); Reporter.log("getBatchStatus(): " + step.getBatchStatus() + " - "); Reporter.log("getExitStatus(): " + step.getExitStatus()); Reporter.log("---------------------------<p>"); }
@Test @org.junit.Test public void testStepInFlowStepExecution() throws Exception { String METHOD = "testStepInFlowStepExecution"; begin(METHOD); try { Reporter.log("Locate job XML file: job_batchlet_failElement.xml<p>"); Reporter.log("Invoke startJobAndWaitForResult for execution #1<p>"); JobExecution jobExec = jobOp.startJobAndWaitForResult("flow_transition_to_step"); Reporter.log("Obtaining StepExecutions for execution id: " + jobExec.getExecutionId() + "<p>"); List<StepExecution> steps = jobOp.getStepExecutions(jobExec.getExecutionId()); assertObjEquals(4, steps.size()); for (StepExecution step : steps) { showStepState(step); // Conveniently all four steps have same exit and batch status. assertWithMessage("Check step exit status", MyBatchletImpl.GOOD_EXIT_STATUS, step.getExitStatus()); assertWithMessage("Check step batch status", BatchStatus.COMPLETED, step.getBatchStatus()); } // Now check job level status Reporter.log("Job batch status =" + jobExec.getBatchStatus() + "<p>"); Reporter.log("Job exit status =" + jobExec.getExitStatus() + "<p>"); assertWithMessage("Check job batch status", BatchStatus.COMPLETED, jobExec.getBatchStatus()); assertWithMessage("Check job exit status", "flow1step1, flow1step2, flow1step3, step1", jobExec.getExitStatus()); } catch (Exception e) { handleException(METHOD, e); } }
@Test @org.junit.Test public void testStepInFlowInSplitStepExecution() throws Exception { String METHOD = "testStepInFlowInSplitStepExecution"; begin(METHOD); try { Reporter.log("Locate job XML file: split_batchlet_4steps.xml<p>"); Reporter.log("Invoke startJobAndWaitForResult for execution #1<p>"); JobExecution jobExec = jobOp.startJobAndWaitForResult("split_batchlet_4steps"); // Saves debugging time to check these two first in case they fail assertWithMessage("Check job batch status", BatchStatus.COMPLETED, jobExec.getBatchStatus()); assertWithMessage("Check job exit status", "COMPLETED", jobExec.getExitStatus()); Reporter.log("Obtaining StepExecutions for execution id: " + jobExec.getExecutionId() + "<p>"); List<StepExecution> steps = jobOp.getStepExecutions(jobExec.getExecutionId()); assertObjEquals(4, steps.size()); for (StepExecution step : steps) { showStepState(step); // Conveniently all four steps have same exit and batch status. assertWithMessage("Check step exit status", MyBatchletImpl.GOOD_EXIT_STATUS, step.getExitStatus()); assertWithMessage("Check step batch status", BatchStatus.COMPLETED, step.getBatchStatus()); } Reporter.log("Job batch status =" + jobExec.getBatchStatus() + "<p>"); Reporter.log("Job exit status =" + jobExec.getExitStatus() + "<p>"); } catch (Exception e) { handleException(METHOD, e); } }
private void showStepState(StepExecution step) { Reporter.log("---------------------------<p>"); Reporter.log("getStepName(): " + step.getStepName() + " - "); Reporter.log("getStepExecutionId(): " + step.getStepExecutionId() + " - "); Metric[] metrics = step.getMetrics(); for (int i = 0; i < metrics.length; i++) { Reporter.log(metrics[i].getType() + ": " + metrics[i].getValue() + " - "); } Reporter.log("getStartTime(): " + step.getStartTime() + " - "); Reporter.log("getEndTime(): " + step.getEndTime() + " - "); Reporter.log("getBatchStatus(): " + step.getBatchStatus() + " - "); Reporter.log("getExitStatus(): " + step.getExitStatus()+"<p>"); Reporter.log("---------------------------<p>"); }
private void showStepState(StepExecution step) { Reporter.log("---------------------------"); Reporter.log("getStepName(): " + step.getStepName() + " - "); Reporter.log("getJobExecutionId(): " + step.getStepExecutionId() + " - "); //System.out.print("getStepExecutionId(): " + step.getStepExecutionId() + " - "); Metric[] metrics = step.getMetrics(); for (int i = 0; i < metrics.length; i++) { Reporter.log(metrics[i].getType() + ": " + metrics[i].getValue() + " - "); } Reporter.log("getStartTime(): " + step.getStartTime() + " - "); Reporter.log("getEndTime(): " + step.getEndTime() + " - "); //System.out.print("getLastUpdateTime(): " + step.getLastUpdateTime() + " - "); Reporter.log("getBatchStatus(): " + step.getBatchStatus() + " - "); Reporter.log("getExitStatus(): " + step.getExitStatus()); Reporter.log("---------------------------"); } }
@Override public void updateStepExecution(final StepExecution stepExecution) { final StepExecutionImpl stepExecutionImpl = (StepExecutionImpl) stepExecution; try { final DBObject update = new BasicDBObject(TableColumns.ENDTIME, stepExecution.getEndTime()); update.put(TableColumns.BATCHSTATUS, stepExecution.getBatchStatus().name()); update.put(TableColumns.EXITSTATUS, stepExecution.getExitStatus()); update.put(TableColumns.EXECUTIONEXCEPTION, TableColumns.formatException(stepExecutionImpl.getException())); update.put(TableColumns.PERSISTENTUSERDATA, stepExecutionImpl.getPersistentUserDataSerialized()); update.put(TableColumns.READCOUNT, stepExecutionImpl.getStepMetrics().get(Metric.MetricType.READ_COUNT)); update.put(TableColumns.WRITECOUNT, stepExecutionImpl.getStepMetrics().get(Metric.MetricType.WRITE_COUNT)); update.put(TableColumns.COMMITCOUNT, stepExecutionImpl.getStepMetrics().get(Metric.MetricType.COMMIT_COUNT)); update.put(TableColumns.ROLLBACKCOUNT, stepExecutionImpl.getStepMetrics().get(Metric.MetricType.ROLLBACK_COUNT)); update.put(TableColumns.READSKIPCOUNT, stepExecutionImpl.getStepMetrics().get(Metric.MetricType.READ_SKIP_COUNT)); update.put(TableColumns.PROCESSSKIPCOUNT, stepExecutionImpl.getStepMetrics().get(Metric.MetricType.PROCESS_SKIP_COUNT)); update.put(TableColumns.FILTERCOUNT, stepExecutionImpl.getStepMetrics().get(Metric.MetricType.FILTER_COUNT)); update.put(TableColumns.WRITESKIPCOUNT, stepExecutionImpl.getStepMetrics().get(Metric.MetricType.WRITE_SKIP_COUNT)); update.put(TableColumns.READERCHECKPOINTINFO, stepExecutionImpl.getReaderCheckpointInfoSerialized()); update.put(TableColumns.WRITERCHECKPOINTINFO, stepExecutionImpl.getWriterCheckpointInfoSerialized()); db.getCollection(TableColumns.STEP_EXECUTION).update( new BasicDBObject(TableColumns.STEPEXECUTIONID, stepExecution.getStepExecutionId()), new BasicDBObject("$set", update)); } catch (final Exception e) { throw BatchMessages.MESSAGES.failToRunQuery(e, "updateStepExecution"); } }