Scala + Play Framework + Slick + Akka - 来自 Akka Actor 的数据库访问

2024-02-24

在收到 TCP 特定消息时,我需要查询我的数据库。为此,我创建了一个名为 DBActor 的 Actor,并将其加载到Application.scala file

    class Application @Inject() (system: ActorSystem) extends Controller {

      val tcpServer = system.actorOf(Props[TCPServer], "tcpserver")
      val dbActor = system.actorOf(Props[DBActor], "dbActor")
    }

Tcp 服务器是接收消息的 Actor,需要将其推送到 DB Actor 上

      val handler = context.actorSelection("/dbActor")

根据 Play Framework 规范,DB actor 就是这样初始化的

    object DBActor {
      def props() =
        Props(classOf[DBActor])
    }


    class DBActor @Inject() (protected val dbConfigProvider:
         DatabaseConfigProvider) extends Actor 
         with HasDatabaseConfigProvider[JdbcProfile] 
         with ActorLogging 
         with TableComponent {

      import akka.io.Tcp._
      import driver.api._

      val table = TableQuery[Table]

      def receive: Receive = {
        case GetConfig(id) => {
          sender ! Await.result(db.run(table.filter(_.id=== id).result.headOption), 
                Duration.Inf)
            .map { x => x.config }
        }
      }
    }

目前,由于错误,演员尚未构建

    Error injecting constructor, java.lang.IllegalArgumentException: 
      no matching constructor found on class tcp.DBActor for arguments []
      at controllers.Application.<init>(Application.scala:17)
      at controllers.Application.class(Application.scala:17)

所以我需要一种方法将数据库配置注入 DBactor 中以查询数据库或替代方案。之前我评估过注入一个DAO或者将我需要的DAO改造成一个actor,都失败了。

此时的问题是,授予参与者访问数据库或至少访问控制器的权限是否有意义?如果做不到,有什么替代方案?


