【问题标题】:How to get actor messages from stdin?如何从标准输入获取演员消息?
【发布时间】:2011-11-16 01:53:26
【问题描述】:

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

> 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

【问题讨论】:

    标签: scala akka actor


    【解决方案1】:

    您可以将akka-camelcamel-stream 组件一起使用,让参与者从标准输入接收消息。这是一个工作示例:

    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 和两个在 CamelContext 处注册新启动的 Consumer 演员端点的 Akka 演员。没有启动 HTTP 服务器。
    • 关于 Apache Camel 的很好的介绍是 Apache Camel: Integration Nirvana 文章和 Camel in Action 书的 chapter 1。 Camel in Action 的Appendix E 是对akka-camel 的介绍。
    • 当前无法使用 camel-stream 组件在端点 URI 处设置自定义 InputStream

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多