我正在使用Spray 1.2.0和Akka 2.2.3创建RESTful API。 Scala版本是2.10(如果需要,可以更改所有这些版本)。在我的业务层中,我必须通过SSH连接与遗留系统进行通信。这些连接需要很长时间(1 - 3分钟)才能完成设置,并且如果它们闲置太久将会过期。我在测试应用程序上分别处理了SSH代码,现在我将它包装在一个actor中。
如何指定与Spray用于处理HTTP请求的actor分开的SSH actor池?我需要在启动时创建这些actor,而不是在请求进入时,否则请求在建立连接时超时。另外,如何独立于Spray的演员控制演员池的大小?
答案 0 :(得分:2)
如何指定与Spray用于处理HTTP请求的actor分开的SSH actor池?
您可以为这组演员创建custom dispatcher。
这些连接需要很长时间(1 - 3分钟)才能完成设置,并且如果它们闲置太久会过期。
您可以在actor启动时自动设置连接。每个参与者可以安排定期保持活动动作,不要让连接超时使用scheduler。
我需要在创业时创建这些演员。如何独立于Spray的演员来控制演员池的大小?
我猜你必须在应用启动时手动创建所需数量的这些演员。
答案 1 :(得分:0)
对于后人来说,这是我最终选择的解决方案。我定义了一个路由器actor。这会自动创建我的ssh-actors的实例并将消息路由到它们。我还告诉那个演员要使用PinnedDispatcher。这个调度程序说我的路由器中的每个actor都将在它自己的线程上运行并保留在那里,这是必要的,因为ssh-actors所依赖的Ssh库Jsch使用阻塞io。
演员参考工厂看起来与其他例子略有不同,因为我使用的是spring-scala。
implicit val system = ActorSystem("my-services")
val SshRouter = system.actorOf(Props(SpringExt(system).ctx.getBean(classOf[SshActor]))
.withRouter(FromConfig())
.withDispatcher("ssh-actor-dispatcher")
,"ssh-actor-router")
然后在application.conf
中我定义了此路由器和调度程序的配置:
akka.actor {
creation-timeout = 200s
deployment {
/ssh-actor-router {
router = round-robin
nr-of-instances = 4
}
}
}
ssh-actor-dispatcher {
executor = "thread-pool-executor"
type = PinnedDispatcher
}
现在我可以将消息发送到路由器,并将其转发到ssh-actors池中的一个,它可以响应命令的输出:
(SshRouter ? Execute(cmd)).mapTo[String]