package com.guavatest.utilites;
import com.google.common.util.concurrent.RateLimiter;
import org.junit.Test;
import java.time.ZonedDateTime;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;
public class RatelimitTest {/**
* base on abstraction
* only focus on use
*//**
* 参考自:
* https://www.baeldung.com/guava-rate-limiter
*
* https://guava.dev/releases/snapshot-jre/api/docs/com/google/common/util/concurrent/RateLimiter.html
*
*/@Test
public void test4(){
RateLimiter rateLimiter = RateLimiter.create(2);
final boolean b = rateLimiter.tryAcquire();
doSomeLimitedOperation();
try {
Thread.sleep(499);
} catch (InterruptedException e) {
e.printStackTrace();
}
final boolean b1 = rateLimiter.tryAcquire();
doSomeLimitedOperation();
final boolean b2 = rateLimiter.tryAcquire();
doSomeLimitedOperation();
System.out.println(b);
System.out.println(b1);
System.out.println(b2);
rateLimiter.setRate(10);
final double rate = rateLimiter.getRate();
System.out.println(rate);
doSomeLimitedOperation();
final boolean b3 = rateLimiter.tryAcquire(9);
doSomeLimitedOperation();
final boolean b4 = rateLimiter.tryAcquire();
doSomeLimitedOperation();
final boolean b5 = rateLimiter.tryAcquire();
doSomeLimitedOperation();
System.out.println(b3);
System.out.println(b4);
System.out.println(b5);
}@Test
public void test(){
RateLimiter rateLimiter = RateLimiter.create(2);
long startTime = ZonedDateTime.now().getSecond();
rateLimiter.acquire(1);
doSomeLimitedOperation();
final boolean b = rateLimiter.tryAcquire();
System.out.println(b);
final double acquire = rateLimiter.acquire(1);
System.out.println(acquire);
doSomeLimitedOperation();
long elapsedTimeSeconds = ZonedDateTime.now().getSecond() - startTime;
System.out.println(elapsedTimeSeconds);
}@Test
public void givenLimitedResource_whenRequestOnce_thenShouldPermitWithoutBlocking() {
// given
RateLimiter rateLimiter = RateLimiter.create(100);
// when
long startTime = ZonedDateTime.now().getSecond();
//rateLimiter.acquire(100);
rateLimiter.acquire(200);
doSomeLimitedOperation();
long elapsedTimeSeconds = ZonedDateTime.now().getSecond() - startTime;
// then
//assertThat(elapsedTimeSeconds <= 1);
System.out.println(elapsedTimeSeconds);
}@Test
public void givenLimitedResource_whenUseRateLimiter_thenShouldLimitPermits() {
// given
RateLimiter rateLimiter = RateLimiter.create(100);
// when
long startTime = ZonedDateTime.now().getSecond();
IntStream.range(0, 1000).forEach(i -> {
rateLimiter.acquire();
doSomeLimitedOperation();
});
long elapsedTimeSeconds = ZonedDateTime.now().getSecond() - startTime;
// then
//assertThat(elapsedTimeSeconds >= 10);
System.out.println(elapsedTimeSeconds);
}@Test
public void givenLimitedResource_whenTryAcquire_shouldNotBlockIndefinitely() {
// given
RateLimiter rateLimiter = RateLimiter.create(1);
// when
rateLimiter.acquire();
boolean result = rateLimiter.tryAcquire(2, 10, TimeUnit.MILLISECONDS);
// then
//assertThat(result).isFalse();
System.out.println(result);
}private void doSomeLimitedOperation() {
}}
【java|guava ratelimit】
推荐阅读
- scheme|scheme中define和set
- lua|macos 安装lua
- java|multipart/form-data中boundary的作用
- java|java8 stream collect方法
- scheme|monad 例子
- java|springcloud-alibaba springSecurity整合oauth2 授权码模式
- flowable工作流技术学习
- JAVA|Spring boot 提示“Whitelabel Error Page”
- Spring|Spring Boot整合dubbo+Nacos实战(二)