如何从stdin获取actor消息?

时间:2011-09-13 11:01:19

标签: scala akka actor

我想知道是否有可能(以及如何)让akka actor从stdin接收消息。从本质上讲,这个想法是将每一行输入作为消息发送给演员,例如

> myprogram
DO X
DO Y
...

然后让演员接收消息“DO X”,“DO Y”等

有没有标准的解决方案呢?

我想有一种方法可以做到这一点:

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

但是后来我会有两个演员(或者一个基于演员的任务和一个演员)并且我会使用阻止IO(顺便说一句,对于演员是否安全?)...而且,它使它成为现实更难控制生成块(例如,杀死任务)。

从OP

添加了更多后续内容

如果你允许我,我会有几次跟进......

  1. 使用此解决方案是否有性能损失(即CamelServiceManager是否会启动很多内容?HTTP服务器等)?

  2. 为初学者准备了一个很好的教程?我开始从官方的Akka文档中阅读Camel,但它似乎比我现在拥有更多的Camel知识。例如,我无法弄清楚如何将自定义java.io.InputStream用作endpointUri

1 个答案:

答案 0 :(得分:5)

您可以将akka-camelcamel-stream组件一起使用,让actor从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和两个Akka演员,在Consumer注册新开始的CamelContext演员端点。没有启动HTTP服务器。
  • 对Apache Camel的精彩介绍是Apache Camel: Integration Nirvana一书和chapter 1本书的Camel in Action。 Camel in Action的Appendix E是对akka-camel的介绍。
  • 目前无法使用camel-stream组件在端点URI上设置自定义InputStream
相关问题