package com.nexr.platform.search.util; import com.nexr.platform.search.consumer.DataConsumer; import com.nexr.platform.search.provider.DataProvider; import java.io.*; import java.util.TimerTask; public class TimerClass extends TimerTask { private final DataProvider _provider; private final DataConsumer _consumer; private PrintWriter _printWriter; // private volatile double _produceAvg = 0.0d; private volatile double _consumeAvg = 0.0d; private volatile long _produceTotalCount = 0L; private volatile long _consumeTotalCount = 0L; private volatile long _minProduceTpsCount = 0L; private volatile long _minConsumeTpsCount = 0L; private volatile long _maxProduceTpsCount = 0L; private volatile long _maxConsumeTpsCount = 0L; private volatile long _currentProduceTpsCount = 0L; private volatile long _currentConsumeTpsCount = 0L; private final int _secondRate = 1000; private final long _startTime; private long _lastTime; public TimerClass(DataProvider provider, DataConsumer indexer, String logFilePath) throws IOException { _provider = provider; _consumer = indexer; _startTime = System.currentTimeMillis(); _lastTime = _startTime; File file = new File(logFilePath); File dir = new File(logFilePath.substring(0, logFilePath.lastIndexOf("/"))); if(!dir.isDirectory()) dir.mkdirs(); if(file.exists()) file.delete(); file.createNewFile(); BufferedWriter buffWriter = new BufferedWriter(new FileWriter(file, true)); _printWriter = new PrintWriter(buffWriter,true); } @Override public void run() { long currentTime = System.currentTimeMillis(); long currentElapsedTime = currentTime - _lastTime; if(currentElapsedTime <= 0) return; long totalElapsedTime = currentTime - _startTime; _currentProduceTpsCount = 0L; _currentConsumeTpsCount = 0L; long consumeTotalCount = 0L; consumeTotalCount += _consumer.getConsumeCount(); long produceTotalCount = _provider.getProduceCount(); _currentProduceTpsCount = ( ( produceTotalCount - _produceTotalCount ) * _secondRate / currentElapsedTime ); _currentConsumeTpsCount = ( ( consumeTotalCount - _consumeTotalCount ) * _secondRate / currentElapsedTime ); _produceTotalCount = produceTotalCount; _consumeTotalCount = consumeTotalCount; this.setAvgTps(totalElapsedTime); this.setMinMaxTps(); this.print(totalElapsedTime); _lastTime = currentTime; } private void setMinMaxTps(){ _maxProduceTpsCount = Math.max(_maxProduceTpsCount, _currentProduceTpsCount); _maxConsumeTpsCount = Math.max(_maxConsumeTpsCount, _currentConsumeTpsCount); if(_minProduceTpsCount == 0) _minProduceTpsCount = _currentProduceTpsCount; else _minProduceTpsCount = Math.min(_minProduceTpsCount, _currentProduceTpsCount); if(_minConsumeTpsCount == 0) _minConsumeTpsCount = _currentConsumeTpsCount; else _minConsumeTpsCount = Math.min(_minConsumeTpsCount, _currentConsumeTpsCount); } private void setAvgTps(long totalElapsedTime){ // _produceAvg = ( _produceTotalCount * _secondRate / totalElapsedTime ) ; _consumeAvg = ( _consumeTotalCount * _secondRate / totalElapsedTime ) ; } private void print(long totalElapsedTime){ StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(totalElapsedTime).append("\t"); stringBuilder.append(_consumeTotalCount).append("\t"); stringBuilder.append(_currentConsumeTpsCount).append("\t"); stringBuilder.append(_consumeAvg).append("\t"); stringBuilder.append(_minConsumeTpsCount).append("\t"); stringBuilder.append(_maxConsumeTpsCount).append("\t"); _printWriter.println(stringBuilder.toString()); // System.out.println(stringBuilder.toString()); } }