netty筆記-ChannelFuture

Future 提供了另一種在操作完成時通知應用程序的方式。這個對象可以看作是一個異步操
作的結果的占位符;它將在未來的某個時刻完成,并提供對其結果的訪問。
JDK 預置了 interface java.util.concurrent.Future,但是其所提供的實現,只
允許手動檢查對應的操作是否已經完成,或者一直阻塞直到它完成。這是非常繁瑣的,所以 Netty
提供了它自己的實現——ChannelFuture,用于在執行異步操作的時候使用。
ChannelFuture提供了幾種額外的方法,這些方法使得我們能夠注冊一個或者多個
ChannelFutureListener實例。監聽器的回調方法operationComplete(), 將會在對應的
操作完成時被調用 ①
// Does not block
。然后監聽器可以判斷該操作是成功地完成了還是出錯了。如果是后者,我
們可以檢索產生的Throwable。簡而 言之 ,由ChannelFutureListener提供的通知機制消除
了手動檢查對應的操作是否完成的必要。
每個 Netty 的出站 I/O 操作都將返回一個 ChannelFuture;也就是說,它們都不會阻塞。
正如我們前面所提到過的一樣, Netty 完全是異步和事件驅動的。

示例代碼:

public class ConnectExample {
    private static final Channel CHANNEL_FROM_SOMEWHERE = new NioServerSocketChannel();

    public static void connect() {
        Channel channel = CHANNEL_FROM_SOMEWHERE; // 指向某個位置

        // 不會阻塞,異步地連接到遠程節點
        ChannelFuture future = channel.connect(new InetSocketAddress("127.0.0.1", 8080));
        // 注冊一個ChannelFutureListener,以便在操作完成時獲得通知
        future.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture future) throws Exception {
                // 檢查操作的狀態
                if (future.isSuccess()) {
                    // 如果操作是成功的,則創建一個ByteBuf 以持有數據
                    ByteBuf buffer = Unpooled.copiedBuffer("Hello", Charset.forName("UTF-8"));
                    // 將數據異步地發送到遠程節點。返回一個ChannelFuture
                    ChannelFuture wf = future.channel().write(buffer);
                    // ...
                } else {
                    // 如果發生錯誤,則訪問描述原因的Throwable
                    Throwable cause = future.cause();
                    cause.printStackTrace();
                }
            }
        });
    }

    public static void main(String[] args) throws IOException
    {
        ConnectExample.connect();
    }
}

參考:
https://blog.csdn.net/lgj123xj/article/details/78577945

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容