/* * Copyright 2009-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.batch.admin.jmx; import java.util.Collection; import java.util.Date; import org.springframework.batch.admin.domain.StepExecutionHistory; import org.springframework.batch.admin.service.JobService; import org.springframework.batch.core.StepExecution; import org.springframework.jmx.export.annotation.ManagedResource; @ManagedResource public class SimpleStepExecutionMetrics implements StepExecutionMetrics { private final JobService jobService; private final String stepName; private final String jobName; public SimpleStepExecutionMetrics(JobService jobService, String jobName, String stepName) { this.jobService = jobService; this.jobName = jobName; this.stepName = stepName; } public int getExecutionCount() { return jobService.countStepExecutionsForStep(jobName, stepName); } public int getFailureCount() { int count = 0; int start = 0; int pageSize = 100; Collection<StepExecution> stepExecutions; do { stepExecutions = jobService.listStepExecutionsForStep(jobName, stepName, start, pageSize); start += pageSize; for (StepExecution stepExecution : stepExecutions) { if (stepExecution.getStatus().isUnsuccessful()) { count++; } } } while (!stepExecutions.isEmpty()); return count; } public double getLatestDuration() { StepExecution stepExecution = getLatestStepExecution(stepName); if (stepExecution==null) { return 0; } Date endTime = stepExecution.getEndTime(); return (endTime != null ? endTime.getTime() : System.currentTimeMillis()) - stepExecution.getStartTime().getTime(); } public double getMeanDuration() { StepExecutionHistory history = computeHistory(stepName); return history.getDuration().getMean(); } public double getMaxDuration() { StepExecutionHistory history = computeHistory(stepName); return history.getDuration().getMax(); } public int getLatestReadCount() { StepExecution stepExecution = getLatestStepExecution(stepName); return stepExecution == null ? 0 : stepExecution.getReadCount(); } public int getLatestWriteCount() { StepExecution stepExecution = getLatestStepExecution(stepName); return stepExecution == null ? 0 : stepExecution.getWriteCount(); } public int getLatestFilterCount() { StepExecution stepExecution = getLatestStepExecution(stepName); return stepExecution == null ? 0 : stepExecution.getFilterCount(); } public int getLatestSkipCount() { StepExecution stepExecution = getLatestStepExecution(stepName); return stepExecution == null ? 0 : stepExecution.getSkipCount(); } public int getLatestCommitCount() { StepExecution stepExecution = getLatestStepExecution(stepName); return stepExecution == null ? 0 : stepExecution.getCommitCount(); } public int getLatestRollbackCount() { StepExecution stepExecution = getLatestStepExecution(stepName); return stepExecution == null ? 0 : stepExecution.getRollbackCount(); } public long getLatestExecutionId() { StepExecution stepExecution = getLatestStepExecution(stepName); return stepExecution == null ? -1 : stepExecution.getId(); } public String getLatestStatus() { StepExecution stepExecution = getLatestStepExecution(stepName); return stepExecution == null ? "NON" : stepExecution.getStatus().toString(); } public String getLatestExitCode() { StepExecution stepExecution = getLatestStepExecution(stepName); return stepExecution == null ? "NONE" : stepExecution.getExitStatus().getExitCode(); } public String getLatestExitDescription() { StepExecution stepExecution = getLatestStepExecution(stepName); return stepExecution == null ? "" : stepExecution.getExitStatus().getExitDescription(); } private StepExecutionHistory computeHistory(String stepName) { // Running average over last 10 executions... return computeHistory(stepName, 10); } private StepExecution getLatestStepExecution(String stepName) { // On the cautious side: grab the last 4 executions by ID and look for // the one that was last started... Collection<StepExecution> stepExecutions = jobService.listStepExecutionsForStep(jobName, stepName, 0, 4); if (stepExecutions.isEmpty()) { return null; } long lastUpdated = 0L; StepExecution result = null; for (StepExecution stepExecution : stepExecutions) { long updated = stepExecution.getStartTime().getTime(); if (updated > lastUpdated) { result = stepExecution; lastUpdated = updated; } } return result; } private StepExecutionHistory computeHistory(String stepName, int total) { StepExecutionHistory stepExecutionHistory = new StepExecutionHistory(stepName); for (StepExecution stepExecution : jobService.listStepExecutionsForStep(jobName, stepName, 0, total)) { stepExecutionHistory.append(stepExecution); } return stepExecutionHistory; } }