步骤

一、创建maven工程,导入jar包

<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<encoding>UTF-8</encoding>
<scala.version>2.11.8</scala.version>
<scala.compat.version>2.11</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.11</artifactId>
<version>2.3.14</version>
</dependency> <dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-remote_2.11</artifactId>
<version>2.3.14</version>
</dependency> </dependencies> <build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<plugins>
<!-- 限制jdk的编译版本插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin> <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>-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></mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

二、master进程代码开发

import akka.actor.{Actor, ActorRef, ActorSystem, Props}
import com.typesafe.config.ConfigFactory // todo 利用akka实现两个进程间的通信---master端
class Master extends Actor{ println("主构造器开始执行!") //初始化方法,在receive方法之前执行,在构造方法之后执行,执行一次
override def preStart(): Unit = { } //receive方法用于akka actor中消息的接收处理,可以持续不断接收消息
override def receive: Receive = {
case "connect" => {
println("Receive Login information success,logining.....please wait.....")
//返回注册成功
sender ! "success"
}
}
} object Master{
def main(args: Array[String]): Unit = {
//给host定义一个参数,用于接收主机
val host = args(0)
//给port定义一个参数,用于接收端口
val port = args(1) //创建conf需要解析的String
val confStr =
s"""
|akka.actor.provider = "akka.remote.RemoteActorRefProvider"
|akka.remote.netty.tcp.hostname = "$host"
|akka.remote.netty.tcp.port = "$port"
|""".stripMargin //创建ActorSystem所需的configuration
val conf = ConfigFactory.parseString(confStr) //创建ActorSystem,由其创建监督管理其他众多的Actor
val masterActorSystem = ActorSystem.create("masterActorSystem", conf) //通过ActorSystem创建masterActor
val master: ActorRef = masterActorSystem.actorOf(Props(new Master), "masterActor") //master测试自连
// master ! "connect"
}
}

三、worker进程代码开发

import akka.actor.{Actor, ActorRef, ActorSelection, ActorSystem, Props}
import com.typesafe.config.{Config, ConfigFactory} // todo 利用akka实现两个进程间的通信---worker端
class Worker extends Actor{ override def preStart(): Unit = {
//获取master actor的引用(需要通信协议、IP地址、端口号、actorSystem、masterActor、actor层级)
val master: ActorSelection = context.actorSelection("akka.tcp://masterActorSystem@192.168.0.108:12321/user/masterActor")
//给master发送注册信息
master ! "connect"
} override def receive: Receive = {
case "connect" => println("WorkerClient is connecting....")
case "success" => println("Congratulation! Login success!")
}
} object Worker{
def main(args: Array[String]): Unit = {
//worker host
val host = args(0)
//worker port
val port = args(1) //创建conf需要的str
val confStr =
s"""
|akka.actor.provider = "akka.remote.RemoteActorRefProvider"
|akka.remote.netty.tcp.hostname = "$host"
|akka.remote.netty.tcp.port = "$port"
|""".stripMargin //创建workerActorSystem需要的configuration
val config: Config = ConfigFactory.parseString(confStr) //创建ActorSystem
val workerActorSystem: ActorSystem = ActorSystem.create("workerActorSystem", config) //创建workActor
val worker: ActorRef = workerActorSystem.actorOf(Props(new Worker), "workerActor")
}
}

四、控制台结果

master控制台

