TimeWaitLogger { public void logWithRunnable(Runnable runnable) { long currentTimeMillis = System.currentTimeMillis(); if (disabled) { runnable.run(); } else if (currentTimeMillis > lastLogTime + waitTime) { lastLogTime = currentTimeMillis; runnable.run(); } } TimeWaitLogger(long waitTimeMills); void logWithRunnable(Runnable runnable); void logWithConsumer(Consumer<T> consumer, T t); void logWithBiConsume(BiConsumer<T, R> biConsumer, T r, R executor);  }
@Test public void testTimeWait() throws InterruptedException { TimeWaitLogger timeWaitLogger = new TimeWaitLogger(1000); AtomicLong atomicLong = new AtomicLong(); new Thread(()->{ while (true){ timeWaitLogger.logWithRunnable(atomicLong::incrementAndGet); } }).start(); Thread.sleep(1500); Assert.assertEquals(2L,atomicLong.get()); }
@Test public void testDisable() throws InterruptedException { System.setProperty(RpcOptions.DISABLE_LOG_TIME_WAIT_CONF,"true"); try{ TimeWaitLogger timeWaitLogger = new TimeWaitLogger(1000); AtomicLong atomicLong = new AtomicLong(); new Thread(()->{ while (true){ timeWaitLogger.logWithRunnable(atomicLong::incrementAndGet); } }).start(); Thread.sleep(1500); Assert.assertTrue(atomicLong.get()>1000); }finally { System.setProperty(RpcOptions.DISABLE_LOG_TIME_WAIT_CONF,""); } TimeWaitLogger timeWaitLogger = new TimeWaitLogger(1000); AtomicLong atomicLong = new AtomicLong(); new Thread(()->{ while (true){ timeWaitLogger.logWithRunnable(atomicLong::incrementAndGet); } }).start(); Thread.sleep(1500); Assert.assertEquals(2L,atomicLong.get()); }