Akka 学习(二)第一个入门程序
创始人
2024-03-22 11:39:33

目录

  • 一 sbt 介绍
    • 1.1 Sbt
    • 1.2 下载安装
    • 1.3 sbt的特点
    • 1.4 Idea 配置Sbt开发工具
  • 二 构建定义
    • 2.1 指定版本
    • 2.2 build.sbt 设置
  • 三 代码实现
    • 3.1 Java版本
    • 3.2 Scala版本
    • 3.3 对比

一 sbt 介绍

1.1 Sbt

  • sbt 是为 Scala 和 Java 项目构建的。它是93.6%的 Scala 开发人员的首选构建工具(2019 年)。
  • sbt 可以理解为包管理工具,向maven一样来管理开发包管理工具。

1.2 下载安装

下载地址:
image.png
解压配置环境变量
SBT_HOME
image.png
PATH
image.png

  • 修改配置文件

image.png

-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  # 仓库镜像配置

image.png

  • 仓库设置
[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]
  • 验证

image.png

1.3 sbt的特点

  • 简单项目需要很少或不需要配置
  • 基于 Scala 的构建定义,可以充分利用 Scala 代码的灵活性
  • 使用从编译器中提取的信息进行精确的增量重新编译
  • 使用 Coursier 的 图书馆管理支持
  • 持续编译和测试 触发执行
  • 支持混合的 Scala/ Java项目
  • 支持使用 ScalaCheck、specs 和 ScalaTest进行测试。JUnit 由插件支持。
  • 使用类路径上的项目类和依赖项启动 Scala REPL
  • 子项目支持模块化
  • 外部项目支持(将 git 存储库列为依赖项!)
  • 并行任务执行,包括并行测试执行

1.4 Idea 配置Sbt开发工具

  • 插件安装

image.png

  • SBT 软件配置

image.png

  • 创建新项目

image.png

  • sbt 命令窗口

image.png
image.png

二 构建定义

2.1 指定版本

  • 作为构建定义的一部分,您将指定构建使用的 sbt 版本。这允许使用不同版本的 sbt 启动器的人构建具有一致结果的相同项目。为此,创建一个project/build.properties指定 sbt 版本的文件。
  • 如果所需版本在本地不可用,sbt启动器将为您下载。如果此文件不存在,sbt启动器将选择一个任意版本,这是不鼓励的,因为它会使您的构建不可移植。

image.png

2.2 build.sbt 设置

# 打包构建的版本
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")

image.png

三 代码实现

3.1 Java版本

  • Maven依赖
org.scala-langscala-library${scala.version}
log4jlog4j1.2.17
com.typesafe.akkaakka-actor_2.102.3.3
junitjunit4.13.2test
org.testngtestngRELEASEcompile

  • 编写消息实体类
/*** @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;}@Overridepublic String toString() {return "SetRequests{" +"key='" + key + '\'' +", value=" + value +'}';}
}
  • 编写消息Actor
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 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();@Testpublic void itShouldPlaceKeyValueFromSetMessageIntoMap() {// 创建一个actorTestActorRef 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");}}

image.png

3.2 Scala版本

  • sbt依赖
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);
  • Actor处理中心
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.TestActorRefimport 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.underlyingActorakkademyDb.map.get("key") should equal("123456")}}}
}

image.png

3.3 对比

  • ActorSystem创建方式
          //JavaActorSystem system = ActorSystem.create();//Scalaimplicit val system = ActorSystem()
  • 创建Actor
          //JavaTestActorRef actorRef = TestActorRef.create(system, Props.create(AkkademyDb.class));//Scalaval actorRef = TestActorRef(new AkkademyDb)
  • 发送消息
            //JavaactorRef.tell(new SetRequest("key", "value"), ActorRef.noSender());//ScalaactorRef ! SetRequest("key", "value")
  • 检测消息
            //JavaAkkademyDb akkademyDb = actorRef.underlyingActor();assertEquals(akkademyDb.map.get("key"), "value");//Scalaval akkademyDb = actorRef.underlyingActorakkademyDb.map.get("key") should equal(Some("value"))

这样我们就完成了第一个简单的测试用例。这个基本的模式可以用于构建同步的Actor单元测试。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...