【问题标题】:Proper way to inject dependencies into clustered persistent Akka actors?将依赖项注入集群持久 Akka 演员的正确方法?
【发布时间】:2015-03-28 11:26:01
【问题描述】:

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

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

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

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

正确的方法是什么?

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

【问题讨论】:

  • 正如我所写 - “集群分片正在创建这些参与者”
  • 编辑:stackoverflow.com/questions/26475491/… 抱歉,我的想法在这里根本是错误的。
  • 感谢您链接到这个问题,@goral,它有点相关(尽管似乎没有提供解决方案)。
  • 发送一个包含依赖的初始化消息怎么样?它也可以在启动前由演员发送给自己。
  • 这是一个有趣的想法,但它看起来很麻烦,并且需要依赖关系是可序列化的。此外,演员本人也不知道他的依赖关系。他可以向某个知名地址上的参与者发送“给我依赖项”消息,该地址将返回依赖项。但是我们不妨首先将所有依赖项包装为参与者。

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


【解决方案1】:

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

我使用的是文章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 上的文档 就我而言,在码头应用服务器上,它包括使用 spring 代理并将其设置在 jvm 参数中。

就测试而言,我:

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

原文:

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

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

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

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

【讨论】:

  • 你如何进行测试?
  • 感谢您的提问,可耻的是我还没有进行隔离测试。我想出了一个新的解决方案,允许我在单元测试用例中注入一个模拟服务。我在该页面上找到了一个建议 letitcrash.com/post/55958814293/akka-dependency-injection ,它包括使用方面编织进行依赖注入。我将用我的新解决方案更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2016-09-15
  • 2015-09-08
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多