Akka 学习(二)第一个入门程序

news2024/12/25 12:21:36

目录

  • 一 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依赖
<dependency>
  <groupId>org.scala-lang</groupId>
  <artifactId>scala-library</artifactId>
  <version>${scala.version}</version>
  <!--<scope>provided</scope>-->
</dependency>


<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.17</version>
</dependency>

<dependency>
  <groupId>com.typesafe.akka</groupId>
  <artifactId>akka-actor_2.10</artifactId>
  <version>2.3.3</version>
</dependency>




<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.13.2</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>RELEASE</version>
  <scope>compile</scope>
</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 +
                '}';
    }
}

  • 编写消息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<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");
    }

}

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.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")
      }
    }
  }
}

image.png

3.3 对比

  • ActorSystem创建方式
          //Java
          ActorSystem system = ActorSystem.create();
          //Scala
          implicit val system = ActorSystem()
  • 创建Actor
          //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单元测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/66949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2000-2021年各省GDP包括名义GDP、实际GDP、GDP平减指数(以2000年为基期)

全国31省市GDP平减指数(2000-2021年)及计算步骤 1、时间&#xff1a;2000-2021年 2、范围&#xff1a;31省 3、数据包括&#xff1a;2000-2021年各省市GDP平减指数&#xff0c;以2000年为基期&#xff0c;包括数据来源、计算方法、公式等。 4、计算步骤&#xff1a; 第一步…

物联卡采购注意要点有哪些

在这个万物互联的时代&#xff0c;针对于企业设备联网的物联卡就显得格外重要了&#xff0c;而共享单车&#xff0c;移动支付&#xff0c;智慧城市&#xff0c;自动售卖机等企业采购物联卡会面临着各种问题&#xff0c;低价陷阱&#xff0c;流量虚假&#xff0c;管理混乱&#…

sealos issue #2157 debug 思路流程记录

sealos issues#2157 debug思路流程前言分析issue剖析源码解决方案总结前言 这个项目蛮有意思的&#xff0c;sealos 是以 kubernetes 为内核的云操作系统发行版。 boss上看到 -> 沟通 -> 解决某个issue直接offer -> 舒服 本文记录解决 issue 的思路 分析issue BUG…

Linux系统常用的工具

1.1 Vscode编辑器 从官网下载 ubuntu 版本&#xff0c;官网地址&#xff1a;https://code.visualstudio.com/。下载xxx.deb的包。 或者使用指令下载&#xff1a;wget https://az764295.vo.msecnd.net/stable/6261075646f055b99068d3688932416f2346dd3b/code_1.73.1-1667967334…

基于Intel Lake-UP3平台为半导体与集成电路测试设备提供优异计算性能

为什么半导体和IC测试设备需要升级&#xff1f; 随着众多新的高性能应用的需求不断增加&#xff0c;信迈旨在为半导体集成电路测试设备领域的客户提供更好的方案。半导体和集成电路&#xff08;IC&#xff09;测试设备设计用于在一台测试机上同时对不同线路的数百个集成电路…

How Can We Know What Language Models Know?

Abstract 最近的工作通过让语言模型&#xff08;LM&#xff09;填补诸如“奥巴马是一个职业”之类的提示的空白&#xff0c;提出了一个有趣的结果&#xff0c;以检查语言模型&#xff08;LM&#xff09;中包含的知识。这些提示通常是手动创建的&#xff0c;而且很可能不是最佳…

Linux进程通信之进程信号

一、信号的概念&#xff1a; 信号机制是Linux最基本的通讯机制&#xff0c;它可以用来向一个或者多个进程发送异步事件信息&#xff0c;传送少量信息。信号是一个软件中断&#xff0c;并且是一个“软中断”&#xff08;只是告诉有这样一个信号&#xff0c;但这个信号具体如何进…

Redis6入门到实战------思维导图+章节目录

Redis学习大纲 思维导图 思维导图 Redis6入门到实战------1、NoSQL数据库简介 地址&#xff1a; Redis6入门到实战------2、Redis6概述和安装 地址&#xff1a; Redis6入门到实战------3、常用五大数据类型 地址&#xff1a; Redis6入门到实战------4、Redis6配置文件详解…

Stack Overflow 临时禁用 ChatGPT 生成内容,网友:人类和AI快打起来!

如果有一天我们查询到的「知识」真假难辨&#xff0c;那这就太可怕了。 要问最近 AI 圈哪个模型最火爆&#xff0c;你不得不把 OpenAI 推出的 ChatGPT 排在前面。自从发布以来&#xff0c;这个对话模型可谓是出尽风头&#xff0c;很多人更是对其产生了一百个新玩法&#xff0c;…

