架构图

重要类介绍

ActorSystem

在Akka中,ActorSystem是一个重量级的结构,他需要分配多个线程,所以在实际应用中,ActorSystem通常是一个单例对象,我们可以使用这个ActorSystem创建很多Actor。

Actor

在Akka中,Actor负责通信,在Actor中有一些重要的生命周期方法。

1.preStart()方法:该方法在Actor对象构造方法执行后执行,整个Actor生命周期中仅执行一次。

2.receive()方法:该方法在Actor的preStart方法执行完成后执行,用于接收消息,会被反复执行。

代码

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>cn.itcast.akka</groupId>
<artifactId>MyRPC</artifactId>
<version>1.0</version> <properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<encoding>UTF-8</encoding>
<scala.version>2.10.6</scala.version>
<scala.compat.version>2.10</scala.compat.version>
</properties> <dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency> <dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-actor_2.10</artifactId>
<version>2.3.14</version>
</dependency> <dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-remote_2.10</artifactId>
<version>2.3.14</version>
</dependency> </dependencies> <build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<plugins>
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
<configuration>
<args>
<arg>-make:transitive</arg>
<arg>-dependencyfile</arg>
<arg>${project.build.directory}/.scala_dependencies</arg>
</args>
</configuration>
</execution>
</executions>
</plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>reference.conf</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>cn.itcast.akkk.Master</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
package cn.itcast.akka

import akka.actor.{Actor, ActorSystem, Props}
import akka.actor.Actor.Receive
import com.typesafe.config.ConfigFactory /**
* Created by ZhaoXing on 2016/8/18.
*/
class Master extends Actor {
override def receive: Receive = {
case "start" => {
println("starting...")
println("started")
}
case "stop" => {
println("stopping...")
println("stopped")
} //Master接收到Worker的消息
case "connect" => {
println("a client connected...")
//向Worker反馈消息
sender ! "success"
} case _ => println("123")
}
} object Master {
def main(args: Array[String]) {
val host = "127.0.0.1"
val port = 8888
// val host = args(0)
// val port = args(1).toInt val confStr =
s"""
|akka.actor.provider = "akka.remote.RemoteActorRefProvider"
|akka.remote.netty.tcp.hostname = "$host"
|akka.remote.netty.tcp.port = "$port"
""".stripMargin val conf = ConfigFactory.parseString(confStr)
//ActorSystem是单例的,用于创建Acotor并监控actor
val actorSystem = ActorSystem("MaterActorSystem", conf)
//通过ActorSystem创建Actor
val master = actorSystem.actorOf(Props[Master], "Master") master ! "start"
master ! "hello"
master ! "stop" actorSystem.awaitTermination() }
}
package cn.itcast.akka

import akka.actor.{Actor, ActorSystem, Props}
import akka.actor.Actor.Receive
import com.typesafe.config.ConfigFactory /**
* Created by ZhaoXing on 2016/8/18.
*/
class Worker extends Actor { //preStart在构造器之后receive之前执行
override def preStart(): Unit = {
//首先跟Master建立连接
val master = context.actorSelection("akka.tcp://MaterActorSystem@127.0.0.1:8888/user/Master")
//通过mater的引用向Master发送消息
master ! "connect"
} override def receive: Receive = {
case "success" => {
println("a msg for master:success")
}
}
} object Worker {
def main(args: Array[String]) { val host = "127.0.0.1"
val port = 8889
// val host = args(0)
// val port = args(1).toInt
val confStr =
s"""
|akka.actor.provider = "akka.remote.RemoteActorRefProvider"
|akka.remote.netty.tcp.hostname = "$host"
|akka.remote.netty.tcp.port = "$port"
""".stripMargin
val conf = ConfigFactory.parseString(confStr)
//单例的ActorSystem
val actorSystem = ActorSystem("WorkerActorSystem", conf)
//通过actorSystem来创建Actor
val worker = actorSystem.actorOf(Props[Worker], "Worker")
actorSystem.awaitTermination()
}
}

最新文章

  1. CSharpGL(31)[译]OpenGL渲染管道那些事
  2. XtraBackup出现 Can't connect to local MySQL server through socket '/tmp/mysql.sock'
  3. [转]iOS学习笔记(2)--Xcode6.1创建仅xib文件无storyboard的hello world应用
  4. 深入理解JavaScript 事件
  5. SQL IDENTITY(int,1,1) 用法
  6. Linux命令 &amp;与&amp;&amp;的作用
  7. [javascript]event属性
  8. Android ANR、Force Closed(转)
  9. 在Sql中使用Try Catch
  10. Maven 插件 maven-tomcat7-plugin - 常用命令及配置
  11. js解析php返回的json数据无法获取length的问题分析
  12. IOS语音录取
  13. 一、iOS中的事件可以分为3大类型
  14. SpringMVC的相关知识
  15. Log4j配置和解释
  16. FortiGate下视频会议等语音相关配置
  17. 阿里云 Caused by: redis.clients.jedis.exceptions.JedisDataException: ERR invalid password
  18. UNIX环境编程学习笔记(14)——文件I/O之临时文件
  19. UUID的定义以及作用
  20. js-jquery-SweetAlert2【二】配置与方法

热门文章

  1. Android tess_two Android图片文字识别
  2. [make error ]ubuntu显示不全
  3. Python+selenium之selenium Grid2
  4. Windows平台下如何在C#中调用Python
  5. div高度不能自适应(子级使用float浮动,父级div高度不能自适应)
  6. UVA 674 Coin Change 硬币转换(完全背包,常规)
  7. python_84_os模块
  8. oracle没有监听和监听程序无法找到适用于客户机连接的例程
  9. c3p0,dbcp和proxool
  10. FMDB中的数据处理