admin.jmx.SimpleStepExecutionMetrics.java Source code

Java tutorial

Introduction

Here is the source code for admin.jmx.SimpleStepExecutionMetrics.java

Source

/*
 * 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 admin.jmx;

import java.util.Collection;
import java.util.Date;

import admin.history.StepExecutionHistory;
import admin.service.JobService;
import org.springframework.batch.core.StepExecution;
import org.springframework.jmx.export.annotation.ManagedResource;

/**
 * @author Thiago Freitas
 *
 */
@ManagedResource
public class SimpleStepExecutionMetrics implements StepExecutionMetrics {

    private final JobService jobService;

    private final String stepName;

    private final String jobName;

    /**
     * @param jobService
     * @param jobName
     * @param stepName
     */
    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;
    }

}