2011-09-13 3 views
3

私は、akkaの俳優にstdinからメッセージを受け取ることができるかどうか、またそれをどうやって知りたいのですか?基本的には、入力のすべての行がメッセージとしてアクターに送信されるという考え方があります。stdinからアクターメッセージを取得するには?

> myprogram 
DO X 
DO Y 
... 

、その後、俳優が

これを行うための標準的な解決策があるのメッセージ "DO X"、 "DO Y" などを受ける持っていますか?

私は1つの方法は、これを行うことであろうと思います。(

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

しかし、その後、私は2人の俳優(または1つのアクター・ベースのタスクと1人の俳優を)持っているだろうと私はIOをブロック使用しているだろうさそれは俳優と安全ですか?)...また、それは、(例えば、タスクを殺すために)生成ブロックを制御することを難しくします。

が追加され、さらにあなたが私を許可する場合、私は、カップルのフォローアップを持っているOPから

をアップに従ってください...

  1. は、このソリューションを使用してパフォーマンスヒットがありますが(つまりCamelServiceManagerを行いますHTTPサーバーなど)を起動しますか?

  2. 初級者向けの優れたチュートリアルがありますか?私は公式のAkkaの文書からCamelを読み始めましたが、私が現在持っているよりも多くのキャメルの知識を前提としています。たとえば、カスタムjava.io.InputStreamを使用する方法を把握できませんでした。endpointUri

答えて

5

あなたは俳優が標準入力からメッセージを受信できるようにcamel-stream成分と共にakka-camelを使用することができます。ここでは作業例です:

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方法は、新たにCamelContextConsumer俳優エンドポイントを開始したレジスタCamelContextと2アッカの俳優を開始します。 HTTPサーバーが開始されていません。
  • Apache Camelの紹介は、のApache Camel: Integration Nirvanaの記事とchapter 1です。 Camel in ActionのAppendix Eはakka-camelの紹介です。
  • エンドポイントURIにカスタムInputStreamを設定することは現在、ラクダストリームコンポーネントでは不可能です。
関連する問題