-
- All Superinterfaces:
io.netty5.util.concurrent.Future<Void>,Iterable<io.netty5.util.concurrent.Future<Void>>
public interface ChannelGroupFuture extends io.netty5.util.concurrent.Future<Void>, Iterable<io.netty5.util.concurrent.Future<Void>>
The result of an asynchronousChannelGroupoperation.ChannelGroupFutureis composed ofFutures which represent the outcome of the individual I/O operations that affect theChannels in theChannelGroup.All I/O operations in
ChannelGroupare asynchronous. It means any I/O calls will return immediately with no guarantee that the requested I/O operations have been completed at the end of the call. Instead, you will be returned with aChannelGroupFutureinstance which tells you when the requested I/O operations have succeeded, failed, or cancelled.Various methods are provided to let you check if the I/O operations has been completed, wait for the completion, and retrieve the result of the I/O operation. It also allows you to add more than one
ChannelGroupFutureListenerso you can get notified when the I/O operation have been completed.Prefer
It is recommended to preferaddListener(FutureListener)toFutureCompletionStage.await()addListener(FutureListener)toFutureCompletionStage.await()wherever possible to get notified when I/O operations are done and to do any follow-up tasks.addListener(FutureListener)is non-blocking. It simply adds the specifiedChannelGroupFutureListenerto theChannelGroupFuture, and I/O thread will notify the listeners when the I/O operations associated with the future is done.ChannelGroupFutureListeneryields the best performance and resource utilization because it does not block at all, but it could be tricky to implement a sequential logic if you are not used to event-driven programming.By contrast,
FutureCompletionStage.await()is a blocking operation. Once called, the caller thread blocks until all I/O operations are done. It is easier to implement a sequential logic withFutureCompletionStage.await(), but the caller thread blocks unnecessarily until all I/O operations are done and there's relatively expensive cost of inter-thread notification. Moreover, there's a chance of dead lock in a particular circumstance, which is described below.Do not call
FutureCompletionStage.await()insideChannelHandlerThe event handler methods in
ChannelHandleris often called by an I/O thread. IfFutureCompletionStage.await()is called by an event handler method, which is called by the I/O thread, the I/O operation it is waiting for might never be complete becauseFutureCompletionStage.await()can block the I/O operation it is waiting for, which is a deadlock.// BAD - NEVER DO THIS
@Overridepublic void messageReceived(ChannelHandlerContextctx, ShutdownMessage msg) {ChannelGroupallChannels = MyServer.getAllChannels();ChannelGroupFuturefuture = allChannels.close(); future.asStage().await(); // Perform post-shutdown operation // ... } // GOOD@Overridepublic void messageReceived(ChannelHandlerContext ctx, ShutdownMessage msg) {ChannelGroupallChannels = MyServer.getAllChannels();ChannelGroupFuturefuture = allChannels.close(); future.addListener(newChannelGroupFutureListener() { public void operationComplete(ChannelGroupFuturefuture) { // Perform post-closure operation // ... } }); }In spite of the disadvantages mentioned above, there are certainly the cases where it is more convenient to call
FutureCompletionStage.await(). In such a case, please make sure you do not callFutureCompletionStage.await()in an I/O thread. Otherwise,IllegalStateExceptionwill be raised to prevent a dead lock.
-
-
Method Summary
All Methods Instance Methods Abstract Methods Modifier and Type Method Description ChannelGroupFutureaddListener(io.netty5.util.concurrent.FutureListener<? super Void> listener)booleancancel()ChannelGroupExceptioncause()io.netty5.util.concurrent.EventExecutorexecutor()io.netty5.util.concurrent.Future<Void>find(Channel channel)Returns theFutureof the individual I/O operation which is associated with the specifiedChannel.VgetNow()ChannelGroupgroup()Returns theChannelGroupwhich is associated with this future.booleanisCancellable()booleanisCancelled()booleanisDone()booleanisFailed()booleanisPartialFailure()Returnstrueif and only if the I/O operations associated with this future have failed partially with some success.booleanisPartialSuccess()Returnstrueif and only if the I/O operations associated with this future were partially successful with some failure.booleanisSuccess()Returnstrueif and only if all I/O operations associated with this future were successful without any failure.Iterator<io.netty5.util.concurrent.Future<Void>>iterator()Returns theIteratorthat enumerates allFutures which are associated with this future.-
Methods inherited from interface io.netty5.util.concurrent.Future
addListener, asStage, cascadeTo, flatMap, map
-
Methods inherited from interface java.lang.Iterable
forEach, spliterator
-
-
-
-
Method Detail
-
group
ChannelGroup group()
Returns theChannelGroupwhich is associated with this future.
-
find
io.netty5.util.concurrent.Future<Void> find(Channel channel)
Returns theFutureof the individual I/O operation which is associated with the specifiedChannel.- Returns:
- the matching
Futureif found.nullotherwise.
-
isSuccess
boolean isSuccess()
Returnstrueif and only if all I/O operations associated with this future were successful without any failure.
-
cause
ChannelGroupException cause()
-
isPartialSuccess
boolean isPartialSuccess()
Returnstrueif and only if the I/O operations associated with this future were partially successful with some failure.
-
isPartialFailure
boolean isPartialFailure()
Returnstrueif and only if the I/O operations associated with this future have failed partially with some success.
-
addListener
ChannelGroupFuture addListener(io.netty5.util.concurrent.FutureListener<? super Void> listener)
- Specified by:
addListenerin interfaceio.netty5.util.concurrent.Future<Void>
-
cancel
boolean cancel()
-
isFailed
boolean isFailed()
-
isCancelled
boolean isCancelled()
-
isDone
boolean isDone()
-
isCancellable
boolean isCancellable()
-
getNow
V getNow()
-
executor
io.netty5.util.concurrent.EventExecutor executor()
-
-