我想知道是否有可能(以及如何)让 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 的进一步跟进
我有几个跟进,如果你允许我...
使用此解决方案是否会影响性能(即
CamelServiceManager
是否启动了很多东西?HTTP 服务器等)?有适合初学者的好教程吗?我开始阅读 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< 注册新启动的
。没有启动 HTTP 服务器。Consumer
actor 端点的 Akka actor/- 对 Apache Camel 的良好介绍是 Apache Camel: Integration Nirvana文章和chapter 1的 Camel in Action书。 Appendix E Camel in Action 介绍了 akka-camel。
- 在端点 URI 处设置自定义
InputStream
目前无法使用 camel-stream 组件。
关于scala - 如何从标准输入获取 Actor 信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7400784/