你需要的是一个注入的演员。完整的描述可以在游戏文档中找到(https://www.playframework.com/documentation/2.5.x/ScalaAkka#Dependency-injecting-actors https://www.playframework.com/documentation/2.5.x/ScalaAkka#Dependency-injecting-actors),但要点如下:

您可以像这样定义 actor 绑定:

bindActor[DBActor]("db-actor")

并将 actor 注入到控制器中,如下所示:

class Application @Inject() (@Named("db-actor") dbActor: ActorRef) extends Controller {

另一方面,你应该避免Await.result只要有可能。在您的场景中,这可能很容易被替换为:

val senderRef = sender()
db.run(table.filter(_.id=== id).result.headOption)
  .map(res => senderRef ! res.config)

请注意,发件人引用之前已存储,因为它在内部不再有效map(参见 scaladocsender()方法)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala + Play Framework + Slick + Akka - 来自 Akka Actor 的数据库访问 的相关文章

  • ebean 映射到 BYTEA 的数据类型是什么?

    我有一个游戏 2 0 2 需要在数据库中存储一些文件的应用程序 我们使用 Ebean 作为 ORM 我相信我的数据库中需要一个 BYTEA 列来存储该文件 但我不确定在我的模型中使用什么数据类型 我应该使用某种Blob 或者只是一个byte
  • 带可变参数的 Spark UDF

    如文档中所示 列出最多 22 个参数是唯一的选择吗 https spark apache org docs 1 5 0 api scala index html org apache spark sql UDFRegistration ht
  • 在 Spark 中将多行汇总为单行和单列

    我有一个如下的火花 DF 我需要汇总具有与单行相同 ID 的多行 但值应该不同 id values 1 hello 1 hello Sam 1 hello Tom 2 hello 2 hello Tom 预期输出 id values 1 h
  • Scala 中的行聚合

    我正在寻找一种方法在 Scala 的数据框中获取一个新列来计算min max中的值col1 col2 col10对于每一行 我知道我可以使用 UDF 来做到这一点 但也许有一种更简单的方法 Thanks Porting 这个Python答案
  • Scala 功能设计模式目录

    一周以来我一直在阅读 Scala 编程 作者一步一步地介绍了该语言的元素 但我仍然很困惑何时使用演员 闭包 柯里化等功能性的东西 我正在寻找功能结构的典型用例或最佳实践的目录 我并不是说在 Scala 中重新实现像 GoF 这样的众所周知的
  • Scalaz 拆箱标记类型不会自动拆箱

    Reading http eed3si9n com learning scalaz Tagged type html http eed3si9n com learning scalaz Tagged type html并尝试示例代码 imp
  • 相当于 scala 中的 python repr()

    有没有相当于Python的东西reprscala 中的函数 即 您可以给任何 scala 对象提供一个函数 它将生成该对象的字符串表示形式 该对象是有效的 scala 代码 eg val l List Map 1 gt a print re
  • xsbt 插件 1.0.0-M7 和 scalatra

    我尝试在我的 scalatra 项目中将 xsbt 插件升级到 1 0 0 M7 但 scalatra 似乎与此版本不兼容 当我尝试重新加载项目时 出现以下错误 我尝试过 scalatra 2 3 0 版本 问候 德斯 java lang
  • 使用 org.apache.hadoop/* 依赖项离线编译 sbt 时遇到的问题

    使用依赖于 org apache hadoop 包的 sbt 进行离线编译时遇到很多麻烦 一个简单的build sbt name Test version 1 0 scalaVersion 2 10 4 libraryDependencie
  • Scala 2.8 中 <:<、<%< 和 =:= 的含义是什么?它们的文档在哪里?

    我可以在 API 文档中看到Predef https scala lang org files archive api 2 8 2 scala Predef 24 html它们是通用函数类型 From gt To 的子类 但仅此而已 嗯什么
  • 在 Scala 中反转地图的优雅方法

    目前正在学习Scala 需要反转Map 来进行一些反转值 gt 键查找 我一直在寻找一种简单的方法来做到这一点 但只想到了 Map origMap map kvp gt kvp 2 gt kvp 1 有人有更优雅的方法吗 假设值是唯一的 则
  • Map 和 Set 的实际类(不是抽象类,也不是特征类)是什么?

    在 Scala 中 映射和集合文字可以通过以下方式创建 val m Map 1 gt a 以及引用的类型m字面意思都是Map Int String 然而 scala文档表明Map实际上是一个特征 具有需要实现才能实例化的抽象成员 scala
  • 如何在每行中添加行号?

    假设这些是我的数据 Maps and Reduces are two phases of solving a query in HDFS Map is responsible to read data from input location
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • 在 Scala 中创建任意类作为 monad 实例

    为了使任何东西都可以在 monad 上下文中操作 如果使用 Haskell 我只需在任何地方为给定类型添加类 Monad 的实现 所以我根本不接触数据类型定义的来源 像 人造的东西 data Z a MyZLeft a MyZRight a
  • 如何从 Play WSClient 的字符串创建 WSResponse 对象

    文档 https www playframework com documentation 2 4 x JavaTestingWebServiceClients Mock the web service建议使用模拟Web服务测试基于WSCli
  • 如何从DataFrame中获取最后一行?

    我有一个DataFrame 该DataFrame有两列 value 和 timestamp timestmp 是有序的 我想获取DataFrame的最后一行 我该怎么办 这是我的输入 value timestamp 1 1 4 2 3 3
  • 通过 SSH 的 sbt (Scala) 结果找不到命令,但如果我自己这样做就可以工作

    所以我正在尝试做一些涉及跑步的事情sbt通过 SSH 命令 这就是我正在尝试的 ssh my username
  • 一般处理枚举的 Scala 类

    我想创建一个通用类来保存枚举的值 并且还允许访问枚举的可能值 以属性编辑器为例 您需要知道属性的当前值 并且还需要能够知道该属性的其他合法值 并且枚举的类型不应该提前知道 您应该能够使用任何类型的枚举 我的第一个想法是这样的 class E
  • 使用 lift-json 反序列化具有 Map[String,Any] 属性的案例类

    几天来我一直在努力解决一些通过 lift json 应该很简单的事情 将映射序列化为 JSON 我知道 我知道 根对象还不能是 List 或 Map 但我愿意暂时包装在一个案例类中 但我仍然无法让它工作 感谢一些堆栈溢出帮助 我已经可以进行

随机推荐

  • 从 Node 中删除 null 属性和空子节点

    我有一个Node http groovy codehaus org api groovy util Node html我想删除所有null在将其写入文件之前 递归地删除属性和空子项 我下面的内容有效 但似乎应该有一个内置方法 我错过了什么吗
  • 谷歌驱动器 API v3 创建文件夹失败无提示

    通过 OAuth 成功进行全范围身份验证后 https www googleapis com auth drive 我根据示例创建一个文件夹创建文件夹 https developers google com drive v3 web fol
  • Java 2D 碰撞?

    大家好 我正在制作一个 2D java 游戏 我正在尝试找出如何制作一个好的碰撞代码 我目前正在使用以下代码 public void checkCollision Rectangle player rectangle new Rectang
  • CMake 将共享库链接到静态库

    我正在将 AutoTools 项目移植到 CMake 自动工具的作用 构建一些静态库 构建一些共享库并将静态库链接到共享库 构建一个可执行文件 将其链接到共享库 我用 CMake 做了什么 构建一些静态库 add library stati
  • JavaFX 中的 ListView 样式

    我有一个列表视图 我想更改背景颜色和文本填充 我尝试过执行以下操作 playlistView setStyle fx background color blue fx text fill black 但是 这行不通 但是 以下内容正在起作用
  • ADO.NET 中 SqlConnection (SQL-Server) 的 SPID

    我可以得到一个SPID from a SqlConnection对象 SQL Server 数据库 中ADO NET 连接对象在其生命周期内的 SPID 是否始终相同 select SPID给你 spid 它应该是常量 但如果您有连接池 则
  • '#selector' 指的是未暴露给 Objective-C 的方法

    新的 Xcode 7 3 通过 addTarget 传递参数通常对我有用 但在这种情况下它会在标题中抛出错误 有任何想法吗 当我尝试将其更改为 objc 时 它会抛出另一个错误 谢谢你 cell commentButton addTarge
  • jquery:如何获取id属性的值?

    基本的jquery问题 我有一个选项元素如下
  • 如何在 SignalR hub 的 Unity IoC 容器中注入依赖项?

    我有一个在 ASP NET MVC 5 框架之上用 c 编写的应用程序 我实施了Unity Mvc https www nuget org packages Unity Mvc 进入我的项目 现在 我正在尝试将依赖项对象注入到我的Signa
  • 将表格放入 Bootstrap 弹出窗口

    我有一个 Bootstrap 弹出窗口 我试图将一个表格放入其中 但当我单击它时它不会显示 这是第一次在弹出窗口中尝试 HTML 所以我不确定如何正确执行它 谢谢 function data toggle popover popover h
  • 如何使用 BeautifulSoup 抓取页面?页面源与检查元素不匹配

    我正在尝试从中抓取一些东西这个梦幻篮球页面 http fantasy espn com basketball league scoreboard leagueId 633975 我使用 Python 3 5 中的 BeautifulSoup
  • 使用自动布局调整 UITextField 与文本的水平大小

    可以在此处找到演示以下问题的示例项目 https github com markdorison UITextFieldContentSizeExample https github com markdorison UITextFieldCo
  • 如何使用GSON解析JSON文件

    我有一个非常简单的 JSON 其中包含产品评论 例如 reviewerID A2XVJBSRI3SWDI asin 0000031887 reviewerName abigail helpful 0 0 unixReviewTime 138
  • 对于 iOS 上的所有图像文件,PNG 是否优于 JPEG?

    Xcode 优化了 png 图像 以便它们加载得更快 但是这是否也推荐用于其他不用于按钮和 UI 的图像资源 例如照片 或者 UI 图像为 png 且 照片 为 JPEG 是一个标准吗 这里的最佳实践是什么 最佳实践是在应用程序中使用图像时
  • 如何在 Mac OS X Leopard 中检测用户所在的空间?

    Mac OS X Leopard 有一个名为 Spaces 的虚拟桌面实现 我想要以编程方式检测用户当前所在的空间 可可是优选的 but AppleScript 是可以接受的如果没有其他办法的话 我见过几个 AppleScript 实现 但
  • iOS 谷歌云端硬盘集成

    我想在我的 iOS 应用程序中与 Google Drive 集成 我已经完成了授权代码 并且正在取回 accessToken 所以我想知道 在从 Google Drive 检索 PDF 文件方面从那里开始 我的登录代码 IBAction s
  • 将 MVC 站点上传到服务器

    我已经使用 C 构建了一个 NET MVC4 网站 现在我想将其上传到互联网 我从未上传过任何网站 所以我真的不知道我需要做什么步骤 使用什么样的服务器有关系吗 因为当我通过VS2012运行网站时 我可以看到它运行在IIS Express上
  • 如何开始在 Emacs 中使用 Xiki?

    试图得到xiki http xiki org 上班 它已安装 xiki directory Users joshcheek rvm gems ruby 1 9 3 p194 gems xiki 0 6 3 据我所知 移动所有文件的 shel
  • R - ggplot2 将 x 轴值更改为非对数值

    我正在绘制一些支付分布信息 并将其缩放到对数正态 base e 后聚合数据 直方图效果很好 但我想修改 x 轴以显示非对数等效值 我的当前轴显示 0 2 5 10 值 或者 我想查看 exp 2 5 exp 5 等的值 关于如何实现这一目标
  • Scala + Play Framework + Slick + Akka - 来自 Akka Actor 的数据库访问

    在收到 TCP 特定消息时 我需要查询我的数据库 为此 我创建了一个名为 DBActor 的 Actor 并将其加载到Application scala file class Application Inject system ActorS