美文网首页Akka
akka中的 actor和message

akka中的 actor和message

作者: destiny_m | 来源:发表于2018-02-23 00:41 被阅读0次

参考https://developer.lightbend.com/guides/akka-quickstart-java/define-actors.html

Messages可以是各种类型

Hello World Actors 用了三种类型

  • WhoToGreet:拜访接受者

  • Greet:执行拜访的说明

  • Greeting : 包含拜访的消息

定义好了Actors和Messages,需要注意下面几点:

  • 因为Messages是公共的API,所以一个最佳实践就是消息应该有一个好的名字,丰富的语义,特定作用域,甚至可以包括数据类型。这样易用,容易理解,容易调试。
  • Messages应该不变的,因为多个线程直接共享。
  • 还有一个最佳实践,把和actor相关联的消息,作为一个静态类放在Actor的类中。 这样就容易理解这个Actor期望和处理哪种类型的消息。
  • 还有一个常用的做法,在Actor中用静态的props的描述如何去构建这个Actor。

Greeter 和 Printer中使用最佳实践

The Greeter Actor

从Greeter.java 中截取的一部分

package com.lightbend.akka.sample;

import akka.actor.AbstractActor;
import akka.actor.ActorRef;
import akka.actor.Props;
import com.lightbend.akka.sample.Printer.Greeting;

public class Greeter extends AbstractActor {
  static public Props props(String message, ActorRef printerActor) {
    return Props.create(Greeter.class, () -> new Greeter(message, printerActor));
  }

  static public class WhoToGreet {
    public final String who;

    public WhoToGreet(String who) {
        this.who = who;
    }
  }

  static public class Greet {
    public Greet() {
    }
  }

  private final String message;
  private final ActorRef printerActor;
  private String greeting = "";

  public Greeter(String message, ActorRef printerActor) {
    this.message = message;
    this.printerActor = printerActor;
  }

  @Override
  public Receive createReceive() {
    return receiveBuilder()
        .match(WhoToGreet.class, wtg -> {
          this.greeting = message + ", " + wtg.who;
        })
        .match(Greet.class, x -> {
          printerActor.tell(new Greeting(greeting), getSelf());
        })
        .build();
  }
}

让我们来分解下代码:

  • Greeter继承了AbstractActor重写了createReceive方法。
  • Greeter构造函数接受两个参数:String message 用于构建Greeting message, ActorRef printerActor是处理问候结果的Actor的引用。
  • receiveBuilder定义了对不同消息应该有不同的反应。一个Actor是可以有状态的。获取和改变内部状态是线程安全的,因为它被Actor model保护着。createReceive会按着Actor所期望的那样去处理消息。对于Greeter,它处理两种Message类型,WhoToGreet和Greet。前者会更新Actor的greeting状态,后者会触发发送消息到Printer Actor。
  • greeting变量包含着Actor的状态,默认被设置为''
  • 静态的props方法创建和返回一个Props实例。 Props实例是一个创建Actors参数集的配置类。可以认为他是一个不变的和可以被自由分享的菜单来创建Actor,可以包含部署的信息。这个例子,简单传递用于构建Actor所需要的参数。

Printer Actor

  • 它创建日志通过Logging.getLogger(getContext().getSystem(), this); 这样后就可以通过log.info() 来写日志。
  • 它处理一种message, Greeting. 然后输出日志。
package com.lightbend.akka.sample;

import akka.actor.AbstractActor;
import akka.actor.ActorRef;
import akka.actor.Props;
import akka.event.Logging;
import akka.event.LoggingAdapter;

public class Printer extends AbstractActor {
  static public Props props() {
    return Props.create(Printer.class, () -> new Printer());
  }

  static public class Greeting {
    public final String message;

    public Greeting(String message) {
      this.message = message;
    }
  }

  private LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);

  public Printer() {
  }

  @Override
  public Receive createReceive() {
    return receiveBuilder()
        .match(Greeting.class, greeting -> {
            log.info(greeting.message);
        })
        .build();
  }
}

相关文章

  • akka中的 actor和message

    参考https://developer.lightbend.com/guides/akka-quickstart-...

  • Akka系列(二):Akka中Actor系统

    Actor作为Akka中最核心的结构,其在Akka中的中的组织结构也至关重要,今天我们就来讲讲Akka中Actor...

  • Springboot flyway migrate执行完毕再执行

    我在Springboot中同时集成了Akka actor和flyway。在WeatherActor中启动actor...

  • squbs-11. 消息指南

    原文地址:Message Guidelines Akka actor通过不可变消息交流。这些可以在代码的任何地方被...

  • Akka Actor监管策略

    Supervisor Akka中每个Actor都是在其他的Actor中创建,换句话说:每个Actor都存在于它父亲...

  • Akka的监管和监控

    Akka的监管和监控 监管和监控 在 Actor 系统 中说过,监管描述的是actor之间的依赖关系:监管者将任务...

  • akka(1)

    akka 处理并发的基于actor

  • akka编程demo

    AKKA akka基于actor模型, 是一个用于构建可扩展的弹性的快速响应的应用程序的平台;actor模型:是一...

  • Akka Notes - Introducing Actors

    What are Actors? Akka's Actors follow the Actor Model (du...

  • 集成Akka

    Integrating with Akka Akka 使用Actor模型来提升抽象等级并且提供一个更好的平台去构建...

网友评论

    本文标题:akka中的 actor和message

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