Akka是一个开发库和运行环境,可以用于 构建高并发、分布式、可容错、事件驱动的基于JVM的应用。 使构建高并发的分布式应用更加容易。Akka是把Actor Model模型进行了封装。可以理解为,异步,非阻塞的一个消息传递.
第一种: 给AKKA发送一个字符串或者单个的数值
package day03
import scala.actors.Actor
/**
* Created by Administrator on 2017/9/18.
* 功能:演示AKK 1 继承Actor类 2 重写act方法
* 功能点:演示发送一个字符串
*/
// 1 继承actor类
class ActorDemo extends Actor{
// 2 重写act方法,一般有while true操作
override def act =
{
while(true)
{
// 3 在receive中写具体的操作,要用到case 判断
receive{
case name:String=>println("hello, "+name)
case money:Int=>println("how much "+money)
}
}
}
}
object ActorDemon01 {
def main(args: Array[String]): Unit = {
val helloActor=new ActorDemo // 1 创建一个继承actor的对象
helloActor.start() // 2 启动akka
helloActor ! "tom" // 3 依据具体的参数调用actor
helloActor ! 1000
}
}
运行结果
这个相对简单,就是分别传输了字符和数值
第二种: 给akka的发送样例类
package day03
import scala.actors.Actor
/**
* Created by Administrator on 2017/9/18.
* 功能:演示akka的发送样例类
*
*/
//几个样例类
case class Register(username:String,password:String)
case class Login(username:String,password:String)
// 1 继承Actor类
class ActorDemon02 extends Actor{
//2 重写act方法
override def act()
{
while(true)
{
//3 在receive中写相关的操作
receive{
case Login(username,password)=>println("Login "+username+" 密码 "+password)
case Register(username,password)=>println("Register "+username+" 密码 "+password)
}
}
}
}
object ActorDemon02 {
def main(args: Array[String]): Unit = {
val actorDemon02=new ActorDemon02 //4 创建akka对象
actorDemon02.start() // 4 启动akka
actorDemon02 ! Register("zhangsan","123") //调用akka
actorDemon02 ! Login("lisi","456")
}
}
运行结果
这个是向akka中传输了样例类,和第一种场景类似
总结点: 一 Akka的开发流程
1 继承actor类 : extends Actor
2 重写act方法: override def act 一般有while true操作
3 在receive中写具体的操作,receive{ ,要用到case 判断
总结点:二 Actor的调用流程:
1 创建一个继承actor的对象: val helloActor=new ActorDemo
2 启动akka: helloActor.start()
3 依据具体的参数调用actor: helloActor ! "tom"
第三种: akka之间的互相调用
package day03
import scala.actors.Actor
/**
* Created by Administrator on 2017/9/18.
* 功能:演示akka akka之间发送数据
*
*/
case class Message(content:String,sender:Actor)
class zxcActor extends Actor
{
override def act: Unit =
{
while(true)
{
receive{
case Message(content,sender)=>println("zxc received "+content)
sender ! "北京欢迎你"
sender ! 1000
}
}
}
}
class chongActor(val zxc:zxcActor) extends Actor
{
override def act: Unit =
{
//this 代表调用的对象 指的是 chongActor
zxc ! Message("hello i am chong",this)
while(true)
{
receive{
case response:String=>println("chong received "+response)
case response:Int=>println("how much "+response)
}
}
}
}
object ActorDemon03 {
def main(args: Array[String]): Unit = {
val zxc=new zxcActor
val chong=new chongActor(zxc)
zxc.start()
chong.start()
}
}
运行结果
Akka之间的调用的总结点:
1 第二个actor的参数中要有第一个actor的引用chongActor(val zxc:zxcActor)
2 调用下一个actor时,放在act函数中,并且在receive之外
override def act: Unit ={ //this 代表调用的对象 指的是 chongActorzxc ! Message("hello i am chong",this)
说明: 1 放在receive之外,是因为receive中是实现了自己的操作。 2 调用时用this表示调用者,比较方便