| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.apache.sling.event.impl.jobs.stats; |
| |
| import org.apache.sling.event.jobs.Statistics; |
| |
| /** |
| * Implementation of the statistics. |
| */ |
| public class StatisticsImpl implements Statistics { |
| |
| private volatile long startTime; |
| |
| private volatile long activeJobs; |
| |
| private volatile long queuedJobs; |
| |
| private volatile long lastActivated = -1; |
| |
| private volatile long lastFinished = -1; |
| |
| private volatile long averageWaitingTime; |
| |
| private volatile long averageProcessingTime; |
| |
| private volatile long waitingTime; |
| |
| private volatile long processingTime; |
| |
| private volatile long waitingCount; |
| |
| private volatile long processingCount; |
| |
| private volatile long finishedJobs; |
| |
| private volatile long failedJobs; |
| |
| private volatile long cancelledJobs; |
| |
| public StatisticsImpl() { |
| this(System.currentTimeMillis()); |
| } |
| |
| public StatisticsImpl(final long startTime) { |
| this.startTime = startTime; |
| } |
| |
| /** |
| * @see org.apache.sling.event.jobs.Statistics#getStartTime() |
| */ |
| @Override |
| public synchronized long getStartTime() { |
| return startTime; |
| } |
| |
| /** |
| * @see org.apache.sling.event.jobs.Statistics#getNumberOfProcessedJobs() |
| */ |
| @Override |
| public synchronized long getNumberOfProcessedJobs() { |
| return getNumberOfCancelledJobs() + getNumberOfFailedJobs() + getNumberOfFinishedJobs(); |
| } |
| |
| /** |
| * @see org.apache.sling.event.jobs.Statistics#getNumberOfActiveJobs() |
| */ |
| @Override |
| public synchronized long getNumberOfActiveJobs() { |
| return activeJobs; |
| } |
| |
| /** |
| * @see org.apache.sling.event.jobs.Statistics#getNumberOfQueuedJobs() |
| */ |
| @Override |
| public synchronized long getNumberOfQueuedJobs() { |
| return queuedJobs; |
| } |
| |
| /** |
| * @see org.apache.sling.event.jobs.Statistics#getNumberOfJobs() |
| */ |
| @Override |
| public synchronized long getNumberOfJobs() { |
| return activeJobs + queuedJobs; |
| } |
| |
| /** |
| * @see org.apache.sling.event.jobs.Statistics#getAverageWaitingTime() |
| */ |
| @Override |
| public synchronized long getAverageWaitingTime() { |
| return averageWaitingTime; |
| } |
| |
| /** |
| * @see org.apache.sling.event.jobs.Statistics#getAverageProcessingTime() |
| */ |
| @Override |
| public synchronized long getAverageProcessingTime() { |
| return averageProcessingTime; |
| } |
| |
| /** |
| * @see org.apache.sling.event.jobs.Statistics#getNumberOfFinishedJobs() |
| */ |
| @Override |
| public synchronized long getNumberOfFinishedJobs() { |
| return finishedJobs; |
| } |
| |
| /** |
| * @see org.apache.sling.event.jobs.Statistics#getNumberOfCancelledJobs() |
| */ |
| @Override |
| public synchronized long getNumberOfCancelledJobs() { |
| return cancelledJobs; |
| } |
| |
| /** |
| * @see org.apache.sling.event.jobs.Statistics#getNumberOfFailedJobs() |
| */ |
| @Override |
| public synchronized long getNumberOfFailedJobs() { |
| return failedJobs; |
| } |
| |
| /** |
| * @see org.apache.sling.event.jobs.Statistics#getLastActivatedJobTime() |
| */ |
| @Override |
| public synchronized long getLastActivatedJobTime() { |
| return this.lastActivated; |
| } |
| |
| /** |
| * @see org.apache.sling.event.jobs.Statistics#getLastFinishedJobTime() |
| */ |
| @Override |
| public synchronized long getLastFinishedJobTime() { |
| return this.lastFinished; |
| } |
| |
| /** |
| * Add a finished job |
| * @param jobTime The processing time for this job. |
| */ |
| public synchronized void finishedJob(final long jobTime) { |
| this.lastFinished = System.currentTimeMillis(); |
| this.processingTime += jobTime; |
| this.processingCount++; |
| this.averageProcessingTime = this.processingTime / this.processingCount; |
| this.finishedJobs++; |
| this.activeJobs--; |
| } |
| |
| /** |
| * Add a failed job. |
| */ |
| public synchronized void failedJob() { |
| this.failedJobs++; |
| this.activeJobs--; |
| } |
| |
| /** |
| * Add a cancelled job. |
| */ |
| public synchronized void cancelledJob() { |
| this.cancelledJobs++; |
| this.activeJobs--; |
| } |
| |
| /** |
| * New job in the queue |
| */ |
| public synchronized void incQueued() { |
| this.queuedJobs++; |
| } |
| |
| /** |
| * Job not processed by us |
| */ |
| public synchronized void decQueued() { |
| this.queuedJobs--; |
| } |
| |
| /** |
| * Clear all queued |
| */ |
| public synchronized void clearQueued() { |
| this.queuedJobs = 0; |
| } |
| |
| /** |
| * Add a job from the queue to status active |
| * @param queueTime The time the job stayed in the queue. |
| */ |
| public synchronized void addActive(final long queueTime) { |
| this.queuedJobs--; |
| this.activeJobs++; |
| this.waitingCount++; |
| this.waitingTime += queueTime; |
| this.averageWaitingTime = this.waitingTime / this.waitingCount; |
| this.lastActivated = System.currentTimeMillis(); |
| } |
| |
| /** |
| * Add another statistics information. |
| */ |
| public synchronized void add(final StatisticsImpl other) { |
| synchronized ( other ) { |
| if ( other.lastActivated > this.lastActivated ) { |
| this.lastActivated = other.lastActivated; |
| } |
| if ( other.lastFinished > this.lastFinished ) { |
| this.lastFinished = other.lastFinished; |
| } |
| this.queuedJobs += other.queuedJobs; |
| this.waitingTime += other.waitingTime; |
| this.waitingCount += other.waitingCount; |
| if ( this.waitingCount > 0 ) { |
| this.averageWaitingTime = this.waitingTime / this.waitingCount; |
| } |
| this.processingTime += other.processingTime; |
| this.processingCount += other.processingCount; |
| if ( this.processingCount > 0 ) { |
| this.averageProcessingTime = this.processingTime / this.processingCount; |
| } |
| this.finishedJobs += other.finishedJobs; |
| this.failedJobs += other.failedJobs; |
| this.cancelledJobs += other.cancelledJobs; |
| this.activeJobs += other.activeJobs; |
| } |
| } |
| |
| /** |
| * Create a new statistics object with exactly the same values. |
| */ |
| public void copyFrom(final StatisticsImpl other) { |
| final long localQueuedJobs; |
| final long localLastActivated; |
| final long localLastFinished; |
| final long localAverageWaitingTime; |
| final long localAverageProcessingTime; |
| final long localWaitingTime; |
| final long localProcessingTime; |
| final long localWaitingCount; |
| final long localProcessingCount; |
| final long localFinishedJobs; |
| final long localFailedJobs; |
| final long localCancelledJobs; |
| final long localActiveJobs; |
| synchronized ( other ) { |
| localQueuedJobs = other.queuedJobs; |
| localLastActivated = other.lastActivated; |
| localLastFinished = other.lastFinished; |
| localAverageWaitingTime = other.averageWaitingTime; |
| localAverageProcessingTime = other.averageProcessingTime; |
| localWaitingTime = other.waitingTime; |
| localProcessingTime = other.processingTime; |
| localWaitingCount = other.waitingCount; |
| localProcessingCount = other.processingCount; |
| localFinishedJobs = other.finishedJobs; |
| localFailedJobs = other.failedJobs; |
| localCancelledJobs = other.cancelledJobs; |
| localActiveJobs = other.activeJobs; |
| } |
| synchronized ( this ) { |
| this.queuedJobs = localQueuedJobs; |
| this.lastActivated = localLastActivated; |
| this.lastFinished = localLastFinished; |
| this.averageWaitingTime = localAverageWaitingTime; |
| this.averageProcessingTime = localAverageProcessingTime; |
| this.waitingTime = localWaitingTime; |
| this.processingTime = localProcessingTime; |
| this.waitingCount = localWaitingCount; |
| this.processingCount = localProcessingCount; |
| this.finishedJobs = localFinishedJobs; |
| this.failedJobs = localFailedJobs; |
| this.cancelledJobs = localCancelledJobs; |
| this.activeJobs = localActiveJobs; |
| } |
| } |
| |
| /** |
| * @see org.apache.sling.event.jobs.Statistics#reset() |
| */ |
| @Override |
| public synchronized void reset() { |
| this.startTime = System.currentTimeMillis(); |
| this.lastActivated = -1; |
| this.lastFinished = -1; |
| this.averageWaitingTime = 0; |
| this.averageProcessingTime = 0; |
| this.waitingTime = 0; |
| this.processingTime = 0; |
| this.waitingCount = 0; |
| this.processingCount = 0; |
| this.finishedJobs = 0; |
| this.failedJobs = 0; |
| this.cancelledJobs = 0; |
| } |
| } |