| 5 | |
| 6 | |
| 7 | public final class Ticker { |
| 8 | private final Log log = LogFactory.getLog(Ticker.class); |
| 9 | private final String logString; |
| 10 | private final long checkIntervalMillis = 200L; |
| 11 | private final long reportIntervalMillis = 60000L; |
| 12 | private long startTimeMillis; |
| 13 | private long nTicks; |
| 14 | private long nextCheckTick; |
| 15 | private long nextReportTimeMillis; |
| 16 | |
| 17 | public Ticker(String logString) { |
| 18 | this.logString = logString; |
| 19 | start(); |
| 20 | } |
| 21 | |
| 22 | public void start() { |
| 23 | startTimeMillis = System.currentTimeMillis(); |
| 24 | nTicks = 0; |
| 25 | nextCheckTick = 0; |
| 26 | nextReportTimeMillis = startTimeMillis - (startTimeMillis%reportIntervalMillis) + reportIntervalMillis; |
| 27 | if(nextReportTimeMillis-startTimeMillis<reportIntervalMillis/2) { |
| 28 | nextReportTimeMillis += reportIntervalMillis; |
| 29 | } |
| 30 | } |
| 31 | |
| 32 | public void tick() { |
| 33 | ++nTicks; |
| 34 | if(nTicks>=nextCheckTick) { |
| 35 | final long nowMillis = System.currentTimeMillis(); |
| 36 | final double ticksPerMilli = nTicks/(double)Math.max(1L,nowMillis-startTimeMillis); |
| 37 | final long ticksUntilCheck = Math.max(1L,(long)Math.ceil(checkIntervalMillis*ticksPerMilli)); |
| 38 | nextCheckTick = nTicks + ticksUntilCheck; |
| 39 | if(nowMillis>=nextReportTimeMillis) { |
| 40 | // report |
| 41 | log.info(logString + " tick: " + nTicks + ", " + ticksPerMilli + " ticks/milli"); |
| 42 | // set next report time |
| 43 | nextReportTimeMillis += reportIntervalMillis*(1+(nowMillis-nextReportTimeMillis)/reportIntervalMillis); |
| 44 | } |
| 45 | } |
| 46 | } |
| 47 | } |
nothing calls this directly
no outgoing calls
no test coverage detected