Feature - availablePermits method added to RSemaphore object. #2537

pull/2563/head
Nikita Koksharov 5 years ago
parent 6e8e0adb05
commit dd7c6c5c12

@ -256,4 +256,15 @@ public class RedissonRateLimiter extends RedissonObject implements RRateLimiter
return commandExecutor.readAsync(getName(), StringCodec.INSTANCE, HGETALL, getName());
}
@Override
public long availablePermits() {
return get(availablePermitsAsync());
}
@Override
public RFuture<Long> availablePermitsAsync() {
return commandExecutor.writeAsync(getName(), LongCodec.INSTANCE, RedisCommands.GET_LONG, getValueName());
}
}

@ -148,4 +148,11 @@ public interface RRateLimiter extends RRateLimiterAsync, RObject {
*/
RateLimiterConfig getConfig();
/**
* Returns amount of available permits.
*
* @return number of permits
*/
long availablePermits();
}

@ -150,4 +150,11 @@ public interface RRateLimiterAsync extends RObjectAsync {
*/
RFuture<RateLimiterConfig> getConfigAsync();
/**
* Returns amount of available permits.
*
* @return number of permits
*/
RFuture<Long> availablePermitsAsync();
}

@ -15,10 +15,10 @@
*/
package org.redisson.api;
import java.util.concurrent.TimeUnit;
import reactor.core.publisher.Mono;
import java.util.concurrent.TimeUnit;
/**
* Reactive interface for Redis based Rate Limiter object.
*
@ -145,4 +145,11 @@ public interface RRateLimiterReactive extends RObjectReactive {
*/
Mono<Boolean> tryAcquire(long permits, long timeout, TimeUnit unit);
/**
* Returns amount of available permits.
*
* @return number of permits
*/
Mono<Long> availablePermits();
}

@ -15,11 +15,11 @@
*/
package org.redisson.api;
import java.util.concurrent.TimeUnit;
import io.reactivex.Completable;
import io.reactivex.Single;
import java.util.concurrent.TimeUnit;
/**
* Reactive interface for Redis based Rate Limiter object.
*
@ -146,4 +146,11 @@ public interface RRateLimiterRx extends RObjectRx {
*/
Single<Boolean> tryAcquire(long permits, long timeout, TimeUnit unit);
/**
* Returns amount of available permits.
*
* @return number of permits
*/
Single<Long> availablePermits();
}

@ -41,14 +41,19 @@ public class RedissonRateLimiterTest extends BaseTest {
@Test
public void testZeroTimeout() throws InterruptedException {
RRateLimiter limiter = redisson.getRateLimiter("myLimiter");
assertThat(limiter.availablePermits()).isEqualTo(0);
limiter.trySetRate(RateType.OVERALL, 5, 1, RateIntervalUnit.SECONDS);
assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isTrue();
assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isTrue();
assertThat(limiter.availablePermits()).isEqualTo(3);
assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isTrue();
assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isTrue();
assertThat(limiter.availablePermits()).isEqualTo(1);
assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isTrue();
assertThat(limiter.availablePermits()).isEqualTo(0);
assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isFalse();
assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isFalse();
assertThat(limiter.tryAcquire(1, 0, TimeUnit.SECONDS)).isFalse();

Loading…
Cancel
Save