本文来源,是我在阅读《实战java高并发程序设计》第7章所了解的,参考了这本书,在此记录一下。往后也好翻翻。
Akka是用Scala创建的,Scala也是java虚拟机上的语言,和java差不多。
学习一个框架或者一门技术,无外乎这三点,1是什么?2怎么用?3用了之后有什么好处?
一,Akka能给我吗带来什么好处呢?
1,首先,Akka提供了一种称之为Actor的并发模型,粒度比线程还要小,这表明你可以在系统当中创建及其大量的Actor
2,Akka提供了一套容错机制,允许Actor出现异常时进行一些恢复或者重置的操作。
3,Akka不仅可以在单机上构建高并发程序,还可以在网络上构建分布式程序,并提供位置透明的Actor定位服务。
二,怎么用?
先来创建一个hello world 程序试试手吧,
创建一个maven工程,
1,添加如下依赖
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-actor_2.12</artifactId>
<version>2.5.2</version>
</dependency>
2,创建 欢迎者
package org.buptdavid.datastructure.zj.akka.demo1;
import akka.actor.UntypedAbstractActor;
/**
* 欢迎者
*/
public class Greeter extends UntypedAbstractActor{
public enum Msg{
GREET,DONE
}
@Override
public void onReceive(Object message) throws Throwable {
if(message==Msg.GREET){
System.out.println("hello actor...");
getSender().tell(Msg.DONE,getSelf());
}else {
unhandled(message);
}
}
}
UntypedAbstractActor(无类型的,不能再继承其他类(java单继承))就是我们所说的Actor
再来创建一个与Greeter 交流的另外一个Actor ,HelloActor如下:
package org.buptdavid.datastructure.zj.akka.demo1;
import akka.actor.ActorRef;
import akka.actor.Props;
import akka.actor.UntypedAbstractActor;
public class HelloActor extends UntypedAbstractActor{
ActorRef greeterRef;
@Override
public void preStart() throws Exception { //是Akka的回调方法,在Actor启动前会被Akka调用,完成一些初始化操作
greeterRef = getContext().actorOf(Props.create(Greeter.class), "greeter");
System.out.println("Greeter Actor Path :"+greeterRef.path());
greeterRef.tell(Greeter.Msg.GREET,getSelf());
}
@Override
public void onReceive(Object msg) throws Throwable {//消息处理函数
if(msg==Greeter.Msg.DONE){
greeterRef.tell(Greeter.Msg.GREET,getSelf());
getContext().stop(getSelf());//让自己停止
}else{
unhandled(msg);
}
}
}
现在来创建一个测试HelloMainSimple:
package org.buptdavid.datastructure.zj.akka.demo1;
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import com.typesafe.config.ConfigFactory;
public class HelloMainSimple {
public static void main(String[] args) {
ActorSystem actorSystem = ActorSystem.create("Hello", ConfigFactory.load("samplehello.conf"));
ActorRef helloactor = actorSystem.actorOf(Props.create(HelloActor.class), "helloactor");//创建一个接收该对象管理的actor对象
System.out.println("helloactor Actor path "+helloactor.path());
}
}
上面代码解释
ActorSystem.create 第一个参数为系统名称,此定义的名称为hello ,第二个参数为配置文件
在此我们需要提供一个配置文件 samplehello.conf
内容如下:
akka{
loglevel=INFO
}
此配置文件值简单的配置了一下日志级别
运行结果: