2011-09-13 3 views
3

Je voudrais savoir s'il est possible (et comment) d'obtenir un acteur akka pour recevoir des messages de stdin. Essentiellement, l'idée serait que chaque ligne d'entrée soit envoyée comme un message à l'acteur, par ex.Comment obtenir des messages d'acteur de stdin?

> myprogram 
DO X 
DO Y 
... 

puis d'avoir l'acteur de recevoir des messages "DO X", "DO Y", etc.

Y at-il une solution standard pour le faire?

Je suppose que d'une façon serait de le faire:

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

Mais j'aurais deux acteurs (ou une tâche basée acteur et un acteur) et je serais en utilisant le blocage IO (est ce coffre-fort avec les acteurs, d'ailleurs?) ... De plus, il est plus difficile de contrôler le bloc de réapparition (par exemple pour tuer la tâche).

Ajouté suivent plus hauts de OP

J'ai un ups de suivi couple, si vous me le permettez ...

  1. Y at-il une baisse de performance en utilisant cette solution (c.-à-t CamelServiceManager démarrer beaucoup de choses? Serveur HTTP, etc.)?

  2. Vous avez un bon tutoriel pour les débutants? J'ai commencé à lire Camel de la documentation officielle d'Akka, mais il semble supposer plus de connaissance de Camel que je ne possède actuellement. Par exemple, je ne pouvais pas comprendre comment utiliser un java.io.InputStream personnalisé comme endpointUri.

Répondre

5

Vous pouvez utiliser akka-camel avec le composant camel-stream pour laisser les acteurs de recevoir des messages de stdin. Voici un exemple de travail:

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]) 
    } 
} 

Mise à jour: Les réponses aux questions de suivi

  • La méthode CamelServiceManager.startCamelService commence un CamelContext et deux acteurs Akka ce registre nouvellement commencé Consumer points d'extrémité acteur au CamelContext. Aucun serveur HTTP n'est démarré.
  • Les bonnes introductions à Apache Camel sont article Apache Camel: Integration Nirvana et chapter 1 du livre Camel in Action. Le Appendix E de Camel in Action est une introduction à l'akka-camel.
  • La définition d'un InputStream personnalisé à l'extrémité de l'URI n'est actuellement pas possible avec le composant camel-stream.
Questions connexes