美文网首页
Akka框架之Actor内置状态转换、Future、Agent

Akka框架之Actor内置状态转换、Future、Agent

作者: 夏与清风 | 来源:发表于2019-07-09 14:51 被阅读0次

    Actor内置状态转换

    在很多情况下Actor的业务逻辑可能比较复杂,Actor可能需要根据不同的状态对同一条消息作出不同的处理。一个Actor内部消息处理函数可以拥有多个不同的状态,在特定状态下,可以对同一消息进行不同的处理,状态之间也可以任意切换。

    BabyActor WatchActor main及运行结果

    当BabyActor收到消息时,系统会调用onReceive()处理消息,然后做状态切换。一旦完成状态切换,后续有新的消息时,就不会再由onReceive()处理消息了,而是由angry和happy直接处理(因为angry和happy本身就是消息处理函数),这样就封装了Actor的多个不同的处理逻辑。


    询问模式:Actor中的Future

    由于Actor之间都是通过异步消息来通信的,当发送一条消息给Actor后,通常只能等待其返回结果。与异步方法不同,在你发送异步消息后,接收消息的Actor可能还没处理消息,而调用方就已经返回了。此模式与Future模式很类似,不同点是在传统异步调用中需要用函数调用,而Actor中只是发送了一条消息。

    Worker及Printer的Actor定义 WatchActor main方法及运行结果

    多个Actor同时修改数据:Agent

    Akka使用Agent组件来实现多个Actor对同一共享变量进行读写功能。一个Agent提供了对一个变量的异步更新,当一个Actor想改变Agent的值时,它会向Agent下发一个动作(action)。当多个Actor同时改变Agent时,这些action将会在ExecutionContext中被并发调度执行。在任意时刻,一个Agent最多只能执行一个action,对于某个线程来说,它执行action的顺序与它的发生顺序一致,对不同线程来说,这些action可能会交织在一起。

    Agent的修改可以使用send()和alter()方法。它们都可以向Agent发送一个修改动作,send()无返回值,alter()会返回一个Future对象用于跟踪Agent的执行。

    场景:用10个Actor一起对一个Agent执行累加操作,每个Actor累加1000次,若执行正确将得到10000,否则值可能小于10000;

    累加器Actor main方法及运行结果

    --参考文献《实战Java高并发程序设计》

    相关文章

      网友评论

          本文标题:Akka框架之Actor内置状态转换、Future、Agent

          本文链接:https://www.haomeiwen.com/subject/ptsehctx.html