akka 简单使用

这篇具有很好参考价值的文章主要介绍了akka 简单使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

由于AKka的核心是Actor,而Actor是按照Actor模型进行实现的,所以在使用Akka之前,有必要弄清楚什么是Actor模型。
Actor模型最早是1973年Carl Hewitt、Peter Bishop和Richard Seiger的论文中出现的,受物理学中的广义相对论(general relativity)和量子力学(quantum mechanics)所启发,为解决并发计算的一个数学模型。
Actor模型所推崇的哲学是”一切皆是Actor“,这与面向对象编程的”一切皆是对象“类似。但不同的是,在模型中,Actor是一个运算实体,它遵循以下规则: 接受外部消息,不占用调用方(消息发送者)的CPU时间片 通过消息改变自身的状态 创建有限数量的新Actor 发送有限数量的消息给其他Actor 很多语言都实现了Actor模型,而其中最出名的实现要属Erlang的。Akka的实现借鉴了不少Erlang的经验。
<dependency>
   <groupId>com.typesafe.akka</groupId>
    <artifactId>akka-actor_2.11</artifactId>
    <version>2.4.7</version>
</dependency>

tell 发送一个消息到目标Actor后立刻返回

public class C extends AbstractActor {
    @Override
    public Receive createReceive() {
        return receiveBuilder().match(Object.class,obj->{
            if(obj instanceof String){
                System.out.println("C:  D你回复给我的消息我收到了!");
                return;
            }
            SomeOne someOne = (SomeOne) obj;
            System.out.println("C:  C接收到消息:"+someOne.toString());
            // 创建D路由
            ActorRef actorRef = this.getContext().actorOf(Props.create(D.class, D::new));
            // 传递给D
            actorRef.tell(someOne,self());
            // 路由给D(和tell 实现的功能一样)
            //actorRef.forward(someOne,getContext());
        }).build();
    }

    public static void main(String[] args) {
        ActorSystem ok = ActorSystem.create("ok");
        ActorRef actorRef = ok.actorOf(Props.create(C.class, C::new));
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入:");
        String s = sc.nextLine();
        actorRef.tell(new SomeOne(1,s,0),ActorRef.noSender());

    }
}


public class D extends AbstractActor {
    @Override
    public Receive createReceive() {
       return receiveBuilder().match(Object.class,obj->{
           SomeOne someOne = (SomeOne) obj;
           System.out.println("D:  D接收到C 传过来的消息:"+someOne.toString());
           Thread.sleep(2000);
           sender().tell("D:  我再把消息发给你C",self());
       }).build();
    }
}
注意:
ActorSystem是一个较重的存在,一般一个应用里,只需要一个ActorSystem。
在同一个ActorySystem中,Actor不能重名。

ask 发送一个消息到目标Actor,并返回一个Future对象,可以通过该对象获取结果。但前提是目标Actor会有Reply(答复)才行,如果没有Reply,则抛出超时异常

public class A extends AbstractActor {

