@Override public RSemaphoreRx getSemaphore(String name) { return RxProxyBuilder.create(commandExecutor, new RedissonSemaphore(commandExecutor, name, semaphorePubSub), RSemaphoreRx.class); }
@Override public void acquire() throws InterruptedException { acquire(1); }
@Override public RFuture<Void> acquireAsync() { return acquireAsync(1); }
@Override public boolean tryAcquire(int permits) { return get(tryAcquireAsync(permits)); }
@Override public boolean trySetPermits(int permits) { return get(trySetPermitsAsync(permits)); }
@Override public void release(int permits) { get(releaseAsync(permits)); }
@Override public void acquire(int permits) throws InterruptedException { if (tryAcquire(permits)) { return; } RFuture<RedissonLockEntry> future = subscribe(); commandExecutor.syncSubscription(future); try { while (true) { if (tryAcquire(permits)) { return; } getEntry().getLatch().acquire(permits); } } finally { unsubscribe(future); } // get(acquireAsync(permits)); }
String getChannelName() { return getChannelName(getName()); }
public RFuture<Boolean> trySetCapacityAsync(int capacity) { String channelName = RedissonSemaphore.getChannelName(getSemaphoreName()); return commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN, "local value = redis.call('get', KEYS[1]); " + "if (value == false) then " + "redis.call('set', KEYS[1], ARGV[1]); " + "redis.call('publish', KEYS[2], ARGV[1]); " + "return 1;" + "end;" + "return 0;", Arrays.<Object>asList(getSemaphoreName(), channelName), capacity); }
@Override public void reducePermits(int permits) { get(reducePermitsAsync(permits)); }
private RedissonLockEntry getEntry() { return semaphorePubSub.getEntry(getName()); }
@Override public void release() { release(1); }
@Override public void acquire(int permits) throws InterruptedException { if (tryAcquire(permits)) { return; } RFuture<RedissonLockEntry> future = subscribe(); commandExecutor.syncSubscription(future); try { while (true) { if (tryAcquire(permits)) { return; } getEntry().getLatch().acquire(permits); } } finally { unsubscribe(future); } // get(acquireAsync(permits)); }
String getChannelName() { return getChannelName(getName()); }
public RFuture<Boolean> trySetCapacityAsync(int capacity) { String channelName = RedissonSemaphore.getChannelName(getSemaphoreName()); return commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN, "local value = redis.call('get', KEYS[1]); " + "if (value == false) then " + "redis.call('set', KEYS[1], ARGV[1]); " + "redis.call('publish', KEYS[2], ARGV[1]); " + "return 1;" + "end;" + "return 0;", Arrays.<Object>asList(getSemaphoreName(), channelName), capacity); }
@Override public boolean tryAcquire(int permits) { return get(tryAcquireAsync(permits)); }
@Override public boolean trySetPermits(int permits) { return get(trySetPermitsAsync(permits)); }
@Override public void release(int permits) { get(releaseAsync(permits)); }