@Override public void aggregate(StepExecution result, Collection<StepExecution> executions) { Assert.notNull(result, "To aggregate into a result it must be non-null."); if (executions == null) { return; } for (StepExecution stepExecution : executions) { BatchStatus status = stepExecution.getStatus(); result.setStatus(BatchStatus.max(result.getStatus(), status)); result.setCommitCount(result.getCommitCount() + stepExecution.getCommitCount()); result.setRollbackCount(result.getRollbackCount() + stepExecution.getRollbackCount()); result.setReadCount(result.getReadCount() + stepExecution.getReadCount()); result.setReadSkipCount(result.getReadSkipCount() + stepExecution.getReadSkipCount()); result.setWriteCount(result.getWriteCount() + stepExecution.getWriteCount()); result.setWriteSkipCount(result.getWriteSkipCount() + stepExecution.getWriteSkipCount()); } } }
@Override public Metric[] getMetrics() { Metric[] metrics = new Metric[8]; metrics[0] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.COMMIT_COUNT, stepExecution.getCommitCount()); metrics[1] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.FILTER_COUNT, stepExecution.getFilterCount()); metrics[2] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.PROCESS_SKIP_COUNT, stepExecution.getProcessSkipCount()); metrics[3] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.READ_COUNT, stepExecution.getReadCount()); metrics[4] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.READ_SKIP_COUNT, stepExecution.getReadSkipCount()); metrics[5] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.ROLLBACK_COUNT, stepExecution.getRollbackCount()); metrics[6] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.WRITE_COUNT, stepExecution.getWriteCount()); metrics[7] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.WRITE_SKIP_COUNT, stepExecution.getWriteSkipCount()); return metrics; } }
@Override public Metric[] getMetrics() { Metric[] metrics = new Metric[8]; metrics[0] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.COMMIT_COUNT, stepExecution.getCommitCount()); metrics[1] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.FILTER_COUNT, stepExecution.getFilterCount()); metrics[2] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.PROCESS_SKIP_COUNT, stepExecution.getProcessSkipCount()); metrics[3] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.READ_COUNT, stepExecution.getReadCount()); metrics[4] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.READ_SKIP_COUNT, stepExecution.getReadSkipCount()); metrics[5] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.ROLLBACK_COUNT, stepExecution.getRollbackCount()); metrics[6] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.WRITE_COUNT, stepExecution.getWriteCount()); metrics[7] = new SimpleMetric(javax.batch.runtime.Metric.MetricType.WRITE_SKIP_COUNT, stepExecution.getWriteSkipCount()); return metrics; } }
/** * Check items causing errors are skipped as expected. */ @Test public void testSkipOnWriteNotDoubleCounted() throws Exception { reader.setItems(StringUtils.commaDelimitedListToStringArray("1,2,3,4,5,6,7")); reader.setFailures(StringUtils.commaDelimitedListToStringArray("2,3")); writer.setFailures("4", "5"); factory.setSkipLimit(4); factory.setCommitInterval(3); // includes all expected skips Step step = factory.getObject(); step.execute(stepExecution); assertEquals(4, stepExecution.getSkipCount()); assertEquals(2, stepExecution.getReadSkipCount()); assertEquals(2, stepExecution.getWriteSkipCount()); // skipped 2,3,4,5 List<String> expectedOutput = Arrays.asList(StringUtils.commaDelimitedListToStringArray("1,6,7")); assertEquals(expectedOutput, writer.getCommitted()); assertStepExecutionsAreEqual(stepExecution, repository.getLastStepExecution(jobExecution.getJobInstance(), step .getName())); }
/** * Check items causing errors are skipped as expected. */ @Test public void testSkipOnReadNotDoubleCounted() throws Exception { reader.setItems(StringUtils.commaDelimitedListToStringArray("1,2,3,4,5,6")); reader.setFailures(StringUtils.commaDelimitedListToStringArray("2,3,5")); writer.setFailures("4"); factory.setSkipLimit(4); Step step = factory.getObject(); step.execute(stepExecution); assertEquals(4, stepExecution.getSkipCount()); assertEquals(3, stepExecution.getReadSkipCount()); assertEquals(1, stepExecution.getWriteSkipCount()); // skipped 2,3,4,5 List<String> expectedOutput = Arrays.asList(StringUtils.commaDelimitedListToStringArray("1,6")); assertEquals(expectedOutput, writer.getCommitted()); // reader exceptions should not cause rollback, 1 writer exception // causes 2 rollbacks assertEquals(2, stepExecution.getRollbackCount()); assertStepExecutionsAreEqual(stepExecution, repository.getLastStepExecution(jobExecution.getJobInstance(), step .getName())); }
@Test public void testProcessSkipWithNoRollbackForCheckedException() throws Exception { processor.setFailures("4"); processor.setExceptionType(SkippableException.class); factory.setNoRollbackExceptionClasses(getExceptionList(SkippableException.class)); Step step = factory.getObject(); step.execute(stepExecution); assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertEquals(1, stepExecution.getSkipCount()); assertEquals(0, stepExecution.getReadSkipCount()); assertEquals(5, stepExecution.getReadCount()); assertEquals(1, stepExecution.getProcessSkipCount()); assertEquals(0, stepExecution.getRollbackCount()); // skips "4" assertTrue(reader.getRead().contains("4")); assertFalse(writer.getCommitted().contains("4")); List<String> expectedOutput = Arrays.asList(StringUtils.commaDelimitedListToStringArray("1,2,3,5")); assertEquals(expectedOutput, writer.getCommitted()); }
/** * Check items causing errors are skipped as expected. */ @Test public void testReadSkip() throws Exception { reader.setFailures("2"); Step step = factory.getObject(); step.execute(stepExecution); assertEquals(1, stepExecution.getSkipCount()); assertEquals(1, stepExecution.getReadSkipCount()); assertEquals(4, stepExecution.getReadCount()); assertEquals(0, stepExecution.getWriteSkipCount()); assertEquals(0, stepExecution.getRollbackCount()); // writer did not skip "2" as it never made it to writer, only "4" did assertTrue(reader.getRead().contains("4")); assertFalse(reader.getRead().contains("2")); List<String> expectedOutput = Arrays.asList(StringUtils.commaDelimitedListToStringArray("1,3,4,5")); assertEquals(expectedOutput, writer.getWritten()); assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertStepExecutionsAreEqual(stepExecution, repository.getLastStepExecution(jobExecution.getJobInstance(), step .getName())); }
/** * Check items causing errors are skipped as expected. */ @Test public void testWriteSkip() throws Exception { writer.setFailures("4"); Step step = factory.getObject(); step.execute(stepExecution); assertEquals(1, stepExecution.getSkipCount()); assertEquals(0, stepExecution.getReadSkipCount()); assertEquals(5, stepExecution.getReadCount()); assertEquals(1, stepExecution.getWriteSkipCount()); assertEquals(2, stepExecution.getRollbackCount()); // writer skips "4" assertTrue(reader.getRead().contains("4")); assertFalse(writer.getCommitted().contains("4")); List<String> expectedOutput = Arrays.asList(StringUtils.commaDelimitedListToStringArray("1,2,3,5")); assertEquals(expectedOutput, writer.getCommitted()); assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertStepExecutionsAreEqual(stepExecution, repository.getLastStepExecution(jobExecution.getJobInstance(), step .getName())); }
/** * Check items causing errors are skipped as expected. */ @Test public void testProcessSkip() throws Exception { processor.setFailures("4"); writer.setFailures("4"); Step step = factory.getObject(); step.execute(stepExecution); assertEquals(1, stepExecution.getSkipCount()); assertEquals(0, stepExecution.getReadSkipCount()); assertEquals(5, stepExecution.getReadCount()); assertEquals(1, stepExecution.getProcessSkipCount()); assertEquals(1, stepExecution.getRollbackCount()); // writer skips "4" assertTrue(reader.getRead().contains("4")); assertFalse(writer.getWritten().contains("4")); List<String> expectedOutput = Arrays.asList(StringUtils.commaDelimitedListToStringArray("1,2,3,5")); assertEquals(expectedOutput, writer.getWritten()); assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertStepExecutionsAreEqual(stepExecution, repository.getLastStepExecution(jobExecution.getJobInstance(), step .getName())); }
@Test public void testNoInputNoListeners() throws Exception{ reader = new FailingListItemReader(new ArrayList<>()); Step step = builder.chunk(25).reader(reader).processor(processor).writer(writer).listener((ItemReadListener<String>) listener).build(); runStep(step); assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertEquals(0, processor.count); assertEquals(0, writer.results.size()); assertEquals(0, stepExecution.getProcessSkipCount()); assertEquals(0, stepExecution.getReadCount()); assertEquals(0, stepExecution.getReadSkipCount()); assertEquals(0, stepExecution.getSkipCount()); assertEquals(0, stepExecution.getWriteCount()); assertEquals(0, stepExecution.getFilterCount()); assertEquals(0, stepExecution.getWriteSkipCount()); }
@Test public void testNoInputNoListeners() throws Exception{ reader = new FailingListItemReader(new ArrayList<>()); Step step = builder.chunk(25).reader(reader).processor(processor).writer(writer).listener((ItemReadListener<String>) readListener).build(); runStep(step); assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertEquals(0, processor.count); assertEquals(0, writer.results.size()); assertEquals(0, stepExecution.getProcessSkipCount()); assertEquals(0, stepExecution.getReadCount()); assertEquals(0, stepExecution.getReadSkipCount()); assertEquals(0, stepExecution.getSkipCount()); assertEquals(0, stepExecution.getWriteCount()); assertEquals(0, stepExecution.getFilterCount()); assertEquals(0, stepExecution.getWriteSkipCount()); }
/** * Check items causing errors are skipped as expected. */ @Test public void testReadSkipWithPolicyExceptionInReader() throws Exception { // Should be ignored factory.setSkipLimit(0); factory.setSkipPolicy(new SkipPolicy() { @Override public boolean shouldSkip(Throwable t, int skipCount) throws SkipLimitExceededException { throw new RuntimeException("Planned exception in SkipPolicy"); } }); reader.setFailures("2"); Step step = factory.getObject(); step.execute(stepExecution); assertEquals(BatchStatus.FAILED, stepExecution.getStatus()); assertEquals(0, stepExecution.getReadSkipCount()); assertEquals(1, stepExecution.getReadCount()); }
@Test public void testApplyContribution() throws Exception { StepContribution contribution = execution.createStepContribution(); contribution.incrementReadSkipCount(); contribution.incrementWriteSkipCount(); contribution.incrementReadCount(); contribution.incrementWriteCount(7); contribution.incrementFilterCount(1); execution.apply(contribution); assertEquals(1, execution.getReadSkipCount()); assertEquals(1, execution.getWriteSkipCount()); assertEquals(1, execution.getReadCount()); assertEquals(7, execution.getWriteCount()); assertEquals(1, execution.getFilterCount()); }
@Test public void testSimpleScenarioNoListeners() throws Exception{ Step step = builder.chunk(25).reader(reader).processor(processor).writer(writer).build(); runStep(step); assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertEquals(0, stepExecution.getProcessSkipCount()); assertEquals(25, stepExecution.getReadCount()); assertEquals(0, stepExecution.getReadSkipCount()); assertEquals(0, stepExecution.getSkipCount()); assertEquals(25, stepExecution.getWriteCount()); assertEquals(0, stepExecution.getFilterCount()); assertEquals(0, stepExecution.getWriteSkipCount()); assertEquals(25, writer.results.size()); assertEquals(25, processor.count); int count = 0; for (String curItem : writer.results) { assertEquals("item " + count, curItem); count++; } }
@Test public void testSimpleScenarioNoListeners() throws Exception{ Step step = builder.chunk(25).reader(reader).processor(processor).writer(writer).build(); runStep(step); assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertEquals(0, stepExecution.getProcessSkipCount()); assertEquals(25, stepExecution.getReadCount()); assertEquals(0, stepExecution.getReadSkipCount()); assertEquals(0, stepExecution.getSkipCount()); assertEquals(25, stepExecution.getWriteCount()); assertEquals(0, stepExecution.getFilterCount()); assertEquals(0, stepExecution.getWriteSkipCount()); assertEquals(25, writer.results.size()); assertEquals(25, processor.count); int count = 0; for (String curItem : writer.results) { assertEquals("item " + count, curItem); count++; } }
private void assertStepExecutionsAreEqual(StepExecution expected, StepExecution actual) { assertEquals(expected.getId(), actual.getId()); assertEquals(expected.getStartTime(), actual.getStartTime()); assertEquals(expected.getEndTime(), actual.getEndTime()); assertEquals(expected.getSkipCount(), actual.getSkipCount()); assertEquals(expected.getCommitCount(), actual.getCommitCount()); assertEquals(expected.getReadCount(), actual.getReadCount()); assertEquals(expected.getWriteCount(), actual.getWriteCount()); assertEquals(expected.getFilterCount(), actual.getFilterCount()); assertEquals(expected.getWriteSkipCount(), actual.getWriteSkipCount()); assertEquals(expected.getReadSkipCount(), actual.getReadSkipCount()); assertEquals(expected.getProcessSkipCount(), actual.getProcessSkipCount()); assertEquals(expected.getRollbackCount(), actual.getRollbackCount()); assertEquals(expected.getExitStatus(), actual.getExitStatus()); assertEquals(expected.getLastUpdated(), actual.getLastUpdated()); assertEquals(expected.getExitStatus(), actual.getExitStatus()); assertEquals(expected.getJobExecutionId(), actual.getJobExecutionId()); }
private void assertStepExecutionsAreEqual(StepExecution expected, StepExecution actual) { assertEquals(expected.getId(), actual.getId()); assertEquals(expected.getStartTime(), actual.getStartTime()); assertEquals(expected.getEndTime(), actual.getEndTime()); assertEquals(expected.getSkipCount(), actual.getSkipCount()); assertEquals(expected.getCommitCount(), actual.getCommitCount()); assertEquals(expected.getReadCount(), actual.getReadCount()); assertEquals(expected.getWriteCount(), actual.getWriteCount()); assertEquals(expected.getFilterCount(), actual.getFilterCount()); assertEquals(expected.getWriteSkipCount(), actual.getWriteSkipCount()); assertEquals(expected.getReadSkipCount(), actual.getReadSkipCount()); assertEquals(expected.getProcessSkipCount(), actual.getProcessSkipCount()); assertEquals(expected.getRollbackCount(), actual.getRollbackCount()); assertEquals(expected.getExitStatus(), actual.getExitStatus()); assertEquals(expected.getLastUpdated(), actual.getLastUpdated()); assertEquals(expected.getExitStatus(), actual.getExitStatus()); assertEquals(expected.getJobExecutionId(), actual.getJobExecutionId()); } }
@Test public void testMultipleChunks() throws Exception{ Step step = builder.chunk(10).reader(reader).processor(processor).writer(writer).listener((ItemReadListener<String>) listener).build(); runStep(step); assertEquals(25, processor.count); assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertEquals(25, writer.results.size()); assertEquals(0, stepExecution.getProcessSkipCount()); assertEquals(25, stepExecution.getReadCount()); assertEquals(0, stepExecution.getReadSkipCount()); assertEquals(0, stepExecution.getSkipCount()); assertEquals(25, stepExecution.getWriteCount()); assertEquals(0, stepExecution.getFilterCount()); assertEquals(0, stepExecution.getWriteSkipCount()); assertEquals(25, listener.afterProcess); assertEquals(25, listener.afterRead); assertEquals(3, listener.afterWrite); assertEquals(25, listener.beforeProcess); assertEquals(26, listener.beforeRead); assertEquals(3, listener.beforeWriteCount); assertEquals(0, listener.onProcessError); assertEquals(0, listener.onReadError); assertEquals(0, listener.onWriteError); }
@Test public void testProcessorFilteringNoListeners() throws Exception{ processor.filter = true; Step step = builder.chunk(25).reader(reader).processor(processor).writer(writer).listener((ItemReadListener<String>) listener).build(); runStep(step); int count = 0; for (String curItem : writer.results) { assertEquals("item " + count, curItem); count += 2; } assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertEquals(0, stepExecution.getProcessSkipCount()); assertEquals(25, stepExecution.getReadCount()); assertEquals(0, stepExecution.getReadSkipCount()); assertEquals(0, stepExecution.getSkipCount()); assertEquals(13, stepExecution.getWriteCount()); assertEquals(12, stepExecution.getFilterCount()); assertEquals(0, stepExecution.getWriteSkipCount()); assertEquals(25, processor.count); }
@Test public void testProcessorFilteringNoListeners() throws Exception{ processor.filter = true; Step step = builder.chunk(25).reader(reader).processor(processor).writer(writer).listener((ItemReadListener<String>) readListener).build(); runStep(step); int count = 0; for (String curItem : writer.results) { assertEquals("item " + count, curItem); count += 2; } assertEquals(BatchStatus.COMPLETED, stepExecution.getStatus()); assertEquals(0, stepExecution.getProcessSkipCount()); assertEquals(25, stepExecution.getReadCount()); assertEquals(0, stepExecution.getReadSkipCount()); assertEquals(0, stepExecution.getSkipCount()); assertEquals(13, stepExecution.getWriteCount()); assertEquals(12, stepExecution.getFilterCount()); assertEquals(0, stepExecution.getWriteSkipCount()); assertEquals(25, processor.count); }