Как получить актер сообщения от стандартного ввода? - PullRequest
3 голосов
/ 13 сентября 2011

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

> myprogram
DO X
DO Y
...

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

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

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

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

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

Добавлены дополнительные наблюдения от OP

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

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

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

1 Ответ

5 голосов
/ 13 сентября 2011

Вы можете использовать akka-camel вместе с компонентом camel-stream , чтобы актеры могли получать сообщения от 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: статья Nirvana по интеграции и глава 1 книги Camel в действии . Приложение E «Верблюд в действии» представляет собой введение в akka-camel.
  • Установка пользовательского InputStream в URI конечной точки в настоящее время невозможна для компонента camel-stream.
...