akka学习教程(五) inbox消息收件箱

来源:互联网 发布:淘宝网民族风女套装 编辑:程序博客网 时间:2024/05/17 05:51

akka系列文章目录

  • akka学习教程(十四) akka分布式实战
  • akka学习教程(十三) akka分布式
  • akka学习教程(十二) Spring与Akka的集成
  • akka学习教程(十一) akka持久化
  • akka学习教程(十) agent
  • akka学习教程(九) STM软件事务内存
  • akka学习教程(八) Actor中的Future-询问模式
  • akka学习教程(七) 内置状态转换Procedure
  • akka学习教程(六) 路由器Router
  • akka学习教程(五) inbox消息收件箱
  • akka学习教程(四) actor生命周期
  • akka学习教程(三) 不可变对象
  • akka学习教程(二)HelloWord
  • akka学习教程(一)简介

我们知道,整个akka的actor系统是通过消息进行传递的,之前的几个教程都是通过一个actor来给另一个actor发消息。其实还可以使用inbox消息收件箱来给某个actor发消息,并且可以进行交互。

package akka;import akka.actor.*;import akka.event.Logging;import akka.event.LoggingAdapter;import com.typesafe.config.ConfigFactory;import scala.concurrent.duration.Duration;import java.util.concurrent.TimeUnit;import java.util.concurrent.TimeoutException;/** * Created by liubenlong on 2017/1/12. */public class InboxTest extends UntypedActor {    private final LoggingAdapter log = Logging.getLogger(getContext().system(), this);    public enum Msg{        WORKING, DONE, CLOSE;    }    @Override    public void onReceive(Object o) throws Throwable {        if(o == Msg.WORKING){            log.info("i am working.");        }else if(o == Msg.DONE){            log.info("i am done");        }else if(o == Msg.CLOSE){            log.info("i am close.");            getSender().tell(Msg.CLOSE, getSelf());//告诉消息发送者我要关闭了。            getContext().stop(getSelf());//关闭自己        }else{            unhandled(o);        }    }    public static void main(String [] args){        ActorSystem system = ActorSystem.create("inbox", ConfigFactory.load("akka.conf"));        ActorRef inboxTest = system.actorOf(Props.create(InboxTest.class), "InboxTest");        Inbox inbox = Inbox.create(system);        inbox.watch(inboxTest);//监听一个actor        //通过inbox来发送消息        inbox.send(inboxTest, Msg.WORKING);        inbox.send(inboxTest, Msg.DONE);        inbox.send(inboxTest, Msg.CLOSE);        while(true){            try {                Object receive = inbox.receive(Duration.create(1, TimeUnit.SECONDS));                if(receive == Msg.CLOSE){//收到的inbox的消息                    System.out.println("inboxTextActor is closing");                }else if(receive instanceof  Terminated){//中断 ,和线程一个概念                    System.out.println("inboxTextActor is closed");                    system.shutdown();                    break;                }else {                    System.out.println(receive);                }            } catch (TimeoutException e) {                e.printStackTrace();            }        }    }}

输出结果:

[INFO] [01/12/2017 14:35:24.207] [inbox-akka.actor.default-dispatcher-2] [akka://inbox/user/InboxTest] i am working.[INFO] [01/12/2017 14:35:24.223] [inbox-akka.actor.default-dispatcher-2] [akka://inbox/user/InboxTest] i am done[INFO] [01/12/2017 14:35:24.223] [inbox-akka.actor.default-dispatcher-2] [akka://inbox/user/InboxTest] i am close.inboxTextActor is closinginboxTextActor is closed

参考资料

  • 书籍《java高并发程序设计》
  • AKKA官方文档
0 0