我是Akka演员的新手,我正在做一些测试。假设我有演员执行长时间运行的任务,如下所示:
override def receive = {
case email: Email => /*Future*/ {
Thread sleep 3000
}
}
我进行了压力测试(远程actos在网络中的另一台机器上),我收到以下错误:
akka.remote.EndpointAssociationException:关联失败[akka.tcp://EmailSystem@192.168.1.6:5000] 引起:akka.remote.transport.AkkaProtocolException:没有来自远程的响应。握手超时
如何将其配置为不再出现此错误?我应该在接收方法中使用未来而不是普通代码(如上面的评论)?这样做有什么影响?
答案 0 :(得分:1)
让一个像这样长时间阻塞的actor是一个非常糟糕的主意,因为它无法响应消息,而且akka默认线程池是你的计算机每个核心的一个线程所以你也可能会阻止其他演员处理任何消息。
在一个单独的执行上下文/线程池中阻塞作业(并确保限制该线程池中有多少个线程)。然后,您可以使用pipeTo:
通知actorimport akka.pattern.pipe
case email: Email =>
val futureEmail = Future {
... send email and then ...
EmailSent()
}
futureEmail pipeTo sender