如何在Lagom中使用Akka Persistence进行数据库反向查找?

时间:2019-03-27 20:03:14

标签: scala akka lagom

我正在使用Lagom构建令牌认证微服务,并且遇到了麻烦。我的数据模型当前为

table Token (
  groupName varchar(255) PK,
  token varchar(255) (logical UUID type)
)

我有三种方法createTokengetTokenvalidateToken。前两个使用组名,该组名很好地映射到https://www.lagomframework.com/documentation/current/scala/PersistentEntity.html#Persistent-Entity中列出的实体ID。
第三个在请求的主体中获取令牌,如果成功,则返回带有groupNametoken的json有效负载。

Lagom对实际的SQL进行抽象,然后通过执行以下操作来访问持久层:val ref = persistentEntityRegistry.refFor[DptokenEntity](groupName)。实际的持久性代码是这样的:

class DptokenEntity extends PersistentEntity {

  override type Command = DptokenCommand[_]
  override type Event = DptokenEvent
  override type State = DptokenState

  override def initialState: DptokenState = DptokenState(None)

  override def behavior: Behavior = {
    case DptokenState(_) => Actions()
      .onCommand[PersistToken, TokenResponse] {
      case (PersistToken(token), ctx, state) =>
        ctx.thenPersist(TokenPersisted(token)) { _ =>
          ctx.reply(token)
        }
    }.onReadOnlyCommand[GetToken, TokenResponse] {
      case (GetToken(groupName), ctx, state) =>
        state.token match {
          case Some(token) => ctx.reply(token)
          case None => ctx.invalidCommand(s"No token exists for $groupName")
        }
    }.onEvent {
      case (TokenPersisted(token), _) => DptokenState(Some(token))
    }
  }
}

case class DptokenState(token: Option[TokenResponse])

由于要通过令牌查找entity,表面上我会在数据库中获得新的一行,因此,我努力理解如何对上述模型进行反向查找是token-> groupName,这给更新等带来了巨大的问题。

我想先了解一下SO方面的优秀人才,然后才删除Event Sourcing的资料并使用原始的Slick。

1 个答案:

答案 0 :(得分:1)

您确定要使用CQRS和Lagom永久实体吗? 如果您需要实现通过token查找实体的案例,则需要为此使用Read-Side。但是我不确定Lagom PE是您的正确选择。尝试使用基本的PersistentActor代替Lagom PE。