5

我将Akka PersistenceCluster Sharding一起使用。将依赖项提供给此类PersistentActor-s的正确方法是什么?

据我了解,将它们作为构造函数参数传递是不可能的,因为集群分片正在创建这些参与者。

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

使用 anobject来实现单例会导致繁琐的测试并且看起来很糟糕。

什么是正确的方法?

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

4

1 回答 1

0

更新版本:我之前提供的解决方案不允许在单元测试用例中模拟被测参与者的服务。

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

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

要在基于 spring 的应用程序中启用方面编织,您应该检查 Spring doc 上的文档。在我的情况下,在码头应用程序服务器上,它包括使用 spring 代理并将其设置在 jvm 参数中。

就测试而言,我:

  • 为注入的服务创建了设置器
  • 为我的演员创建​​了基本配置,并为我的依赖项引用了空 bean
  • 在我的测试用例中实例化了演员
  • 用模拟替换演员的服务
  • 运行参与者的内部方法并检查结果、参与者的状态或对依赖项的调用

原来的:

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

所以我创建了一个类来保存应用程序上下文并提供一个静态方法来检索我需要的 bean。我只在需要时才检索 bean,这样:

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

这不是传统的,但它确实有效,你怎么看?希望否则它可能会帮助另一个人。

于 2015-03-09T19:02:23.300 回答