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

Scala向自己发送消息好还是坏?

发布时间:2020-12-16 09:54:02 所属栏目:安全 来源:网络整理
导读:我正在使用json4s和play框架,我有一些地方可以在将来运行post / get请求,然后onSuccess将响应解析为一个对象并让actor将它发送回自身..这是一个例子: WS.url(authUrl).post("username=adminpassword=admin") map { response = self ! (parse(response.body)
我正在使用json4s和play框架,我有一些地方可以在将来运行post / get请求,然后onSuccess将响应解析为一个对象并让actor将它发送回自身..这是一个例子:

WS.url(authUrl).post("username=admin&password=admin") map {
  response =>
    self ! (parse(response.body)  "body").extract[AuthObject]
}

然后回到receive方法:

case AuthObject(_,sid) => //handle authorization token

这是不好的做法吗?什么是正确的方法去做?我看到的优点是能够让你的演员数据流由单一控制结构处理,但当然我说这是一个优势是错误的.

解决方法

向演员发送未来结果的 recommended方法是使用管道模式.您的代码将如下所示:

def receive:Reveice= {
  case authUrl:String => 
    val authObjectF=WS.url(authUrl).post("username=admin&password=admin") map { response => 
      (parse(response.body)  "body").extract[AuthObject]
    } 
    authObjectF pipeTo self
}

这被认为优于map {x =>自己! x}是错误处理.如果您不处理错误情况,它们将被默默地丢弃.
使用pipepattern,错误将包装在akka.actor.Status.Failure中,并发送到目标actor(在本例中为self)代替结果.

将未来结果管道化为self是一种常见模式,可能与context.become / unbecome和stash一起使用以创建状态机.

在map / flatmap中关闭actor内部可变状态仍然很容易,并且在这样做时打破了actor模型的并发保证.如果你在演员中操纵未来我强烈建议你阅读这篇http://doc.akka.io/docs/akka/2.3.2/general/jmm.html#jmm-shared-state,如果你还没有这样做的话.

(编辑:李大同)

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

    推荐文章
      热点阅读