繁体   English   中英

Scala 演员:带参数的 ReceiveTimeout

[英]Scala Actor: ReceiveTimeout with Param

是否可以将参数传递给 ReceiveTimeout? 我有以下代码:

case ReceiveTimeout =>
      self ! BuildJobEvents(asperaClient.getWorkOrder(workOrderID), dateTime)

当我尝试传递参数时,但这是无效的。 我查看了此处文档,也没有看到有关使用参数的任何信息。 是否可以将参数传递给 ReceiveTimeout? 如果没有,我将如何解决这个问题?

编辑

我有一个演员系统,可以将事件记录到表中。 每个事件都有一个时间戳,注明它何时发生。 我需要沿着链传递这个时间戳,所以我可以使用它来确定数据(具有 updated_at 时间戳)是否实际发生了变化。

例如:当我调用 API 服务时,假设我得到一个这样的事件:

Item {
  event1 {
    stated: 5:00pm,
    completed: 5:10pm
  },
  event1 {
    stated: 5:10pm
  }
  data: data
  updated_at: 5:11pm
}

我想在这里记录 event1 和 event2。 我还想在消息中传递 5:11 pm 的 dateTime 值,以便我们可以将其用于下一次调用:

Item {
  event1 {
    stated: 5:00pm,
    completed: 5:10pm
  },
  event1 {
    stated: 5:10pm,
    completed: 5:12pm
  }
  data: data
  updated_at: 5:12pm
}

在这种情况下,我不想记录 event1,因为时间戳在 5:11 之前,因此演员已经记录了它。 不过,我会再次记录 event2。

您可能正在寻找可以用来实现轻量级状态机的context.become

class MyActor extends Actor {

  override def receive: Receive = {
    case something =>
      context.setReceiveTimeout(5.seconds)
      context.become(waitForTimeout(something))
  }

  private[this] def waitForTimeout(param: Any): Receive = {
    case ReceiveTimeout =>
      // do something with something
  }
}

如果您混合FSM特性,您将有更多的可能性。

编辑

阅读您的事件示例,也许是这样的?

private def receiveNextEvent(lastTimestamp: DateTime): Receive = {
  case event =>
   if (event.stated > lastTimestamp) {
     logEvent(event)
     context.become(receiveNextEvent(event.stated)
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM