java - Akka 。我应该以参与者的身份实现所有服务/DAO 吗?

标签 java scala akka

在 Java 世界中,使用 3 层架构(表示层、服务层和 DAO 层)设计应用程序被认为是最佳实践。

但我目前的应用程序使用 Scala 和 Akka。在我的一位 Actor 中,收到一些消息后,我需要从数据库中检索国家列表。如果我使用 Java,很可能我会创建 CountryService 接口(interface)及其实现,以及具有相应实现的 CountryDao

但是 Akka 的方法是什么?我应该用 Actor 包装 CountryService 吗?我认为这是个坏主意,因为在这种情况下,我的 Actor 在收到一些消息后需要发送另一条消息来检索所有国家并在回复原始发件人之后。

最佳答案

这纯粹是基于我使用 Akka 的经验,其他人可能会不同意。

如果您的 Country Actor 没有状态,则不要将其设为 Actor。只需简单地使用 Scala 的 Future API 并将其通过管道返回给调用它的 Actor。这样,数据库调用可以在与您的 Actors 完全不同的执行上下文中运行(您不应该在 Actors 内部进行阻塞调用)。如果你正在考虑缓存那么我的意见是缓存仍然不是真正的状态并且使用 Guava Cache是线程安全的,可以解决问题。

所以这看起来像这样:

class MyActor(countryService: CountryService) extends Actor {
  // ...
  val result: Future[Countries] = countryService.getCountries
  result.pipeTo(self)
  // ...
  def recieve = {
    case Countries(c) => // use c
  }
  // ...
}

在某些情况下,您希望将其包装到单独的 CountryActor 中,但这些情况很特殊:即您严重依赖 Actor 路径并希望在特定路径访问服务 actor,想要专门处理错误,有一些重试逻辑等。

关于java - Akka 。我应该以参与者的身份实现所有服务/DAO 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30429266/

相关文章:

postgresql - DB 的 Scala future

postgresql - 使用 Slick 在 Akka 的 Actor 中插入记录的最佳方法是什么?

java - 简单的 Java 代码,无法创建 C++ 等效代码(私有(private)静态成员和公共(public)访问器方法)

斯卡拉/Play : load template dynamically

Java:整数中最高1位的偏移量

arrays - Scala:将两个数组合并为一个结构

java - Play 2.2 中的性能问题

java - 创建一个路由器参与者,参数化 akka java 中每个路由的创建

java - 使用 Hadoop 查找包含特定字符串的文件

java - 读取顶点并创建边