FSM Goto 在未来
Akka FSM Goto within future
我想在以后更改 FSM 状态,但我没有用..
我想我正在寻找类似 pipeTo 的方法。
When(State.Waiting) {
case Event(anyMsg, anyData) =>
asyncCode.map(res =>
if (res == 1) {
goto(State.Working) using Data.MyData
} else {
stay() replying "bad response"
}
)
}
goto 命令被执行 但 fsm 没有将状态更改为 State.Working
我自己发现了这个解决方法
When(State.Waiting) {
case Event(anyMsg, anyData) =>
asyncCode.map(res =>
if (res == 1) {
self ! "do job"
} else {
stay() replying "bad response"
}
)
case Event("do job", anyData) => {
goto(State.Working) using Data.MyData
}
}
可能有更好的办法解决问题
您永远不应该关闭并修改来自异步回调(例如 Future 组合器)的 actor 的状态。 FSM 方法也是如此,它们对参与者是私有的。参与者应对异步事件做出反应的唯一方式是接收消息。您的第二个代码几乎是正确的,只是您甚至不应该从回调中调用 stay() 。异步结果应作为发送给参与者的消息结束,而参与者又可以更改其状态。您可能想引入一个新的等待状态,在启动异步调用时转换到该状态,一旦完成(actor 收到结果),转到 State.Working.
以后不要更改 actor 的状态或任何不在主体 "thread" 内的内容。
解决问题的正确方法是向自己发送一条消息,这只会改变状态,例如
When(State.Waiting) {
case Event(anyMsg, anyData) =>
asyncCode.map(res =>
if (res == 1) {
self ! GoToWorking(Data.MyData)
} else {
self ! Stay
}
)
goto(State.WaitingForResponse)
}
When (State.WaitingForResponse) {
case Event(GoToWorking(data), _) =>
goto(State.Working) using data
case Event(Stay,_) =>
stay()
}
我想在以后更改 FSM 状态,但我没有用.. 我想我正在寻找类似 pipeTo 的方法。
When(State.Waiting) {
case Event(anyMsg, anyData) =>
asyncCode.map(res =>
if (res == 1) {
goto(State.Working) using Data.MyData
} else {
stay() replying "bad response"
}
)
}
goto 命令被执行 但 fsm 没有将状态更改为 State.Working
我自己发现了这个解决方法
When(State.Waiting) {
case Event(anyMsg, anyData) =>
asyncCode.map(res =>
if (res == 1) {
self ! "do job"
} else {
stay() replying "bad response"
}
)
case Event("do job", anyData) => {
goto(State.Working) using Data.MyData
}
}
可能有更好的办法解决问题
您永远不应该关闭并修改来自异步回调(例如 Future 组合器)的 actor 的状态。 FSM 方法也是如此,它们对参与者是私有的。参与者应对异步事件做出反应的唯一方式是接收消息。您的第二个代码几乎是正确的,只是您甚至不应该从回调中调用 stay() 。异步结果应作为发送给参与者的消息结束,而参与者又可以更改其状态。您可能想引入一个新的等待状态,在启动异步调用时转换到该状态,一旦完成(actor 收到结果),转到 State.Working.
以后不要更改 actor 的状态或任何不在主体 "thread" 内的内容。 解决问题的正确方法是向自己发送一条消息,这只会改变状态,例如
When(State.Waiting) {
case Event(anyMsg, anyData) =>
asyncCode.map(res =>
if (res == 1) {
self ! GoToWorking(Data.MyData)
} else {
self ! Stay
}
)
goto(State.WaitingForResponse)
}
When (State.WaitingForResponse) {
case Event(GoToWorking(data), _) =>
goto(State.Working) using data
case Event(Stay,_) =>
stay()
}