Java NIO2非同期チャネルAPIの手引き

1概要

この記事では、Java 7- 非同期チャネルAPI の新しいI/O(NIO2)の主要な追加APIの1つの基礎を探ります。

これはこの特定のトピックをカバーする一連の記事の最初のものです。

非同期チャネルAPIは、Java 1.4に同梱されていた初期の新しいI/O(NIO)APIに対する機能強化です。 NIOセレクタについて読むためには、リンクをたどってください:/java-nio-selector[このリンク]。

NIO APIのもう1つの機能強化は、新しいファイルシステムAPIです。あなたはそのリンクについてもっと読むことができます:/java-nio-2-file-api[ファイル操作]そして パス操作 このサイトでも。

私たちのプロジェクトでNIO2非同期チャンネルを使うには、必要なクラスがバンドルされているので java.nio.channels パッケージをインポートする必要があります。

import java.nio.channels.** ;

** 2非同期チャネルAPIの仕組み

非同期チャネルAPIは既存の java.nio.channels パッケージに導入されました。クラス名の前に Asynchronous という単語を追加するだけです。

コアクラスには、 AsynchronousSocketChannel AsynchronousServerSocketChannel 、および AsynchronousFileChannel があります。

お気づきかもしれませんが、これらのクラスのスタイルは標準のNIOチャネルAPIと似ています。

また、NIOチャネルクラスで利用可能なほとんどのAPI操作は、新しい非同期バージョンでも利用できます。主な違いは、** 新しいチャンネルによって、一部の操作を非同期に実行できるようになることです。

操作が開始されると、非同期チャネルAPIは保留中の操作を監視および制御するための2つの選択肢を提供します。操作は java.util.concurrent.Future オブジェクトを返すか、または java.nio.channels.CompletionHandler を渡すことができます。

3 __未来のアプローチ

  • Future オブジェクトは非同期計算の結果を表します** クライアント接続を監視するためのサーバーを作成したい場合、 AsynchronousServerSocketChannel で静的 open APIを呼び出し、返されたソケットチャネルをオプションでアドレスにバインドします。

AsynchronousServerSocketChannel server
  = AsynchronousServerSocketChannel.open().bind(null);

システムがアドレスを自動割り当てできるように null を渡しました。

それから、返されたサーバー SocketChannel accept メソッドを呼び出します。

Future<AsynchronousSocketChannel> future = server.accept();

古いIOで ServerSocketChannel accept メソッドを呼び出すと、着信接続がクライアントから受信されるまでブロックされます。

しかし、 AsynchronousServerSocketChannel accept メソッドは、ただちに Future オブジェクトを返します。

Future オブジェクトのジェネリック型は、操作の戻り型です。上記のケースでは、それは AsynchronousSocketChannel ですが、操作の最終的な戻り型に応じて、 Integer または String でも構いません。

Future オブジェクトを使って操作の状態を問い合わせることができます。

future.isDone();

基礎となる操作がすでに完了している場合、このAPIは true を返します。

この場合、完了は正常終了、例外、またはキャンセルを意味する場合があることに注意してください。

操作がキャンセルされたかどうかを明示的に確認することもできます。

future.isCancelled();

操作が正常に完了する前にキャンセルされた場合のみ true を返します。それ以外の場合は false を返します。キャンセルは cancel メソッドによって実行されます。

future.cancel(true);

呼び出しは、 Future オブジェクトによって表される操作を取り消します。このパラメーターは、操作が開始されても中断される可能性があることを示します。操作が完了したら、キャンセルすることはできません

計算結果を取得するには、 get メソッドを使用します。

AsynchronousSocketChannel client= future.get();

操作が完了する前にこのAPIを呼び出すと、完了するまでブロックされ、操作の結果が返されます。

4 CompletionHandler アプローチ

Futureを使用して操作を処理する代わりに、 CompletionHandler クラスを使用したコールバックメカニズムがあります。非同期チャネルでは、操作の結果を消費するために完了ハンドラを指定できます。

AsynchronousServerSocketChannel listener
  = AsynchronousServerSocketChannel.open().bind(null);

listener.accept(
  attachment, new CompletionHandler<AsynchronousSocketChannel, Object>() {
    public void completed(
      AsynchronousSocketChannel client, Object attachment) {
         //do whatever with client
      }
    public void failed(Throwable exc, Object attachment) {
         //handle failure
      }
  });

I/O操作が正常に完了すると、 completed コールバックAPIが呼び出されます。操作が失敗した場合、 failed コールバックが呼び出されます。

これらのコールバックメソッドは他のパラメータを受け入れます - 私たちが操作と一緒にタグ付けするのに適していると思うどんなデータでも渡すことを可能にするために。この最初のパラメータは、コールバックメソッドの2番目のパラメータとして使用できます。

最後に、明確なシナリオは - 異なる非同期操作に同じ CompletionHandler を使用することです。この場合は、結果を処理するときに各操作にタグを付けてコンテキストを提供することでメリットが得られます。これについては次のセクションで説明します。

5結論

この記事では、Java NIO2のAsynchronous Channel APIの概要について説明しました。

この記事のすべてのコードスニペットとフルソースコードを入手するには、https://github.com/eugenp/tutorials/tree/master/core-java-io/[Githubプロジェクト]にアクセスしてください。

前の投稿:Spring Securityの2つのログインページ
次の投稿:Springコンポーネントスキャニング