3

私は Akka と Play を使用しているため、ノンブロッキング I/O について調べています。読み取り可能な限り、そのコンテキストで回避できる場合、ブロックは悪い考えですが、これを私のものと連携させることはできません。使用事例:

  1. ネットワーク経由でファイルを取得します(ここではnioを使用する代替手段が存在しますが、現在はURL.openStreamを使用しています)
  2. BouncyCastle を使用してファイル (PGP) を復号​​化します (ここでは InputStream に限定しています)
  3. 標準 Java GZIP を使用してファイルを解凍します (InputStream に限定)。
  4. 位置ベースのフラット ファイルであるファイルの各行を読み取り、ケース クラスに変換します (ここでは、読み取り方法に制約はありません。現在は scalax.io.Resource です)。
  5. Slick/JDBC を使用し続ける (JDBC がブロックしているかどうかは不明)

現在、基本的に InputStreams をずっと使用して動作しています。ただし、理解を深めるために、ノンブロッキング IO でこれを行うことができるかどうかを調査しています。

基本的に、上記の各ステップを適用するパイプラインを介してファイルをストリーミングし、最終的にブロックせずにデータを保持したいと思います。

コードが必要な場合は簡単に提供できますが、一般的なレベルでの解決策を探しています: java.io を使用するライブラリに依存している場合はどうすればよいですか?

4

3 に答える 3

2

これがあなたのポイントのいくつかに役立つことを願っています:

java.io.InputStream1/2/3/4) Akka は、 とを使用するライブラリでうまく動作しますjava.io.OutputStream。このページ、特にこのセクションを参照してください: http://doc.akka.io/docs/akka/snapshot/scala/io.html

ByteStringBuilder は、asOutputStream メソッドを介して java.io.OutputStream にラップできます。同様に、ByteIterator は asInputStream を介して java.io.InputStream にラップできます。これらを使用して、akka.io アプリケーションは java.io ストリームに基づくレガシー コードを統合できます。

1) ネットワーク経由でファイルを取得するとします。HTTP経由で推測していますか?非同期 HTTP ライブラリを調べることができます。かなり成熟した非同期 HTTP ライブラリが数多くあります。akka の上に構築されているため、scala でSpray Clientを使用するのが好きなので、akka 環境でうまく機能します。GZIP はサポートしていますが、PGP はサポートしていません。

4) 別のオプション: ファイルはメモリに保存するのに十分小さいですか? その場合、IO を実行しないため、非同期であることを心配する必要はありません。IO の待機中にブロックすることはありません。代わりに、メモリが高速であるため、常に CPU を使用することになります。

5) JDBC がブロックしている。SQL クエリを引数としてメソッドを呼び出すと、戻り値の型はデータを含む結果セットになります。このデータを返すには、IO の実行中にメソッドをブロックする必要があります。

いくつかのJava 非同期データベース ドライバーがありますが、私が見たものはすべてメンテナンスされていないように見えるため、使用していません。

恐れるな。akka 環境でブロッキング ライブラリを処理する方法については、akka ドキュメントの次のセクションを参照してください

于 2012-12-07T00:07:40.137 に答える
1

BouncyCastleを使用してファイル(PGP)を復号化します(ここではInputStreamに限定されています)

このステップではInputStreamに制限されているため、独自の質問に回答しました。NIOを使用してネットワークに関連する部分を実行できますが、ステップ(2)にはInputStreamが必要です。NIOを使用してファイルをネットワークからディスクにスプールし、それ以降のストリームを使用して、解凍と復号化を行うことができます(CipherInputStream)...理論的にはブロックされますが、実際には継続されます。

于 2012-12-06T23:15:59.453 に答える
1

これが厳密にはノンブロッキング IO ではないことはわかっていますが、Playframework の意味でノンブロッキングである map を使用して Future (または Promsies) を構成することを検討する必要があると思います。

def getFile(location: String): File = { //blocking code} 

def decrypt(file: File): File = ..

def unzip(file: File): PromiseFile = ..

def store(file: File): String = ..

def result(status: String): SimpleResult[Json] = ..

AsyncResult{ 
  Promise.pure(getFile("someloc")) map decrypt map unzip map store map result 
}
于 2012-12-07T03:58:41.703 に答える