我想知道是否有可能(以及如何)让akka actor从stdin接收消息.本质上,这个想法是将每行输入作为消息发送给演员,例如
> myprogram
DO X
DO Y
...
Run Code Online (Sandbox Code Playgroud)
然后让演员接收消息"DO X","DO Y"等.
有没有标准的解决方案来做到这一点?
我想有一种方法可以做到这一点:
spawn {
while(in.available) {
actor ! in.readLine
}
}
Run Code Online (Sandbox Code Playgroud)
但是后来我会有两个演员(或者一个基于演员的任务和一个演员)并且我会使用阻止IO(顺便说一句,这对演员来说是安全的吗?)...而且,这使得它更难控制产卵块(例如杀死任务).
OP的进一步跟进
我有几个跟进,如果你允许我......
使用此解决方案是否有性能损失(即确实CamelServiceManager
启动了很多事情?HTTP服务器等)?
给初学者一个很好的教程?我开始从官方的Akka文档中读取Camel,但它似乎比我现在拥有更多的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])
}
}
Run Code Online (Sandbox Code Playgroud)
更新:后续问题的答案
CamelServiceManager.startCamelService
方法启动一个CamelContext
和两个Akka演员,注册新开始的Consumer
演员端点CamelContext
.没有启动HTTP服务器.InputStream
目前,使用camel-stream组件无法在端点URI上设置自定义. 归档时间: |
|
查看次数: |
1300 次 |
最近记录: |