Feature - availablePermits method added to RSemaphore object. #2537

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

@ -255,5 +255,16 @@ public class RedissonRateLimiter extends RedissonObject implements RRateLimiter
public RFuture<RateLimiterConfig> getConfigAsync() { public RFuture<RateLimiterConfig> getConfigAsync() {
return commandExecutor.readAsync(getName(), StringCodec.INSTANCE, HGETALL, getName()); 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());
}
} }

@ -147,5 +147,12 @@ public interface RRateLimiter extends RRateLimiterAsync, RObject {
* @return config object * @return config object
*/ */
RateLimiterConfig getConfig(); RateLimiterConfig getConfig();
/**
* Returns amount of available permits.
*
* @return number of permits
*/
long availablePermits();
} }

@ -149,5 +149,12 @@ public interface RRateLimiterAsync extends RObjectAsync {
* @return config object * @return config object
*/ */
RFuture<RateLimiterConfig> getConfigAsync(); RFuture<RateLimiterConfig> getConfigAsync();
/**
* Returns amount of available permits.
*
* @return number of permits
*/
RFuture<Long> availablePermitsAsync();
} }

@ -15,10 +15,10 @@
*/ */
package org.redisson.api; package org.redisson.api;
import java.util.concurrent.TimeUnit;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import java.util.concurrent.TimeUnit;
/** /**
* Reactive interface for Redis based Rate Limiter object. * Reactive interface for Redis based Rate Limiter object.
* *
@ -144,5 +144,12 @@ public interface RRateLimiterReactive extends RObjectReactive {
* if the waiting time elapsed before a permit was acquired * if the waiting time elapsed before a permit was acquired
*/ */
Mono<Boolean> tryAcquire(long permits, long timeout, TimeUnit unit); 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; package org.redisson.api;
import java.util.concurrent.TimeUnit;
import io.reactivex.Completable; import io.reactivex.Completable;
import io.reactivex.Single; import io.reactivex.Single;
import java.util.concurrent.TimeUnit;
/** /**
* Reactive interface for Redis based Rate Limiter object. * Reactive interface for Redis based Rate Limiter object.
* *
@ -145,5 +145,12 @@ public interface RRateLimiterRx extends RObjectRx {
* if the waiting time elapsed before a permit was acquired * if the waiting time elapsed before a permit was acquired
*/ */
Single<Boolean> tryAcquire(long permits, long timeout, TimeUnit unit); 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 @Test
public void testZeroTimeout() throws InterruptedException { public void testZeroTimeout() throws InterruptedException {
RRateLimiter limiter = redisson.getRateLimiter("myLimiter"); RRateLimiter limiter = redisson.getRateLimiter("myLimiter");
assertThat(limiter.availablePermits()).isEqualTo(0);
limiter.trySetRate(RateType.OVERALL, 5, 1, RateIntervalUnit.SECONDS); 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.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.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.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(); 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