Use expireAfterWrite to perform throttle

This commit is contained in:
PunKeel 2016-05-14 23:37:12 +02:00 committed by md_5
parent d14b96d55e
commit d9a8311b8e
2 changed files with 7 additions and 10 deletions

View File

@ -8,25 +8,22 @@ import java.util.concurrent.TimeUnit;
public class ConnectionThrottle
{
private final int throttleTime;
private final Cache<InetAddress, Long> throttle;
private final Cache<InetAddress, Boolean> throttle;
public ConnectionThrottle(int throttleTime)
{
this.throttleTime = throttleTime;
this.throttle = CacheBuilder.newBuilder()
.concurrencyLevel( Runtime.getRuntime().availableProcessors() )
.initialCapacity( 100 )
.expireAfterAccess( throttleTime, TimeUnit.MILLISECONDS )
.expireAfterWrite( throttleTime, TimeUnit.MILLISECONDS )
.build();
}
public boolean throttle(InetAddress address)
{
Long value = throttle.getIfPresent( address );
long currentTime = System.currentTimeMillis();
boolean isThrottled = throttle.getIfPresent( address );
throttle.put( address, true );
throttle.put( address, currentTime );
return value != null && currentTime - value < throttleTime;
return isThrottled;
}
}

View File

@ -11,7 +11,7 @@ public class ThrottleTest
@Test
public void testThrottle() throws InterruptedException, UnknownHostException
{
ConnectionThrottle throttle = new ConnectionThrottle( 5 );
ConnectionThrottle throttle = new ConnectionThrottle( 10 );
InetAddress address;
try
@ -25,7 +25,7 @@ public class ThrottleTest
Assert.assertFalse( "Address should not be throttled", throttle.throttle( address ) );
Assert.assertTrue( "Address should be throttled", throttle.throttle( address ) );
Thread.sleep( 15 );
Thread.sleep( 50 );
Assert.assertFalse( "Address should not be throttled", throttle.throttle( address ) );
}
}