使用Scala + Akka生成唯一ID

困惑

首先让我解释一下我的问题。我有一个存储所有已知ID的存储库。这个仓库是一个演员,叫他repo我定义了GetId(id: Id)消息,并GetIdReply(Option[Id])在此actor中定义了消息,以便请求特定的ID,消息已经存在或不存在时得到答复。我会说很简单。

现在,我有另一个演员负责生成唯一的ID。因此,我尝试实现此功能,例如:

private def getUniqueId(): Id = {
  implicit val timeout = Timeout(500.millis)
  var id = Id(UUID.randomUUID().toString)
  val getIdReply = repo ? GetId(Id)
  getIdReply.mapTo[GetIdReply] onSuccess {
    case success =>
      success.id match {
        case Some(matchedId) =>
          // Generated ID already exists, let's call this function recursively
          id = getUniqueId
        case None =>
          // Generated ID is OK
      }
  }
  id
}

我尝试将其实现为递归,并且只有在首次尝试生成的ID是唯一的情况下,此功能才有效。在第二次及所有其他尝试中,它不起作用。因此,我的问题是如何正确构造这样的函数,该函数将“循环”直到ID真正唯一?

谢谢!

最好

有翼的潜艇

由于您的结果取决于与参与者的交流,因此您的函数必须返回Future

private def getUniqueId(): Future[Id] = {
  implicit val timeout = Timeout(500.millis)
  val id = Id(UUID.randomUUID().toString)
  repo ? GetId(id) flatMap {
    case GetIdReply(Some(_)) => getUniqueId()
    case GetIdReply(None) => Future.successful(id)
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Lucene生成唯一的ID?

使用 JavaScript 生成唯一的按钮 ID

使用python生成唯一ID

Firebase(Swift)-仅使用数字生成唯一ID?

如何使用node.js生成唯一ID

Laravel使用Storage :: put生成唯一的ID

使用 Python 生成唯一 ID 时出错

如何使用ERB为提交按钮生成唯一的ID

Scala从列表中生成唯一对

使用 dplyr 和串联生成唯一 ID 和组 ID

如何使用Python为相同的输入ID生成唯一ID?

如何使用PHP生成唯一的行ID以唯一标识购物车中的购物车项目?

使用RecordLinkage包为大型数据集生成唯一的ID列

如何使用数据框在python中生成唯一的服务id号

使用Redis在有限范围内生成唯一ID

如何获取由FireStore使用Android生成的唯一用户ID?

使用Golang推送Firebase后,如何提取自动生成的唯一ID?

如何使用Spring Data Couchbase SDK生成带有前缀的唯一ID?

如何使用Objective-c为iPhone / iPad生成设备的唯一ID

如何使用Pyspark生成不唯一的增量sub_id

有什么方法可以在不使用IDFA的情况下为设备生成唯一ID?

使用HTML更新Firebase中唯一随机生成的ID / KEY中的数据

生成唯一ID

使用Rails即时生成唯一令牌

使用python生成唯一json的问题

要生成唯一的数字id,不能使用node-uuid,因为后端需要数字id

生成具有 6 个字符的唯一 ID - 已使用过多 ID 时的处理

如何使用 Node.js/JavaScript 生成唯一的用戶 ID,如 Zerodha 的用戶 ID

使用Visual Basic向SQL Server数据库添加一行数据时生成唯一ID