List of usage examples for io.netty.util.concurrent Future getNow
V getNow();
From source file:org.redisson.RedissonPermitExpirableSemaphore.java
License:Apache License
private void tryAcquireAsync(final AtomicLong time, final int permits, final RFuture<RedissonLockEntry> subscribeFuture, final RPromise<String> result, final long ttl, final TimeUnit timeUnit) { if (result.isDone()) { unsubscribe(subscribeFuture);/*from ww w. j av a 2s . c o m*/ return; } if (time.get() <= 0) { unsubscribe(subscribeFuture); result.trySuccess(null); return; } long timeoutDate = calcTimeout(ttl, timeUnit); final long current = System.currentTimeMillis(); RFuture<String> tryAcquireFuture = tryAcquireAsync(permits, timeoutDate); tryAcquireFuture.addListener(new FutureListener<String>() { @Override public void operationComplete(Future<String> future) throws Exception { if (!future.isSuccess()) { unsubscribe(subscribeFuture); result.tryFailure(future.cause()); return; } final Long nearestTimeout; String permitId = future.getNow(); if (permitId != null) { if (!permitId.startsWith(":")) { unsubscribe(subscribeFuture); if (!result.trySuccess(permitId)) { releaseAsync(permitId); } return; } else { nearestTimeout = Long.valueOf(permitId.substring(1)) - System.currentTimeMillis(); } } else { nearestTimeout = null; } long elapsed = System.currentTimeMillis() - current; time.addAndGet(-elapsed); if (time.get() <= 0) { unsubscribe(subscribeFuture); result.trySuccess(null); return; } // waiting for message final long current = System.currentTimeMillis(); final RedissonLockEntry entry = getEntry(); synchronized (entry) { if (entry.getLatch().tryAcquire()) { tryAcquireAsync(time, permits, subscribeFuture, result, ttl, timeUnit); } else { final AtomicReference<Timeout> waitTimeoutFutureRef = new AtomicReference<Timeout>(); final Timeout scheduledFuture; if (nearestTimeout != null) { scheduledFuture = commandExecutor.getConnectionManager().newTimeout(new TimerTask() { @Override public void run(Timeout timeout) throws Exception { if (waitTimeoutFutureRef.get() != null && !waitTimeoutFutureRef.get().cancel()) { return; } long elapsed = System.currentTimeMillis() - current; time.addAndGet(-elapsed); tryAcquireAsync(time, permits, subscribeFuture, result, ttl, timeUnit); } }, nearestTimeout, TimeUnit.MILLISECONDS); } else { scheduledFuture = null; } final Runnable listener = new Runnable() { @Override public void run() { if (waitTimeoutFutureRef.get() != null && !waitTimeoutFutureRef.get().cancel()) { entry.getLatch().release(); return; } if (scheduledFuture != null && !scheduledFuture.cancel()) { entry.getLatch().release(); return; } long elapsed = System.currentTimeMillis() - current; time.addAndGet(-elapsed); tryAcquireAsync(time, permits, subscribeFuture, result, ttl, timeUnit); } }; entry.addListener(listener); long t = time.get(); Timeout waitTimeoutFuture = commandExecutor.getConnectionManager() .newTimeout(new TimerTask() { @Override public void run(Timeout timeout) throws Exception { if (scheduledFuture != null && !scheduledFuture.cancel()) { return; } synchronized (entry) { if (entry.removeListener(listener)) { long elapsed = System.currentTimeMillis() - current; time.addAndGet(-elapsed); tryAcquireAsync(time, permits, subscribeFuture, result, ttl, timeUnit); } } } }, t, TimeUnit.MILLISECONDS); waitTimeoutFutureRef.set(waitTimeoutFuture); } } } }); }
From source file:org.redisson.RedissonPermitExpirableSemaphore.java
License:Apache License
private void acquireAsync(final int permits, final RFuture<RedissonLockEntry> subscribeFuture, final RPromise<String> result, final long ttl, final TimeUnit timeUnit) { if (result.isDone()) { unsubscribe(subscribeFuture);//from www . java 2s .c o m return; } long timeoutDate = calcTimeout(ttl, timeUnit); RFuture<String> tryAcquireFuture = tryAcquireAsync(permits, timeoutDate); tryAcquireFuture.addListener(new FutureListener<String>() { @Override public void operationComplete(Future<String> future) throws Exception { if (!future.isSuccess()) { unsubscribe(subscribeFuture); result.tryFailure(future.cause()); return; } final Long nearestTimeout; String permitId = future.getNow(); if (permitId != null) { if (!permitId.startsWith(":")) { unsubscribe(subscribeFuture); if (!result.trySuccess(permitId)) { releaseAsync(permitId); } return; } else { nearestTimeout = Long.valueOf(permitId.substring(1)) - System.currentTimeMillis(); } } else { nearestTimeout = null; } final RedissonLockEntry entry = getEntry(); synchronized (entry) { if (entry.getLatch().tryAcquire(permits)) { acquireAsync(permits, subscribeFuture, result, ttl, timeUnit); } else { final Timeout scheduledFuture; if (nearestTimeout != null) { scheduledFuture = commandExecutor.getConnectionManager().newTimeout(new TimerTask() { @Override public void run(Timeout timeout) throws Exception { acquireAsync(permits, subscribeFuture, result, ttl, timeUnit); } }, nearestTimeout, TimeUnit.MILLISECONDS); } else { scheduledFuture = null; } Runnable listener = new Runnable() { @Override public void run() { if (scheduledFuture != null && !scheduledFuture.cancel()) { entry.getLatch().release(); return; } acquireAsync(permits, subscribeFuture, result, ttl, timeUnit); } }; entry.addListener(listener); } } } }); }
From source file:org.redisson.RedissonPermitExpirableSemaphore.java
License:Apache License
public RFuture<String> tryAcquireAsync() { final RPromise<String> result = newPromise(); RFuture<String> res = tryAcquireAsync(1, nonExpirableTimeout); res.addListener(new FutureListener<String>() { @Override/*from ww w . jav a 2s . c o m*/ public void operationComplete(Future<String> future) throws Exception { if (!future.isSuccess()) { result.tryFailure(future.cause()); return; } String permitId = future.getNow(); if (permitId != null && !permitId.startsWith(":")) { if (!result.trySuccess(permitId)) { releaseAsync(permitId); } } else { result.trySuccess(null); } } }); return result; }
From source file:org.redisson.RedissonPermitExpirableSemaphore.java
License:Apache License
private RFuture<String> tryAcquireAsync(final int permits, long waitTime, final long ttl, final TimeUnit timeUnit) { final RPromise<String> result = newPromise(); final AtomicLong time = new AtomicLong(timeUnit.toMillis(waitTime)); final long current = System.currentTimeMillis(); long timeoutDate = calcTimeout(ttl, timeUnit); RFuture<String> tryAcquireFuture = tryAcquireAsync(permits, timeoutDate); tryAcquireFuture.addListener(new FutureListener<String>() { @Override// ww w .j av a 2 s. co m public void operationComplete(Future<String> future) throws Exception { if (!future.isSuccess()) { result.tryFailure(future.cause()); return; } String permitId = future.getNow(); if (permitId != null && !permitId.startsWith(":")) { if (!result.trySuccess(permitId)) { releaseAsync(permitId); } return; } long elapsed = System.currentTimeMillis() - current; time.addAndGet(-elapsed); if (time.get() <= 0) { result.trySuccess(null); return; } final long current = System.currentTimeMillis(); final AtomicReference<Timeout> futureRef = new AtomicReference<Timeout>(); final RFuture<RedissonLockEntry> subscribeFuture = subscribe(); subscribeFuture.addListener(new FutureListener<RedissonLockEntry>() { @Override public void operationComplete(Future<RedissonLockEntry> future) throws Exception { if (!future.isSuccess()) { result.tryFailure(future.cause()); return; } if (futureRef.get() != null) { futureRef.get().cancel(); } long elapsed = System.currentTimeMillis() - current; time.addAndGet(-elapsed); tryAcquireAsync(time, permits, subscribeFuture, result, ttl, timeUnit); } }); if (!subscribeFuture.isDone()) { Timeout scheduledFuture = commandExecutor.getConnectionManager().newTimeout(new TimerTask() { @Override public void run(Timeout timeout) throws Exception { if (!subscribeFuture.isDone()) { result.trySuccess(null); } } }, time.get(), TimeUnit.MILLISECONDS); futureRef.set(scheduledFuture); } } }); return result; }
From source file:org.redisson.RedissonPermitExpirableSemaphore.java
License:Apache License
@Override public RFuture<Void> releaseAsync(final String permitId) { final RPromise<Void> result = newPromise(); tryReleaseAsync(permitId).addListener(new FutureListener<Boolean>() { @Override/* w w w . j a v a 2 s . c o m*/ public void operationComplete(Future<Boolean> future) throws Exception { if (!future.isSuccess()) { result.tryFailure(future.cause()); return; } if (future.getNow()) { result.trySuccess(null); } else { result.tryFailure(new IllegalArgumentException( "Permit with id " + permitId + " has already been released or doesn't exist")); } } }); return result; }
From source file:org.redisson.RedissonPriorityDeque.java
License:Apache License
public RFuture<V> pollLastAsync() { final long threadId = Thread.currentThread().getId(); final RPromise<V> result = new RedissonPromise<V>(); lock.lockAsync(threadId).addListener(new FutureListener<Void>() { @Override/*www . j av a2s . c om*/ public void operationComplete(Future<Void> future) throws Exception { if (!future.isSuccess()) { result.tryFailure(future.cause()); return; } RFuture<V> f = commandExecutor.writeAsync(getName(), codec, RedisCommands.RPOP, getName()); f.addListener(new FutureListener<V>() { @Override public void operationComplete(Future<V> future) throws Exception { if (!future.isSuccess()) { result.tryFailure(future.cause()); return; } final V value = future.getNow(); lock.unlockAsync(threadId).addListener(new FutureListener<Void>() { @Override public void operationComplete(Future<Void> future) throws Exception { if (!future.isSuccess()) { result.tryFailure(future.cause()); return; } result.trySuccess(value); } }); } }); } }); return result; }
From source file:org.redisson.RedissonPriorityQueue.java
License:Apache License
public RFuture<V> pollAsync() { final long threadId = Thread.currentThread().getId(); final RPromise<V> result = new RedissonPromise<V>(); lock.lockAsync(threadId).addListener(new FutureListener<Void>() { @Override/* ww w . j ava 2 s .co m*/ public void operationComplete(Future<Void> future) throws Exception { if (!future.isSuccess()) { result.tryFailure(future.cause()); return; } RFuture<V> f = commandExecutor.writeAsync(getName(), codec, RedisCommands.LPOP, getName()); f.addListener(new FutureListener<V>() { @Override public void operationComplete(Future<V> future) throws Exception { if (!future.isSuccess()) { result.tryFailure(future.cause()); return; } final V value = future.getNow(); lock.unlockAsync(threadId).addListener(new FutureListener<Void>() { @Override public void operationComplete(Future<Void> future) throws Exception { if (!future.isSuccess()) { result.tryFailure(future.cause()); return; } result.trySuccess(value); } }); } }); } }); return result; }
From source file:org.redisson.RedissonReadLock.java
License:Apache License
@Override public RFuture<Boolean> forceUnlockAsync() { RFuture<Boolean> result = commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN,/*from w w w . j a va 2 s. c o m*/ "if (redis.call('hget', KEYS[1], 'mode') == 'read') then " + "redis.call('del', KEYS[1]); " + "redis.call('publish', KEYS[2], ARGV[1]); " + "return 1; " + "else " + "return 0; " + "end;", Arrays.<Object>asList(getName(), getChannelName()), LockPubSub.unlockMessage); result.addListener(new FutureListener<Boolean>() { @Override public void operationComplete(Future<Boolean> future) throws Exception { if (future.isSuccess() && future.getNow()) { cancelExpirationRenewal(); } } }); return result; }
From source file:org.redisson.RedissonRemoteService.java
License:Apache License
private <T> void subscribe(final Class<T> remoteInterface, final RBlockingQueue<RemoteServiceRequest> requestQueue, final ExecutorService executor) { RFuture<RemoteServiceRequest> take = requestQueue.takeAsync(); take.addListener(new FutureListener<RemoteServiceRequest>() { @Override//from w w w. ja va2 s . c om public void operationComplete(Future<RemoteServiceRequest> future) throws Exception { if (!future.isSuccess()) { log.error("Can't process the remote service request.", future.cause()); if (future.cause() instanceof RedissonShutdownException) { return; } // re-subscribe after a failed takeAsync subscribe(remoteInterface, requestQueue, executor); return; } // do not subscribe now, see // https://github.com/mrniko/redisson/issues/493 // subscribe(remoteInterface, requestQueue); final RemoteServiceRequest request = future.getNow(); // check the ack only if expected if (request.getOptions().isAckExpected() && System.currentTimeMillis() - request.getDate() > request .getOptions().getAckTimeoutInMillis()) { log.debug("request: {} has been skipped due to ackTimeout"); // re-subscribe after a skipped ackTimeout subscribe(remoteInterface, requestQueue, executor); return; } final String responseName = getResponseQueueName(remoteInterface, request.getRequestId()); // send the ack only if expected if (request.getOptions().isAckExpected()) { String ackName = getAckName(remoteInterface, request.getRequestId()); RFuture<Boolean> ackClientsFuture = commandExecutor.evalWriteAsync(responseName, LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN, "if redis.call('setnx', KEYS[1], 1) == 1 then " + "redis.call('pexpire', KEYS[1], ARGV[2]);" + "redis.call('rpush', KEYS[2], ARGV[1]);" + "redis.call('pexpire', KEYS[2], ARGV[2]);" + "return 1;" + "end;" + "return 0;", Arrays.<Object>asList(ackName, responseName), encode(new RemoteServiceAck()), request.getOptions().getAckTimeoutInMillis()); ackClientsFuture.addListener(new FutureListener<Boolean>() { @Override public void operationComplete(Future<Boolean> future) throws Exception { if (!future.isSuccess()) { log.error("Can't send ack for request: " + request, future.cause()); if (future.cause() instanceof RedissonShutdownException) { return; } // re-subscribe after a failed send (ack) subscribe(remoteInterface, requestQueue, executor); return; } if (!future.getNow()) { subscribe(remoteInterface, requestQueue, executor); return; } executeMethod(remoteInterface, requestQueue, executor, request); } }); } else { executeMethod(remoteInterface, requestQueue, executor, request); } } }); }
From source file:org.redisson.RedissonRemoteService.java
License:Apache License
private <T> void executeMethod(final Class<T> remoteInterface, final RBlockingQueue<RemoteServiceRequest> requestQueue, final ExecutorService executor, final RemoteServiceRequest request) { final RemoteServiceMethod method = beans .get(new RemoteServiceKey(remoteInterface, request.getMethodName(), request.getSignatures())); final String responseName = getResponseQueueName(remoteInterface, request.getRequestId()); RBlockingQueue<RemoteServiceCancelRequest> cancelRequestQueue = redisson .getBlockingQueue(getCancelRequestQueueName(remoteInterface, request.getRequestId()), getCodec()); final RFuture<RemoteServiceCancelRequest> cancelRequestFuture = cancelRequestQueue.takeAsync(); final AtomicReference<RRemoteServiceResponse> responseHolder = new AtomicReference<RRemoteServiceResponse>(); final java.util.concurrent.Future<?> submitFuture = executor.submit(new Runnable() { @Override/*w w w. j a va 2 s . co m*/ public void run() { invokeMethod(remoteInterface, requestQueue, request, method, responseName, executor, cancelRequestFuture, responseHolder); } }); cancelRequestFuture.addListener(new FutureListener<RemoteServiceCancelRequest>() { @Override public void operationComplete(Future<RemoteServiceCancelRequest> future) throws Exception { if (!future.isSuccess()) { return; } boolean res = submitFuture.cancel(future.getNow().isMayInterruptIfRunning()); if (res) { RemoteServiceCancelResponse response = new RemoteServiceCancelResponse(); if (!responseHolder.compareAndSet(null, response)) { response = new RemoteServiceCancelResponse(false); } // could be removed not from future object if (future.getNow().getResponseId() != null) { String cancelResponseName = getResponseQueueName(remoteInterface, future.getNow().getResponseId()); send(60 * 1000, cancelResponseName, response); } } } }); }