2017-03-07 5 views
0

私はソケット経由でファイルを送信する非常に単純なアプリケーション(2人のアクター)を持っています。アプリケーションはSpring BootとAkkaを使用し、転送が終了した後は何も起こりません。しかし、私は転送後も高いCPU使用率に気付いています(4コアマシンでは50%なので、2コアで十分です)。私はアクティブなスレッドのスナップショットを取得しており、そのうち1/3はAkkaに属しています。何も起こらないとき、Akkaは何をしていますか?

Akkaは何をしていますか、なぜCPUが大量にかかるのですか?

http://pastebin.com/CF9yUvuL

+1

コードを投稿してください –

+0

これらのスレッドはすべて「WAITING」(https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.State.html)ですので、彼らはあなたのCPUの50%を取っている可能性があります間違った結論です。 – johanandren

答えて

1

一般的にあなたの質問に答えるために:アッカは、非同期メッセージの処理を行うために使用されるスレッドプールを作成します。したがって、次のようなコードを書くと、Akkaは実行を続けるため、アプリケーションは終了しません。

class Root extends Actor { 

    // create some child actors to do some work 

    override def receive: Receive = Actor.emptyBehavior 
} 

object Main { 

    def main(args: Array[String]): Unit = { 
    val system = ActorSystem("main") 
    system.actorOf(Props(new Root)) 
    } 
} 

、あなたのアプリケーションを終了する必要があるのであれば、通常、あなたはすべての作業が完了し、あなたのルートアクターにこのメッセージを送信されたことを知らせるメッセージを定義します。ルートアクターは、context.system.terminate()を呼び出してシステムを終了できます。

質問に戻ると、私はなぜAkkaとSpring Bootを組み合わせたいのか分かりません。あなたのスレッドダンプ、私は問題がAkkaに全く関係しているかどうかはわかりません。スレッドがHttpClientの内部にぶら下がっているようです。開いている接続をすべて解放して閉じてもよろしいですか?

+0

私は複数のスレッドを作成することに問題はありません、私はちょうど理解していない、なぜそれらのスレッドは(メッセージを待つのではなく)まだアクティブです。アプリケーションはサーバーなので、意図的に終了されません。私はなぜAkka + Springが悪い考えであるのか、彼らはさまざまなことをする理由を見ません。ソケット上に1つの接続しかなく、正常に完了しました。 – spam

+1

Akka + Spring Bootについての議論はおそらくこの質問の対象外です。そのために残念。いくつかのコードサンプルがなければ何が起こっているのかを知ることはかなり難しいです。あなたの質問に[mcve](http://stackoverflow.com/help/mcve)を追加できますか? – britter

関連する問題