scala - 如何从标准输入获取 Actor 信息?

标签 scala akka actor

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

> myprogram
DO X
DO Y
...

然后让 actor 接收消息“DO X”、“DO Y”等。

是否有标准解决方案来执行此操作?

我想一种方法是这样做:

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

但是我会有两个 Actor (或者一个基于 Actor 的任务和一个 Actor )并且我会使用阻塞 IO(顺便说一下,这对 Actor 来说安全吗?)...而且,它使它更难控制生成 block (例如终止任务)。

添加了来自 OP 的进一步跟进

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

  1. 使用此解决方案是否会影响性能(即 CamelServiceManager 是否启动了很多东西?HTTP 服务器等)?

  2. 有适合​​初学者的好教程吗?我开始阅读 Camel来自官方 Akka 文档,但它似乎假设我对 Camel 的了解比我目前拥有的更多。例如,我不知道如何将自定义 java.io.InputStream 用作 endpointUri

最佳答案

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

关于scala - 如何从标准输入获取 Actor 信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7400784/

相关文章:

scala - 你如何在Play框架中打印出填充的Anorm SQL语句

java - 类 akka.actor.TypedActor$MethodCall 无法使用修饰符 "public abstract"访问类 JobManager 的成员

scala - 使用 Akka-IO TCP 初始化 akka actor

scala - List.filter 中的下划线

arrays - Scala 中的 6 维或更多维数组

scala - F# 是否有相当于 Scala 的 Promise 的工具?

scala 使用的是随二进制分发版一起提供的 akka 而不是 sbt 的

与 Actor 一起使用时的 Scala 变量绑定(bind)

java - Libgdx 中的 stage 是如何工作的?

android - Libgdx - 操作;向多个参与者添加一个 Action