3

akka アクターに stdin からメッセージを受信させることが可能かどうか (およびその方法) を知りたいです。基本的に、アイデアは、入力のすべての行がメッセージとしてアクターに送信されるようにすることです。

> myprogram
DO X
DO Y
...

次に、アクターに「DO X」、「DO Y」などのメッセージを受信させます。

これを行うための標準的な解決策はありますか?

1つの方法はこれを行うことだと思います:

spawn {
    while(in.available) {
        actor ! in.readLine
    }
}

しかし、2 つのアクター (または 1 つのアクターベースのタスクと 1 つのアクター) があり、ブロッキング IO を使用することになります (ちなみに、それはアクターで安全ですか?)... また、制御が難しくなります。 spawn ブロック (タスクを強制終了するなど)。

OPからさらにフォローアップを追加

許可があれば、いくつかフォローアップがあります...

  1. このソリューションを使用すると、パフォーマンスに影響がありますか (つまりCamelServiceManager、多くのことを開始しますか? HTTP サーバーなど)?

  2. 初心者向けの良いチュートリアルはありますか?Akka の公式ドキュメントからCamelを読み始めましたが、現在持っている以上の Camel の知識を前提としているようです。java.io.InputStreamたとえば、カスタムasの使い方がわかりませんでしたendpointUri

4

1 に答える 1

5

akka-camelをcamel-streamコンポーネントと一緒に使用して、アクターが stdin からメッセージを受信できるようにすることができます。これが実際の例です:

import akka.actor.Actor
import akka.camel.{Message, CamelServiceManager, Consumer}

object Example extends App {
  CamelServiceManager.startCamelService
  Actor.actorOf[ExampleConsumer].start
}

class ExampleConsumer extends Actor with Consumer {
  def endpointUri = "stream:in"
  def receive = {
    case msg: Message => println("received %s" format msg.bodyAs[String])
  }
}

更新:フォローアップの質問への回答

  • このCamelServiceManager.startCamelServiceメソッドは、新しく開始されたアクター エンドポイントを にCamelContext登録する 1 つおよび 2 つの Akka アクターを開始します。HTTP サーバーは開始されません。ConsumerCamelContext
  • Apache Camel の良い入門書は、Apache Camel: Integration Nirvanaの記事とCamel in Action bookの第 1 章です。Camel in Actionの付録 Eは、akka-camel の紹介です。
  • InputStreamcamel-stream コンポーネントでは、エンドポイント URI でカスタムを設定することは現在できません。
于 2011-09-13T13:20:48.983 に答える