ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AKKA学习笔记

2019-12-09 16:04:53  阅读:303  来源: 互联网

标签:return Actor 学习 private 笔记 Behavior msg MainApp AKKA


package akka;

import akka.actor.typed.*;
import akka.actor.typed.javadsl.*;

import java.util.UUID;

public class JavaAkkaTest {
  public static void main(String[] args) {
    ActorRef<String> mainApp = ActorSystem.create(MainApp.create(), "MainApp");
    mainApp.tell("start");
    mainApp.tell("stop"); // 关闭父Actor时会先关闭所有子Actor
  }
}

/**
 * 一般来说都需要创建一个MainApp,用于启动其他的Actor
 */
class MainApp extends AbstractBehavior<String> {

  static Behavior<String> create() {
    return Behaviors.setup(MainApp::new);
  }

  private MainApp(ActorContext<String> context) {
    super(context);
  }

  @Override
  public Receive<String> createReceive() {
    return newReceiveBuilder()
      .onMessageEquals("start", this::onStart)
      .onMessageEquals("stop", this::onStop)
      .onSignal(PostStop.class, postStop -> {
        System.out.println("MainApp stopped");
        return this;
      })
      .build();
  }

  private Behavior<String> onStart() {
    for (int i = 0; i < 100; i++) {
      String name = UUID.randomUUID().toString();
      // ActorRef<Integer> actorA = getContext().spawn(ActorA.create(name), name); // 直接创建子代
      ActorRef<Integer> actorA = getContext().spawn(Behaviors.supervise(ActorA.create(name)).onFailure(SupervisorStrategy.restart()), name); // 创建并监督子代,当失败时(出现未捕获到的异常)立即重新启动
      actorA.tell(1);
    }
    return this;
  }

  private Behavior<String> onStop() {
    return Behaviors.stopped();
  }
}

/**
 * 创建一个Actor需要继承AbstractBehavior<T>
 */
class ActorA extends AbstractBehavior<Integer> {

  /**
   * 提供一个静态方法,用来创建该Actor
   *
   * @param msg 可以向该Actor的构造方法传递各种参数
   * @return 返回创建好的Actor
   */
  static Behavior<Integer> create(String msg) {
    return Behaviors.setup(actorContext -> new ActorA(actorContext, msg));
  }

  // Actor内部的成员变量
  private String msg;

  /**
   * 初始化该Actor
   * 这里可以私有化,对外只保留create方法
   *
   * @param context Actor上下文
   * @param msg     初始化成员变量
   */
  private ActorA(ActorContext<Integer> context, String msg) {
    super(context);
    this.msg = msg;
  }

  /**
   * 内部的一些执行逻辑
   */
  private void show() {
    System.out.println(this.getContext().getSelf() + "::" + this.msg);
  }

  /**
   * 定义收到消息时的处理行为
   *
   * @return
   */
  @Override
  public Receive<Integer> createReceive() {
    return newReceiveBuilder()
      .onAnyMessage(this::behaviorHandler) // handler: JFunction[T, Behavior[T]]  表示处理T类型的值,返回Behavior[T]
      .onSignal(PostStop.class, postStop -> this.beforeClose()) // handler: JFunction[M, Behavior[T]]  表示处理M类型的值,返回Behavior[T]
      .build();
  }

  /**
   * 可以针对不同的message,定义不同的处理handler
   *
   * @param i 传参
   * @return 返回一个Actor
   */
  private Behavior<Integer> behaviorHandler(Integer i) {
    while (i-- > 0) {
      this.show();
    }

    // return Behaviors.empty();
    // return this;

    // 停止Actor,建议用这种该方法
    return Behaviors.stopped();
  }

  private Behavior<Integer> beforeClose() {
    System.out.println("ActorA stopped");
    return this;
  }
}

标签:return,Actor,学习,private,笔记,Behavior,msg,MainApp,AKKA
来源: https://www.cnblogs.com/CSunShine/p/12011510.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有