如何在Spray应用程序中为业务层创建单独的长期演员池?

时间:2014-09-23 16:38:56

标签: scala akka actor spray

我正在使用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的演员控制演员池的大小?

2 个答案:

答案 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]