    // 接收到对象SomeOne
    @Override
    public Receive createReceive() {
        return receiveBuilder().match(Object.class,obj ->{
            if(obj instanceof SomeOne){
                SomeOne someOne = (SomeOne) obj;
                System.out.println(" A 收到 SomeOne 对象:"+someOne.toString());
                someOne.setAge(someOne.getAge()+1);
                // 业务。。。
                Thread.sleep(1000);
                // 返回结果
                this.getSender().tell("xxx",getSelf());
            }


        }).build();
    }

## Await 同步阻塞等待结果
    public static void main(String[] args) {
        //
        ActorSystem test = ActorSystem.create("test");
        ActorRef actorRefA = test.actorOf(Props.create(A.class, A::new));
        SomeOne someOne = new SomeOne(1,"哈哈哈ok",10);
        // 2 分钟超时
        Timeout timeout = new Timeout(Duration.create(2, TimeUnit.SECONDS));
        Future<Object> future = Patterns.ask(actorRefA, someOne, timeout); //ref,消息体,超时时间
        try {
            // Await 同步阻塞等待方式
            String reply = (String) Await.result(future, timeout.duration());
            System.out.println("回复的消息: " + reply);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
public class A extends AbstractActor {

    // 接收到对象SomeOne
    @Override
    public Receive createReceive() {
        return receiveBuilder().match(Object.class,obj ->{
            if(obj instanceof SomeOne){
                SomeOne someOne = (SomeOne) obj;
                System.out.println(" A 收到 SomeOne 对象:"+someOne.toString());
                someOne.setAge(someOne.getAge()+1);
                // 业务。。。
                Thread.sleep(1000);
                // 返回结果
                this.getSender().tell("xxx",getSelf());
            }


        }).build();
    }

## future 异步等待结果。
public static void main(String[] args) {
        //
        ActorSystem test = ActorSystem.create("test");
        ActorRef actorRefA = test.actorOf(Props.create(A.class, A::new));
        SomeOne someOne = new SomeOne(1,"哈哈哈ok",10);
        // 2 分钟超时
        Timeout timeout = new Timeout(Duration.create(2, TimeUnit.SECONDS));
        //ref,消息体,超时时间
        Future<Object> future = Patterns.ask(actorRefA, someOne, timeout);
        // 异步方式
        future.onComplete(new OnComplete<Object>() {
            @Override
            public void onComplete(Throwable throwable, Object o) throws Throwable {
                if (throwable != null) {
                    System.out.println("返回结果异常:" + throwable.getMessage());
                } else {
                    System.out.println("返回消息:" + o);
                }
            }
        }, test.dispatcher());
        // 成功,执行过程
        future.onSuccess(new OnSuccess<Object>() {
            @Override
            public void onSuccess(Object msg) throws Throwable {
                System.out.println("回复的消息:" + msg);
            }
        }, test.dispatcher());
        //失败,执行过程
        future.onFailure(new OnFailure() {
            @Override
            public void onFailure(Throwable throwable) throws Throwable {
                if (throwable instanceof TimeoutException) {
                    System.out.println("服务超时");
                } else {
                    System.out.println("未知错误");
                }
            }
        }, test.dispatcher());
    }

tell 前置后置处理,销毁线程 的例子



public class MessageSendAndAccept extends AbstractActor {

    //接收消息前置处理
    @Override
    public void preStart() {
        System.out.println("--------- 接收到消息  start");
    }

    //接收消息后置处理
    @Override
    public void postStop(){
        System.out.println("--------- 消息处理完毕  end");
    }

    // A接收消息
    @Override
    public Receive createReceive() {
        return receiveBuilder().match(String.class,result ->{
            consoleLog(result);
        }).build();
    }

    //打印
    public void consoleLog(String log){
        System.out.println("接收到内容:"+log);
        //销毁线程
        getContext().stop(self());
    }

    public static void main(String[] args) {
        // 创建ActorSystem仓库
        ActorSystem actorSystem = ActorSystem.create("demo");
        // 创建路由,路由到A
        ActorRef my_actor = actorSystem.actorOf(Props.create(MessageSendAndAccept.class), "my_actor");
        // 给 A 发消息
        my_actor.tell("哈哈哈a",ActorRef.noSender());
    }
}

并发 执行方法 例子

创建多个actor 同时执行就好了

public class G extends AbstractActor {
    @Override
    public Receive createReceive() {
        return receiveBuilder().match(Object.class,obj->{
            if(obj instanceof String){
                System.out.println(obj + ",time="+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"--- Thread ---"+Thread.currentThread().getName());
                //休眠 3s
                Thread.sleep(3000L);
                System.out.println(Thread.currentThread().getName()+"---END");
                return;
            }
        }).build();
    }

    public static void main(String[] args) {
        ActorSystem ok = ActorSystem.create("ok");

        ActorRef actorRef_0 = ok.actorOf(Props.create(G.class, G::new));
        actorRef_0.tell("a",ActorRef.noSender());

        ActorRef actorRef_1 = ok.actorOf(Props.create(G.class, G::new));
        actorRef_1.tell("b",ActorRef.noSender());

        ActorRef actorRef_2 = ok.actorOf(Props.create(G.class, G::new));
        actorRef_2.tell("c",ActorRef.noSender());


    }
}

akka 简单使用,java,jvm,算法文章来源地址https://www.toymoban.com/news/detail-609635.html

到了这里,关于akka 简单使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java】图解 JVM 垃圾回收(一):GC 判断策略、引用类型、垃圾回收算法

    垃圾 是指运行程序中 没有任何引用指向的对象 ,需要被回收。 内存溢出 :经过垃圾回收之后,内存仍旧无法存储新创建的对象,内存不够溢出。 内存泄漏 :又叫 “ 存储泄漏 ”,对象不会再被程序使用了,但是 GC 又不能回收它们。例如:IO 流不适用了但是没有被 Close、

    2024年02月19日
    浏览(50)
  • 【jvm系列-09】垃圾回收底层原理和算法以及JProfiler的基本使用

    JVM系列整体栏目 内容 链接地址 【一】初识虚拟机与java虚拟机 https://blog.csdn.net/zhenghuishengq/article/details/129544460 【二】jvm的类加载子系统以及jclasslib的基本使用 https://blog.csdn.net/zhenghuishengq/article/details/129610963 【三】运行时私有区域之虚拟机栈、程序计数器、本地方法栈 https

    2023年04月22日
    浏览(76)
  • Java反转链表,简单算法

    Java 单向链表,指的是一种数据结构,用于存储一系列的元素。每个元素包含两部分:一个存储数据的值和一个指向下一个元素的引用。 单向链表由多个节点组成,每个节点都包含一个数据元素和一个指向下一个节点的引用。 链表的起始节点称为头节点,尾节点的引用为空(

    2024年01月17日
    浏览(35)
  • 深入理解JVM:Java使用new创建对象的流程

            ①new 对象         ②反射         ③对象的复制         ④反序列化 先看看常量池里面有没有,如果有,就用常量池的 看这个类有没有被加载过,如果没有,就执行类加载以及类的初始化。(对象的大小,在类加载的时候就确定了)。 对象在堆内存

    2024年02月15日
    浏览(67)
  • Java JVM分析利器JProfiler 结合IDEA使用详细教程

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 对于我们Java程序员而言,肯定需要对项目工程进行JVM监控分析,最终选择jprofiler,它可以远程链接,使用方便,功能也很强大! JProfiler是一个重量级的JVM监控工具,提供对JVM精确监控,其中堆遍历、

    2024年02月08日
    浏览(42)
  • Java算法 leetcode简单刷题记录6

    环和杆: https://leetcode.cn/problems/rings-and-rods/ 统计范围内的元音字符串数: https://leetcode.cn/problems/count-the-number-of-vowel-strings-in-range/ 最长平衡子字符串: https://leetcode.cn/problems/find-the-longest-balanced-substring-of-a-binary-string/ K 个元素的最大和: https://leetcode.cn/problems/maximum-sum-with-exa

    2024年01月24日
    浏览(46)
  • Java算法 leetcode简单刷题记录4

    买卖股票的最佳时机: https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/ 笨办法: 记录当天的值及之后的最大值,相减得到利润; 所有的天都计算下,比较得到利润最大值; 会超时 记录过程中遇到的最低值,每当有利润大于0及大于上一个利润值的情况,赋值; 最小和分割:

    2024年01月23日
    浏览(45)
  • Scala第二十章节(Akka并发编程框架、Akka入门案例、Akka定时任务代码实现、两个进程间通信的案例以及简易版spark通信框架案例)

    章节目标 理解Akka并发编程框架简介 掌握Akka入门案例 掌握Akka定时任务代码实现 掌握两个进程间通信的案例 掌握简易版spark通信框架案例 1. Akka并发编程框架简介 1.1 Akka概述 Akka是一个用于构建高并发、分布式和可扩展的基于事件驱动的应用工具包。Akka是使用scala开发的库,

    2024年04月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包