3

我想知道是否有可能(以及如何)让 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.InputStreamas endpointUri

4

1 回答 1

5

您可以将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和两个 Akka actor,它们ConsumerCamelContext. 没有启动 HTTP 服务器。
  • Apache Camel 很好的介绍是Apache Camel:Integration Nirvana文章和Camel in Action书的第 1 章。Camel in Action的附录 E是对 akka-camel 的介绍。
  • InputStream骆驼流组件目前无法在端点 URI 上设置自定义。
于 2011-09-13T13:20:48.983 回答