将依赖注入到集群持久性Akka actor中的正确方法?

时间:2015-01-29 09:37:48

标签: scala dependency-injection akka akka-cluster akka-persistence

我正在Akka Persistence使用Cluster Sharding。在PersistentActor - s中提供依赖关系的正确方法是什么?

据我所知,传递它们作为构造函数参数是不可能的,因为Cluster Sharding正在创建这些actor。

使用Spring / Guice / etc。不是惯用的Scala(可能还有其他问题(?))。

使用object来实现单例进行繁琐的测试并且看起来很糟糕。

什么是正确的方法?

P.S。如果您打算建议Cake模式,请在此特定的Akka Persistence Cluster Sharding上下文中提供示例代码。

1 个答案:

答案 0 :(得分:0)

更新版本: 我之前提出的解决方案不允许在单元测试案例中模拟被测演员的服务。

我正在使用在该文章http://letitcrash.com/post/55958814293/akka-dependency-injection上提供的一种解决方案,称为"方面编织"这包括使用面向方面的编程在actor中注入依赖项。 此解决方案可用于在不受Spring容器控制的任何bean上注入Spring依赖项(可能对遗留代码有用)。

上述文章提供了一个完整的示例:https://github.com/huntc/akka-spring/blob/f137c98b621517301f636e6ea03519388fcd5fff/src/main/scala/org/typesafe/Akkaspring.scala

要在基于spring的应用程序中启用方面编织,您应该查看Spring doc上的文档 就我而言,在jetty应用程序服务器上,它包含使用spring代理并在jvm参数中设置它。

就测试而言,我:

  • 为注入的服务创建了setter
  • 为我的actor创建了基本配置,其中为我的依赖项引用了空bean
  • 在我的测试用例中实例化了actor
  • 用模拟取代演员的服务
  • 运行actor的内部方法并检查结果,actor的状态或对依赖的调用

ORIGINAL:

  

我在Spring应用程序中使用Akka来启用群集。首先   它提出了以下问题:你不能注入spring管理   正如你所说,actor构造函数中的依赖项。 (它试图   序列化应用程序上下文并失败)

     

所以我创建了一个包含应用程序上下文的类并提供了一个   用于检索我需要的bean的静态方法。我只检查豆子   需要它,这样:

public void onReceive{
  if (message instanceof HandledMessage) {
    (MyService) SpringApplicationContext.getBean("myService");
    ...
  }
}
     

它不是常规的,但它能完成这项工作,你怎么看?希望   否则它可能会帮助另一个。