/*
* Copyright (c) 2008-2017, Hazelcast, Inc. All Rights Reserved.
*
* 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 com.hazelcast.scheduledexecutor.impl;
import com.hazelcast.nio.ObjectDataInput;
import com.hazelcast.nio.ObjectDataOutput;
import com.hazelcast.scheduledexecutor.ScheduledTaskStatistics;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class ScheduledTaskStatisticsImpl
implements ScheduledTaskStatistics, TaskLifecycleListener {
private static final TimeUnit MEASUREMENT_UNIT = TimeUnit.NANOSECONDS;
private long runs;
private long createdAt;
private long firstRunStart;
private long lastRunStart;
private long lastRunEnd;
private long lastIdleTime;
private long totalRunTime;
private long totalIdleTime;
public ScheduledTaskStatisticsImpl() {
}
public ScheduledTaskStatisticsImpl(ScheduledTaskStatisticsImpl copy) {
this(copy.createdAt, copy.getTotalRuns(), copy.firstRunStart, copy.lastRunStart,
copy.lastRunEnd, copy.getLastIdleTime(MEASUREMENT_UNIT), copy.getTotalRunTime(MEASUREMENT_UNIT),
copy.getTotalIdleTime(MEASUREMENT_UNIT));
}
public ScheduledTaskStatisticsImpl(long runs, long lastIdleTimeNanos, long totalRunTimeNanos,
long totalIdleTimeNanos) {
this.runs = runs;
this.lastIdleTime = lastIdleTimeNanos;
this.totalRunTime = totalRunTimeNanos;
this.totalIdleTime = totalIdleTimeNanos;
}
ScheduledTaskStatisticsImpl(long createdAt, long runs, long firstRunStartNanos, long lastRunStartNanos,
long lastRunEndNanos, long lastIdleTimeNanos, long totalRunTimeNanos,
long totalIdleTimeNanos) {
this.createdAt = createdAt;
this.runs = runs;
this.firstRunStart = firstRunStartNanos;
this.lastRunStart = lastRunStartNanos;
this.lastRunEnd = lastRunEndNanos;
this.lastIdleTime = lastIdleTimeNanos;
this.totalRunTime = totalRunTimeNanos;
this.totalIdleTime = totalIdleTimeNanos;
}
@Override
public long getTotalRuns() {
return runs;
}
@Override
public long getLastRunDuration(TimeUnit unit) {
long duration = lastRunEnd - lastRunStart;
return unit.convert(duration, MEASUREMENT_UNIT);
}
@Override
public long getLastIdleTime(TimeUnit unit) {
return unit.convert(lastIdleTime, MEASUREMENT_UNIT);
}
@Override
public long getTotalIdleTime(TimeUnit unit) {
return unit.convert(totalIdleTime, MEASUREMENT_UNIT);
}
@Override
public long getTotalRunTime(TimeUnit unit) {
return unit.convert(totalRunTime, MEASUREMENT_UNIT);
}
@Override
public int getFactoryId() {
return ScheduledExecutorDataSerializerHook.F_ID;
}
@Override
public int getId() {
return ScheduledExecutorDataSerializerHook.TASK_STATS;
}
@Override
public void writeData(ObjectDataOutput out)
throws IOException {
out.writeLong(runs);
out.writeLong(lastIdleTime);
out.writeLong(totalIdleTime);
out.writeLong(totalRunTime);
}
@Override
public void readData(ObjectDataInput in)
throws IOException {
runs = in.readLong();
lastIdleTime = in.readLong();
totalIdleTime = in.readLong();
totalRunTime = in.readLong();
}
@Override
public void onInit() {
this.createdAt = System.nanoTime();
}
@Override
public void onBeforeRun() {
long now = System.nanoTime();
this.lastRunStart = now;
this.lastIdleTime = now - (lastRunEnd != 0L ? lastRunEnd : createdAt);
this.totalIdleTime += lastIdleTime;
if (this.firstRunStart == 0L) {
this.firstRunStart = this.lastRunStart;
}
}
@Override
public void onAfterRun() {
long now = System.nanoTime();
long lastRunTime = now - lastRunStart;
this.lastRunEnd = now;
this.runs++;
this.totalRunTime += lastRunTime;
}
public ScheduledTaskStatisticsImpl snapshot() {
return new ScheduledTaskStatisticsImpl(this);
}
@Override
public String toString() {
return "ScheduledTaskStatisticsImpl{ runs=" + runs + ", createdAt="
+ createdAt + ", firstRunStart=" + firstRunStart + ", lastRunStart=" + lastRunStart + ", lastRunEnd=" + lastRunEnd
+ ", lastIdleTime=" + lastIdleTime + ", totalRunTime=" + totalRunTime + ", totalIdleTime=" + totalIdleTime + '}';
}
}