Actor编程模型——akka

介绍akka之前需要简单说一下ScalaScala号称下一代jvm语言,


集成了Java的面向对象,以及函数式编程于一体,异常强大,但也复杂,此文不作争论,姑且简单介绍。

Akka框架是基于scala以及少量java代码实现的,Scala从其2.11.0版本起将自有的底层actor库替换成了akka,可见akka的强大。

Akka官网的自吹:

Akka is a toolkit and runtime for building highly concurrent, distributed, and fault tolerant event-driven applications on the JVM.

Akka同时提供了JavaScala两种API接口,下面就Java接口为例简单介绍一下。

Ø  Actor表示

²  public class Greeting implements Serializable {

²    public final String who;

²    public Greeting(String who) { this.who = who; }

²  }

²   

²  public class GreetingActor extends UntypedActor {

²    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

²   

²    public void onReceive(Object message) throws Exception {

²      if (message instanceof Greeting)

²        log.info("Hello " + ((Greeting) message).who);

²    }

²  }

²   

²  ActorSystem system = ActorSystem.create("MySystem");

²  ActorRef greeter = system.actorOf(Props.create(GreetingActor.class), "greeter");

²  greeter.tell(new Greeting("Charlie Parker"), ActorRef.noSender());

继承UntypeActor可以定义一个actor角色的类,其中的onReceive方法可以接受来自其他actor传递过来的消息

ActorSystem类负责创建最顶层的actor,其负责管理整个系统中actors监控树。

 

Ø  分布式

ActorSystem system = ActorSystem.create("MySystem");

//获取机器2上面的一个actorgreeter

ActorSelection greeter = system.actorSelection("akka.tcp://MySystem@machine2:2552/user/greeter");

 

// 向上面的actor发送消息,Greeting表示消息

greeter.tell(new Greeting("Sonny Rollins"), ActorRef.noSender());

上面的几行代码简单展示了akka中的分布式环境中不同机器节点之间actor的相互通信方式,可以看出和Erlang很类似,即屏蔽底层节点之间的通信细节,然后提供简单API接口。

 

Ø  监控

class Supervisor extends UntypedActor {

   private SupervisorStrategy strategy = new OneForOneStrategy(

    10Duration.create("1 minute"), new Function<ThrowableDirective>() {

      @Override

      public Directive apply(Throwable t) {

        if (t instanceof ArithmeticExceptionreturn resume();

        else if (t instanceof NullPointerExceptionreturn restart();

        else return escalate();

      }

    });

   @Override

  public SupervisorStrategy supervisorStrategy() {

    return strategy;

  }

   ActorRef worker = context.actorOf(Props.create(Worker.class));

   public void onReceive(Object message) throws Exception {

    if (message instanceof Integer) worker.forward(message, getContext());

  }

}

       上面代码定义了一个监控角色的actor,可以看到其也是继承与UntypeActor,因为监控者变身也是一个actor,其变身也可以被监控。与普通 工作actor不同的是,其定义了监控策略SupervisorStrategy,负责处理子actor的重启、停止工作。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值