是否可以将参数传递给ReceiveTimeout?我有以下代码:
case ReceiveTimeout =>
self ! BuildJobEvents(asperaClient.getWorkOrder(workOrderID), dateTime)
当我尝试传递参数时,但这是无效的。我查看了documentation here,并没有看到任何关于使用参数的信息。是否可以将参数传递给ReceiveTimeout?如果没有,我将如何解决这个问题?
修改
我有一个将事件记录到表中的actor系统。每个事件都有一个时间戳,注意它何时发生。我需要沿链传递此时间戳,因此我可以使用它来确定数据(具有updated_at时间戳)是否实际已更改。
例: 当我调用API服务时,说我得到这样的事件:
Item {
event1 {
stated: 5:00pm,
completed: 5:10pm
},
event1 {
stated: 5:10pm
}
data: data
updated_at: 5:11pm
}
我想在这里记录event1和event2。我还想在消息中传递dateTime值为晚上5:11,所以我们可以将它用于下一个调用:
Item {
event1 {
stated: 5:00pm,
completed: 5:10pm
},
event1 {
stated: 5:10pm,
completed: 5:12pm
}
data: data
updated_at: 5:12pm
}
在这种情况下,我不想记录event1,因为时间戳在5:11之前,因此,actor已经记录了它。我会再次记录event2。
答案 0 :(得分:1)
您可能正在寻找可用于实施轻量级状态机的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)
}
}