一般来说,scala程序可以用sbt也可以用maven,我觉得既然我习惯用maven那就用maven吧,下面用IDEA+MAVEN新建第一个AKKA程序。
一、新建一个maven+scala的项目
二、maven依赖
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.suibibk.scala</groupId>
<artifactId>akka</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 定义一下常量 -->
<properties>
<encoding>UTF-8</encoding>
<scala.version>2.13.1</scala.version>
<scala.compat.version>2.13</scala.compat.version>
<akka.version>2.6.1</akka.version>
</properties>
<dependencies>
<!-- 添加scala的依赖 -->
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<!-- 添加akka的actor依赖 -->
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-actor_${scala.compat.version}</artifactId>
<version>${akka.version}</version>
</dependency>
<!-- 多进程之间的Actor通信 -->
<dependency>
<groupId>com.typesafe.akka</groupId>
<artifactId>akka-remote_${scala.compat.version}</artifactId>
<version>${akka.version}</version>
</dependency>
</dependencies>
<!-- 指定插件-->
<build>
<!-- 指定源码包和测试包的位置 -->
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
<plugins>
<!-- 指定编译scala的插件 -->
<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>
</plugins>
</build>
</project>
版本怎么确定呢?
如果你的版本跟安装的scala环境对不上,运行时候会报错的,所以scala和akka的版本要对应上,可以去maven仓库找:
三、HelloAkka
package com.suibibk
import akka.actor.{Actor, ActorSystem, Props}
import scala.io.StdIn
class HelloAkka extends Actor{
override def receive: Receive = {
case "狗子" =>println("狗子什么的,我当然最喜欢啦")
case "猫猫" =>println("猫猫可是比妹子可爱一万倍的存在")
case "stop" =>{
context.stop(self) // 停止自己的actorRef
context.system.terminate()//关闭ActorSystem,即关闭其内部的线程池(ExcutorService)
}
case _ =>println("不知道你说的是什么鬼")
}
}
object HelloAkka{
/**
* 创建线程对象MyFactory,用来创建actor对象的
* 里面的"myFactory"参数为线程池的名称
*/
private val myFactory = ActorSystem("myFactory")
/**
* 通过myFactory.actorOf方法來创建一个actor,注意,Props方法的第一个参数需要传递我们自定义的HelloActor
* 第二个参数是actor起个名字
*/
private val helloActorRef = myFactory.actorOf(Props[HelloAkka],"helloActor")
def main(args:Array[String]):Unit={
var flag = true
while(flag){
/**
* 接受用户输入的字符串
*/
print("请输入您想发送的消息:")
val consoleLine:String = StdIn.readLine()
/**
* 使用helloActorRef来给自己发送消息,helloActorRef有一个叫做感叹号("!")的方法来发送消息
*/
helloActorRef ! consoleLine
if(consoleLine.equals("stop")){
flag=false
println("程序即将结束!")
}
/**
* 为了不让while的运行速度在receive方法之上,我们可以让他休息0.1秒
*/
Thread.sleep(100)
}
}
}
运行结果如下: