博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hello,Akka
阅读量:6938 次
发布时间:2019-06-27

本文共 2055 字,大约阅读时间需要 6 分钟。

:转载时请以超链接形式标明文章原始出处和作者信息及

只要稍微了解过一些,这门JVM上广受关注的程序设计语言,你一定会对其中的一个Actor特性印象深刻。是另一种进行并发计算的方式。通过在不同的Actor之间彼此发送消息,我们会惊喜地发现,那令人纠结的锁将不再困扰我们。

不过,那是Scala的世界,作为一个Java程序员难道只有艳羡的份吗?显然不是。把Actor带到了Java世界。

实际上,Akka主要是以Scala编写的,但它很好地支持Java API,让所有特性对于Java程序员也唾手可得。即使相比于与Scala内建的Actor,Akka也不遑多让。Akka除了最基本的Actor特性外,它可以能在多台机器上透明地实现Actor,此外,还提供了很好的监管特性,这些都是Scala内建的Actor所不具备的。

说了那么多,让我们用一个Hello的例子和Akka打个招呼吧!

既然我们这里关注的是Actor,我们就来实现两个Actor,让它们之间实现问候。下面是一个:

import akka.actor.Props;import akka.actor.UntypedActor;import akka.actor.ActorRef;public class HelloWorld extends UntypedActor {    @Override   public void preStart() {       final ActorRef greeter =               getContext().actorOf(Props.create(Greeter.class), "greeter");       greeter.tell(Greeter.Msg.GREET, getSelf());   }    @Override   public void onReceive(Object msg) {       if (msg == Greeter.Msg.DONE) {           getContext().stop(getSelf());       } else {           unhandled(msg);       }  }}

(HelloWorld.java)

这个HelloWorld继承了UntypedActor,表明我们实现的是一个Actor。

其中的preStart是在启动这个Actor时调用的方法。在这里,我们创建了另一个Actor的实例。我们稍后会看到另一个Actor Greeter的实现。然后,我们调用tell方法给它发了一个消息,Greeter.Msg.GREET,后面的getSelf()给出了一个Actor的引用(ActorRef),用以表示发消息的Actor。这只是启动一个Actor,后面的部分才是更重要的。

onReceive方法是处理我们接收到消息的情况。这里我们看到,如果接收到的消息是一个Greeter.Msg.DONE,我们就会停下(stop)所有的处理,同样,getSelf()指明停下的目标,否则的话,就说我们没处理(unhandled)。

看完了一个Actor,或许你已经迫不及待地想看与它打交道的另一个Actor了,下面就是:

import akka.actor.UntypedActor;public class Greeter extends UntypedActor {    public static enum Msg {       GREET, DONE   }    @Override   public void onReceive(Object msg) {       if (msg == Msg.GREET) {           System.out.println("Hello World!");           getSender().tell(Msg.DONE, getSelf());       } else {           unhandled(msg);       }   }}

(Greeter.java)

同样的Actor结构,我们已经在HelloWorld类里面看到了。在onReceive方法里,如果它接收到的消息是Msg.GREET,它就打印出“Hello World!”,然后,给发送者回复一条Msg.DONE。没处理的话,就说没处理。

就是这么简单!

好,万事具备,我们把它跑起来。你看到了我们还没有入口点,实际上,Akka自身为我们提供了一个。设置好classpath之后,我们只要这样运行即可:

    java akka.Main HelloWorld

这里的akka.Main就是我们的入口点,我们把HelloWorld这个类名传给它作为启动参数。运行的结果自然是我们最熟悉的:

    Hello World!

好,就到这里吧!

你可能感兴趣的文章
《C标准库》((美)普劳格)【摘要 书评 试读】- 京东图书
查看>>
【JS基础回归】关于parseInt 与 numberObj.toString 中的“raidx”
查看>>
SVN如何check out单个文件
查看>>
Winsock IO模式
查看>>
Squid 代理服务器
查看>>
constellio——基于solr的开源搜索引擎系统源码研究(二)
查看>>
求反射向量
查看>>
CSS3 学习+实践(三)
查看>>
hadoop集群搭建
查看>>
基于UDP的IO多路复用一例
查看>>
海量数据处理专题(九)——外排序
查看>>
解决sqlplus的segmentation fault或hang问题
查看>>
企业搜索引擎开发之连接器connector(八)
查看>>
win8下Python学习——搭建web.py框架
查看>>
自动清理手机文件方法
查看>>
【工具类】NetWorkHelper
查看>>
Spring MVC 教程,快速入门,深入分析(转载)
查看>>
财经法规与会计职业道德4
查看>>
php 杂记
查看>>
单元测试同时支持 NUnit/MSTest
查看>>