Scala 在Spray应用程序中,如何为业务层提供独立的长期参与者池?

Scala 在Spray应用程序中,如何为业务层提供独立的长期参与者池?,scala,akka,actor,spray,Scala,Akka,Actor,Spray,我正在用Spray 1.2.0和Akka 2.2.3创建一个RESTful API。Scala版本是2.10(如果需要,所有这些版本都可以更改)。在我的业务层中,我必须通过SSH连接与遗留系统进行通信。这些连接需要很长时间(1-3分钟)才能建立,如果空闲时间过长,这些连接将过期。我在一个测试应用程序上分别编写了SSH代码,现在我将其包装在一个actor中 如何指定一个SSH参与者池,该池独立于处理HTTP请求所使用的参与者池?我需要在启动时创建这些参与者,而不是在请求进入时创建,否则在建立连接时

我正在用Spray 1.2.0和Akka 2.2.3创建一个RESTful API。Scala版本是2.10(如果需要,所有这些版本都可以更改)。在我的业务层中,我必须通过SSH连接与遗留系统进行通信。这些连接需要很长时间(1-3分钟)才能建立,如果空闲时间过长,这些连接将过期。我在一个测试应用程序上分别编写了SSH代码,现在我将其包装在一个actor中

如何指定一个SSH参与者池,该池独立于处理HTTP请求所使用的参与者池?我需要在启动时创建这些参与者,而不是在请求进入时创建,否则在建立连接时请求超时。另外,我如何独立于Spray的演员控制演员池的大小

如何指定一个SSH参与者池,该池独立于处理HTTP请求所使用的参与者池

您可以为这组参与者创建一个

这些连接需要很长时间(1-3分钟)才能建立,如果空闲时间过长,这些连接将过期

您可以在actor启动时自动设置连接。每个参与者可以安排定期的保持活动状态操作,以避免连接超时

我需要在启动时创建这些演员。我如何独立于Spray的演员控制演员池的大小


我猜你必须在应用程序启动时手动创建所需数量的这些参与者。

对于后代来说,这是我最终采用的解决方案。我定义了一个路由器参与者。这会自动创建我的ssh参与者的实例并将消息路由到它们。我还告诉那个演员使用PinnedDispatcher。这个调度器说,我的路由器中的每个参与者都将在自己的线程上运行并停留在那里,这是必要的,因为Ssh参与者所依赖的Ssh库Jsch使用阻塞io

actor-ref工厂看起来与其他示例略有不同,因为我使用的是springscala

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参与者池中的一个,该池可以通过命令的输出进行响应:

(SshRouter ? Execute(cmd)).mapTo[String]

因此,如果我正确理解您和dispatcher文档,我将使用自定义dispatcher为我的SSH参与者手动创建ActorRef集合。我是否必须编写自己的解决方案来平衡路由参与者将消息转发到的池中的哪个SSH参与者?找到了最后一部分的答案。Akka有一个充当参与者池的路由()。