1 /*
2 * Copyright 2012 The Netty Project
3 *
4 * The Netty Project licenses this file to you under the Apache License,
5 * version 2.0 (the "License"); you may not use this file except in compliance
6 * with the License. You may obtain a copy of the License at:
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations
14 * under the License.
15 */
16 package io.netty.channel;
17
18 import io.netty.util.concurrent.Future;
19 import io.netty.util.concurrent.GenericFutureListener;
20
21
22 /**
23 * Listens to the result of a {@link ChannelFuture}. The result of the
24 * asynchronous {@link Channel} I/O operation is notified once this listener
25 * is added by calling {@link ChannelFuture#addListener(GenericFutureListener)}.
26 *
27 * <h3>Return the control to the caller quickly</h3>
28 *
29 * {@link #operationComplete(Future)} is directly called by an I/O
30 * thread. Therefore, performing a time consuming task or a blocking operation
31 * in the handler method can cause an unexpected pause during I/O. If you need
32 * to perform a blocking operation on I/O completion, try to execute the
33 * operation in a different thread using a thread pool.
34 */
35 public interface ChannelFutureListener extends GenericFutureListener<ChannelFuture> {
36
37 /**
38 * A {@link ChannelFutureListener} that closes the {@link Channel} which is
39 * associated with the specified {@link ChannelFuture}.
40 */
41 ChannelFutureListener CLOSE = new ChannelFutureListener() {
42 @Override
43 public void operationComplete(ChannelFuture future) {
44 future.channel().close();
45 }
46 };
47
48 /**
49 * A {@link ChannelFutureListener} that closes the {@link Channel} when the
50 * operation ended up with a failure or cancellation rather than a success.
51 */
52 ChannelFutureListener CLOSE_ON_FAILURE = new ChannelFutureListener() {
53 @Override
54 public void operationComplete(ChannelFuture future) {
55 if (!future.isSuccess()) {
56 future.channel().close();
57 }
58 }
59 };
60
61 /**
62 * A {@link ChannelFutureListener} that forwards the {@link Throwable} of the {@link ChannelFuture} into the
63 * {@link ChannelPipeline}. This mimics the old behavior of Netty 3.
64 */
65 ChannelFutureListener FIRE_EXCEPTION_ON_FAILURE = new ChannelFutureListener() {
66 @Override
67 public void operationComplete(ChannelFuture future) {
68 if (!future.isSuccess()) {
69 future.channel().pipeline().fireExceptionCaught(future.cause());
70 }
71 }
72 };
73
74 // Just a type alias
75 }
76