Linux系统移植四:Petalinux使用本地sstate-cache加速构建根文件系统

根文件系统简介 根文件系统 rootfs 是Linux内核启动以后挂载(mount)的第一个文件系统&#xff0c;然后从根文件系统中读取初始化脚本&#xff0c;比如rcS&#xff0c;inittab等 根文件系统和Linux内核是分开的&#xff0c;单独的Linux内核是没法正常工作的&#xff0c;必须要…

TPM零知识学习六 —— tpm模拟器安装

本文参考以下链接&#xff1a; TPM模拟器和TPM2-TSS安装_jianming21的博客-CSDN博客_tpm2-tss 可信平台模块TPM&#xff08;Trusted Platform Module&#xff09;介绍及tpm-tools安装使用_jinhuazhe2013的博客-CSDN博客_tpm模块 1. 源码下载 运行以下命令下载源码&#xff1…

设计模式--观察者模式

文章目录前言一、未使用设计模式二、观察者模式1.定义2.组成三、应用场景四、优缺点优缺前言 甲人A&#xff08;产品经理&#xff09;&#xff1a;好啊&#xff0c;你小子&#xff0c;又被我逮到了&#xff0c;很闲是吧&#x1f607;&#xff0c;需求完成了吗&#xff1f; two…

MOSFET 和 IGBT 栅极驱动器电路的基本原理学习笔记(三)同步整流器驱动

同步整流器驱动 1.栅极电荷 2.dv/dt注意事项 MOSFET 同步整流器是接地基准开关的一个特例。这些器件与传统应用所使用的 N 沟道 MOSFET 相同&#xff0c;只是它们被应用到了电源的低电压输出而非整流器二极管中。 它们通常可在非常有限的漏源极电压摆幅下工作&#xff0c;因此…

redis活跃非活跃连接数统计及client list说明

概念说明 活跃连接是指当下正在执行命令的连接&#xff0c;非活跃当然是相对的。 在redis中判断当前连接是否活跃是通过 内置的client list 命令输出中的idle来判断 client list字段说明 (kfzops) [roottest-xxx-01-vm ]# redis-cli -h r-xxxxxxxxxxxx.redis.rds.aliyuncs.…

学生身份标签的识别与风控应用

当前的互联网借贷平台&#xff0c;国家已明确规定不允许向高校学生发放贷款&#xff0c;因此对于小贷、消金等金融机构&#xff0c;在信贷产品业务的风控体系中&#xff0c;有效判断申请用户是否为高校学生是一个非常重要的问题。针对高校学生身份的识别&#xff0c;虽然有多种…

机器学习、深度学习、自然语言处理学习 NLP-RoadMap-996station GitHub鉴赏官

推荐理由&#xff1a; 机器学习、深度学习、自然语言处理学习路线图 及 AI方向学习资源、工具 NLP-RoadMap 持续更新中。以下内容有错误或者不足&#xff0c;欢迎提Issue或者联系我讨论 整理不易&#xff0c;希望点个小星星 ​支持下呀&#xff01; 前言 数理基础 编程基础 机…

RE2:Simple and Effective Text Matching with Richer Alignment Features

原文链接&#xff1a;https://aclanthology.org/P19-1465.pdf 介绍 问题 作者认为之前文本匹配模型中序列对齐部分&#xff0c;过于复杂。只有单个inter-sequence alignment层的模型&#xff0c;常会引入外部信息&#xff08;例如语法特征&#xff09;作为额外输入&#xff0c;…

小游戏与H5游戏对比与梳理

H5游戏是运用了h5技术的响应式网站布局的游戏&#xff0c;它完全实现了网页游戏在手机移动端的无缝衔接。众所周知&#xff0c;H5游戏已盛行了多年&#xff0c;而如今&#xff0c;随着诸多小游戏的推出&#xff0c;小游戏爆款频出&#xff0c;从“跳一跳”到“羊了个羊”&#…

Leetcode---2465.不同的平均值数目

目录题目描述分析题目描述 给你一个下标从 0 开始长度为 偶数 的整数数组 nums 。 只要 nums 不是 空数组&#xff0c;你就重复执行以下步骤&#xff1a; 找到 nums 中的最小值&#xff0c;并删除它。 找到 nums 中的最大值&#xff0c;并删除它。 计算删除两数的平均值。 两…

Qt OpenGL 2D图像文字

这次教程中&#xff0c;我们将学会如何使用四边形纹理贴图把文字显示在屏幕上。我们将把256个不同的文字从一个256256的纹理图像中一个个提取出来&#xff0c;接着创建一个输出函数来创建任意我们希望的文字。 还记得在第一篇字体教程中我提到使用纹理在屏幕上绘制文字吗&…