加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

斯卡拉 – Akka FSM转到未来

发布时间:2020-12-16 09:08:13 所属栏目:安全 来源:网络整理
导读:我想在将来改变FSM状态,但我不工作.. 我想我正在寻找pipeTo like方法. When(State.Waiting) { case Event(anyMsg,anyData) = asyncCode.map(res = if (res == 1) { goto(State.Working) using Data.MyData } else { stay() replying "bad response" } )} got
我想在将来改变FSM状态,但我不工作..
我想我正在寻找pipeTo like方法.

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
   }
}

可能有一个更好的主意来解决问题

解决方法

不要在将来改变你的演员的状态或不在主“线程”内的任何东西.
解决问题的正确方法是向self发送一条消息,它只会改变状态,比如

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()
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读