[INFO] [04/12/2020 11:46:00.234] [main] [Remoting] Starting remoting
[INFO] [04/12/2020 11:46:00.413] [main] [Remoting] Remoting started; listening on addresses :[akka.tcp://masterActorSystem@192.168.0.108:12321]
[INFO] [04/12/2020 11:46:00.415] [main] [Remoting] Remoting now listens on addresses: [akka.tcp://masterActorSystem@192.168.0.108:12321]
主构造器开始执行!
Receive Login information success,logining.....please wait.....

worker控制台

[INFO] [04/12/2020 11:46:07.019] [main] [Remoting] Starting remoting
[INFO] [04/12/2020 11:46:07.371] [main] [Remoting] Remoting started; listening on addresses :[akka.tcp://workerActorSystem@192.168.0.108:12322]
[INFO] [04/12/2020 11:46:07.374] [main] [Remoting] Remoting now listens on addresses: [akka.tcp://workerActorSystem@192.168.0.108:12322]
Congratulation! Login success!

【Scala】利用Akka的actor编程模型,实现2个进程间的通信的更多相关文章

  1. Python之网路编程之-互斥锁与进程间的通信(IPC)及生产者消费者模型

    一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...

  2. Scala进阶之路-并发编程模型Akka入门篇

    Scala进阶之路-并发编程模型Akka入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Akka Actor介绍 1>.Akka介绍 写并发程序很难.程序员不得不处 ...

  3. 探讨一个新的两个进程间的通信和编程模型 (Windows)

    本文探讨一个新的Windows上的两个UI进程间的通信和编程模型. 开门见山,下面是这个通信模型的梗概图: 这个模型的设计目标描述如下: (1)发送数据接口:RpcSend, RpcPost RpcS ...

  4. Python 多进程编程之 进程间的通信(在Pool中Queue)

    Python 多进程编程之 进程间的通信(在Pool中Queue) 1,在进程池中进程间的通信,原理与普通进程之间一样,只是引用的方法不同,python对进程池通信有专用的方法 在Manager()中 ...

  5. Python 多进程编程之 进程间的通信(Queue)

    Python 多进程编程之 进程间的通信(Queue) 1,进程间通信Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法----这是操作系统开辟 ...

  6. c++ 网络编程(三) LINUX/windows 进程间的通信原理与实现代码 基于多进程的服务端实现

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/9613027.html 锲子:进程与线程是什么,他们的区别在哪里: 1 进程概念 进程是程序的一 ...

  7. Python 35 进程间的通信(IPC机制)、生产者消费者模型

    一:进程间的通信(IPC):先进先出  管道:队列=管道+锁 from multiprocessing import Queue q=Queue(4) q.put(['first',],block=T ...

  8. Windows中利用共享内存来实现不同进程间的通信

    Windows中利用共享内存来实现不同进程间的通信 一.msdn详细介绍 https://docs.microsoft.com/zh-cn/windows/win32/memory/sharing-f ...

  9. 计算机网络|C语言Socket编程,实现两个程序间的通信

    C语言Socket编程,实现两个程序间的通信 server和client通信流程图 在mooc上找到的,使用Socket客户端client和服务端server通信的流程图

随机推荐

  1. 3d模型一般怎么导入到到Threejs中使用

    这是我之前做的一个demo,导入的3d模型文件是obj格式的,需要使用OBJLoader和MTLLoader, mtl文件用于描述多边形可视面貌的材质如果你可以导出obj.mtl文件的话,那么就可以使 ...

  2. ModuleNotFoundError: No module named 'sklearn.cross_validation'

    本文为CSDN博主「不服输的南瓜」的原创文章,遵循 CC 4.0 BY-SA 版权协议 原文链接 ModuleNotFoundError: No module named 'sklearn.cross ...

  3. XML-解析失败原因初步分析

    更多精彩文章请关注公众号『大海的BLOG』 首先放出有问题的代码 之所以直入主题是因为肝完了事情,急需入睡.hiahia hiboard:updateUrl="https://xxx.com ...

  4. redis和memcache列出所有key

    //redis $redis = new Redis(); $redis->connect("host", "port"); $redis->sel ...

  5. testlink的api

    testlink可以做很多你想象得到的事情,如API测试参数管理,Excel导入导出,快速模板创建测试用例,集成Jenkins. TestLink API第三方库: TestLink-API-Pyth ...

  6. [html]浏览器标签小图标LOGO简单设置

    方式一:如果是一个项目一个LOGO 的话,直接接把图片像素设置成16x16像素,然后改名favicon.ico放在项目根部目录就可以,自动识别的! 方式二:简单设置! 首先找一个图片把像素设置成16x ...

  7. Java IO基础--File常用操作(递归)

    File中经常会使用递归方法打印属性结构.统计文件夹下文件个数.子文件夹个数以及文件大小,可以作为递归的应用练习. 递归的写法,百度一搜一大堆,这里我使用对javabean方式封装了一下: packa ...

  8. 前端基础进阶(七)-前端工程师最容易出错的问题-this关键字

    我们在学习JavaScript的时候,因为对一些概念不是很清楚,但是又会通过一些简洁的方式把它给记下来,那么这样自己记下来的概念和真正的概念产生了很强的偏差. 当然,还有一些以为这个是对的,还会把它发 ...

  9. 9个小技巧让你的 if else看起来更优雅

    if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else 会让我们感到脑壳疼,例如下面这个伪代码: 是不是很奔溃?虽然他是伪代码,并且看起来也很夸张,但在现实中,当我们 ...

  10. mysql 复制表结构和数据

    CREATE TABLE 新表名 SELECT 字段 as 新字段,字段 as 新字段.....from 旧表名: