Scala Actor:带参数的 ReceiveTimeout
Scala Actor: ReceiveTimeout with Param
是否可以给ReceiveTimeout传一个参数?我有以下代码:
case ReceiveTimeout =>
self ! BuildJobEvents(asperaClient.getWorkOrder(workOrderID), dateTime)
当我尝试传递参数时,该参数无效。我查看了 documentation here,也没有看到任何关于使用参数的内容。是否可以将参数传递给 ReceiveTimeout?如果没有,我该如何解决这个问题?
编辑
我有一个 actor 系统,可以将事件记录到 table。每个事件都有一个时间戳,记录它发生的时间。我需要沿着链传递这个时间戳,这样我就可以用它来确定数据(它有一个 updated_at 时间戳)是否真的改变了。
例如:
当我调用 API 服务时,假设我收到这样的事件:
Item {
event1 {
stated: 5:00pm,
completed: 5:10pm
},
event1 {
stated: 5:10pm
}
data: data
updated_at: 5:11pm
}
我想在这里记录事件 1 和事件 2。我还想在消息中传递 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)
}
}
是否可以给ReceiveTimeout传一个参数?我有以下代码:
case ReceiveTimeout =>
self ! BuildJobEvents(asperaClient.getWorkOrder(workOrderID), dateTime)
当我尝试传递参数时,该参数无效。我查看了 documentation here,也没有看到任何关于使用参数的内容。是否可以将参数传递给 ReceiveTimeout?如果没有,我该如何解决这个问题?
编辑
我有一个 actor 系统,可以将事件记录到 table。每个事件都有一个时间戳,记录它发生的时间。我需要沿着链传递这个时间戳,这样我就可以用它来确定数据(它有一个 updated_at 时间戳)是否真的改变了。
例如: 当我调用 API 服务时,假设我收到这样的事件:
Item {
event1 {
stated: 5:00pm,
completed: 5:10pm
},
event1 {
stated: 5:10pm
}
data: data
updated_at: 5:11pm
}
我想在这里记录事件 1 和事件 2。我还想在消息中传递 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)
}
}