Как получить сообщения актера из стандартного ввода?

Я хотел бы знать, возможно ли (и как) заставить актера akka получать сообщения со стандартного ввода. По сути, идея заключалась бы в том, чтобы каждая строка ввода отправлялась как сообщение актеру, например.

> myprogram
DO X
DO Y
...

а затем чтобы актер получал сообщения «DO X», «DO Y» и т. д.

Есть ли стандартное решение для этого?

Я думаю, один из способов сделать это:

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

Но тогда у меня было бы два актера (или одна задача на основе актера и один актор), и я бы использовал блокирующий ввод-вывод (кстати, это безопасно с актерами?)... Кроме того, это затрудняет контроль блок возрождения (например, чтобы убить задачу).

Добавлены дальнейшие действия от OP

У меня есть пара дополнений, если позволите...

  1. Есть ли снижение производительности при использовании этого решения (т. е. запускает ли CamelServiceManager много вещей? HTTP-сервер и т. д.)?

  2. Есть хороший учебник для начинающих? Я начал читать Camel с официальной документации Akka, но кажется предполагать больше знаний о Верблюде, чем у меня есть в настоящее время. Например, я не мог понять, как использовать пользовательское java.io.InputStream как endpointUri.


person LordPhoenix    schedule 13.09.2011    source источник


Ответы (1)


Вы можете использовать akka-camel вместе с camel-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, которые регистрируют только что запущенные конечные точки актора Consumer в CamelContext. HTTP-сервер не запущен.
  • Хорошим введением в Apache Camel является статья Apache Camel: Integration Nirvana и глава 1 Верблюд в действии. Приложение E к книге Camel in Action представляет собой введение в akka-camel.
  • Установка пользовательского InputStream в URI конечной точки в настоящее время невозможна с компонентом camel-stream.
person Martin Krasser    schedule 13.09.2011