文章系列
Akka 基础篇就此结束了,Akka基础篇主要介绍Akka的基本概念与一些基本术语,使用方式
代码:https://github.com/Eason-shu/Akka
下载地址:

解压配置环境变量
SBT_HOME

PATH


-Xmx512M
-XX:MaxPermSize=256m
-XX:ReservedCodeCacheSize=128m
-Dsbt.log.format=true
-Dsbt.override.build.repos=true
-Dconsold.encoding=UTF-8
-Dsbt.log.format=true
-Dsbt.ivy.home=D:\Environment\sbt\.ivy
-Dsbt.boot.directory=D:\Environment\sbt\boot
-Dsbt.global.base=D:\Environment\sbt\.sbt
-Dsbt.repository.config=D:\Environment\sbt\conf\repo.properties # 仓库镜像配置

[repositories]
local
huaweicloud-maven: https://repo.huaweicloud.com/repository/maven/
maven-central: https://repo1.maven.org/maven2/
sbt-plugin-repo: https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]







# 打包构建的版本
ThisBuild / version := "0.1.0-SNAPSHOT"
# scala的版本
ThisBuild / scalaVersion := "2.11.7"
// 依赖
libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-actor" % "2.3.3",
"com.typesafe.akka" %% "akka-testkit" % "2.3.6" % "test",
"org.scalatest" %% "scalatest" % "2.1.6" % "test"
)
# 主入口
lazy val root = (project in file("."))
.settings(
name := "ActorDemo01"
)

<dependency>
<groupId>org.scala-langgroupId>
<artifactId>scala-libraryartifactId>
<version>${scala.version}version>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
<dependency>
<groupId>com.typesafe.akkagroupId>
<artifactId>akka-actor_2.10artifactId>
<version>2.3.3version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.13.2version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.testnggroupId>
<artifactId>testngartifactId>
<version>RELEASEversion>
<scope>compilescope>
dependency>
/**
* @description:
* @author: shu
* @createDate: 2022/10/27 20:17
* @version: 1.0
*/
public class SetRequests {
private final String key;
private final Object value;
public SetRequests(String key, Object value) {
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public Object getValue() {
return value;
}
@Override
public String toString() {
return "SetRequests{" +
"key='" + key + '\'' +
", value=" + value +
'}';
}
}
import akka.actor.AbstractActor;
import akka.event.Logging;
import akka.event.LoggingAdapter;
import akka.japi.pf.ReceiveBuilder;
import java.util.HashMap;
import java.util.Map;
/**
* @description: Java-AkkaDba
* @author: shu
* @createDate: 2022/10/27 21:13
* @version: 1.0
*/
public class AkkaDbs extends AbstractActor {
protected final LoggingAdapter log = Logging.getLogger(context().system(), this);
protected final Map<String, Object> map = new HashMap<>();
private AkkaDbs() {
receive(ReceiveBuilder
.match(SetRequests.class, message -> {
System.out.printf("收到的key:%s,value:%s%n",message.getKey(),message.getValue());
map.put(message.getKey(), message.getValue());
})
.matchAny(o -> System.out.printf("收到的消息:%s",o))
.build()
);
}
}
import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.testkit.TestActorRef;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class AkkademyDbTest {
// 获取Actor系统的引用
ActorSystem system = ActorSystem.create();
@Test
public void itShouldPlaceKeyValueFromSetMessageIntoMap() {
// 创建一个actor
TestActorRef<AkkaDbs> actorRef = TestActorRef.create(system, Props.create(AkkaDbs.class));
// 发送消息
actorRef.tell(new SetRequests("key", "value"), ActorRef.noSender());
// 我们需要检查Actor是否将值存入了map中,确认其行为是否正确
AkkaDbs akkademyDb = actorRef.underlyingActor();
assertEquals(akkademyDb.map.get("key"), "value");
}
}

ThisBuild / version := "0.1.0-SNAPSHOT"
ThisBuild / scalaVersion := "2.11.7"
// 依赖
libraryDependencies ++= Seq(
"com.typesafe.akka" %% "akka-actor" % "2.3.3",
"com.typesafe.akka" %% "akka-testkit" % "2.3.6" % "test",
"org.scalatest" %% "scalatest" % "2.1.6" % "test"
)
lazy val root = (project in file("."))
.settings(
name := "ActorDemo01"
)
/**
* @description: 样例类
* @author: shu
* @createDate: 2022/10/27 20:14
* @version: 1.0
*/
case class SetRequest (key:String ,value: Object);
import akka.actor.{AbstractActor, Actor}
import akka.event.Logging
import java.util
/**
* @description: Scala-AkkaDba
* @author: shu
* @createDate: 2022/10/27 20:52
* @version: 1.0
*/
class AkkaDba extends Actor {
val map =new util.HashMap[String,Object]
val log=Logging(context.system,this);
// 接受消息
override def receive: Receive = {
// 指定的消息
case SetRequest(key,value)=>{
log.info("收到的key:{},value:{}",key,value)
map.put(key,value);
}
// 默认消息
case 0 =>{
log.info("收到一个错误的消息")
}
}
}
import akka.actor.ActorSystem
import akka.testkit.TestActorRef
import org.scalatest.{FunSpecLike, Matchers}
class AkkademyDbSpec extends FunSpecLike with Matchers {
// 获取系统实例
implicit val system = ActorSystem()
describe("akkademyDb") {
describe("given SetRequest") {
it("should place key/value into map") {
// 创建Actor实例
val actorRef = TestActorRef(new AkkaDba)
// 发送消息
actorRef ! SetRequest("key", "123456")
// 验证消息
val akkademyDb = actorRef.underlyingActor
akkademyDb.map.get("key") should equal("123456")
}
}
}
}

//Java
ActorSystem system = ActorSystem.create();
//Scala
implicit val system = ActorSystem()
//Java
TestActorRef<AkkademyDb> actorRef = TestActorRef.create(system, Props.
create(AkkademyDb.class));
//Scala
val actorRef = TestActorRef(new AkkademyDb)
//Java
actorRef.tell(new SetRequest("key", "value"), ActorRef.noSender());
//Scala
actorRef ! SetRequest("key", "value")
//Java
AkkademyDb akkademyDb = actorRef.underlyingActor();
assertEquals(akkademyDb.map.get("key"), "value");
//Scala
val akkademyDb = actorRef.underlyingActor
akkademyDb.map.get("key") should equal(Some("value"))
这样我们就完成了第一个简单的测试用例。这个基本的模式可以用于构建同步的Actor单元测试。