背景

我们在开发的过程中可能会在内存中操作数据,但是可能会遇到突然服务器断电、网线被挖等情况。这就需要将内存中的数据持久化,在程序重启的时候依然能够恢复。

AKKA介绍

Akka is a toolkit for building highly concurrent, distributed, and resilient message-driven applications for Java and Scala

Akka是一个用于为Java和Scala构建高度并发,分布式和弹性的消息驱动应用程序的工具包

虽然AKKA不是专门用来持久化的,但是其中的持久化部分可以拿出来使用。

本文参照AKKA官方文档,展示了AKKA持久化的一个样例。

第一步:配置JDK和Maven环境

这里推荐JDK1.8和Maven3

第二步:创建Maven工程

本人习惯采用IDEA

如果创建完工程有提示

第三步:添加依赖

修改pom.xml文件,其实只有两个依赖就够用了。

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>TestAkka</groupId><artifactId>TestAkka</artifactId><version>1.0-SNAPSHOT</version><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>8</source><target>8</target></configuration></plugin></plugins></build><dependencies><dependency><groupId>com.typesafe.akka</groupId><artifactId>akka-actor_2.12</artifactId><version>2.5.22</version></dependency><dependency><groupId>org.iq80.leveldb</groupId><artifactId>leveldb</artifactId><version>0.7</version></dependency></dependencies></project>

第四步:编写代码

总共需要四个文件

(1)MyData 这个类是用来封装数据的,也就是说,我们希望进行持久化的数据可以封装到这个里面。需要注意的是,这个类必须要实现Serializable接口

import java.io.Serializable;public class MyData implements Serializable {private static final long serialVersionUID = 1L;private String name;public MyData(String name){this.name= name;}@Overridepublic String toString() {return "MyData{" +"name='" + name + '\'' +'}';}
}

(2)Actor类

这个类要继承AbstractPersistentActor类,并能覆盖其中三个方法。

import akka.persistence.AbstractPersistentActor;
import akka.persistence.SnapshotOffer;import java.util.ArrayList;
import java.util.List;public class MyPersistentActor extends AbstractPersistentActor {private List<MyData> state = new ArrayList<MyData>();@Overridepublic String persistenceId() {return "Kangyucheng";}@Overridepublic Receive createReceiveRecover() {return receiveBuilder().match(MyData.class, e -> state.add(e)).match(SnapshotOffer.class, ss -> state = (List<MyData>) ss.snapshot()).build();}@Overridepublic Receive createReceive() {return receiveBuilder().match(MyData.class, c -> {persist(c, event -> state.add(event));}).matchEquals("snap", s -> saveSnapshot(new ArrayList<>(state))).matchEquals("print", s -> System.out.println(state)).build();}}

(3)Main测试类

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;public class Main {public static void main(String... args) throws Exception {//1.创建 persistentActor,注意MyPersistentActor对应的是我们自己创建的Actorfinal ActorSystem system = ActorSystem.create();final ActorRef persistentActor = system.actorOf(Props.create(MyPersistentActor.class));//2.调用tell方法String random = String.valueOf((int)(Math.random()*100));persistentActor.tell(new MyData("kangyucheng"+random), null);persistentActor.tell(new MyData("kyc"), null);persistentActor.tell("snap", null);persistentActor.tell("print", null);//3.由于系统是异步持久化,所以要等一下Thread.sleep(10000);system.terminate();}
}

(4) AKKA配置类application.conf这个文件放在了resources文件下面

主要是配置持久化文件的存储位置

akka.persistence.journal.plugin = "akka.persistence.journal.leveldb"
akka.persistence.snapshot-store.plugin = "akka.persistence.snapshot-store.local"akka.persistence.journal.leveldb.dir = "target/example/journal"
akka.persistence.snapshot-store.local.dir = "target/example/snapshots"# DO NOT USE THIS IN PRODUCTION !!!
akka.persistence.journal.leveldb.native = false

第五步:运行程序

(1)第一次运行

发现target文件夹下出现了配置文件中的目录,这个目录存储的就是持久化的文件

控制台打出来了List

(2)第二次运行

可以看见第一次运行存储在内存中的

(3)第三次运行

可见前两次运行的结果

AKKA框架持久化入门样例相关推荐

  1. PMD 自定义规则实践入门样例

    原文:https://testerhome.com/topics/4918 准备工作 首先在PMD官网下载最新版本的文件,目前最新版本是5.4.1.  下载pmd-bin-5.4.1.zip和pmd- ...

  2. springboot+websocket+layui制作的实时聊天室,后端开发入门样例

    实时聊天室 前言 效果图 涉及技术 springboot layui websocket 实现思路 websocket在springboot下的实现 前端实现 建立websocket连接 前端对应的w ...

  3. 【原创】一个简单的StreamInsight样例分析:MarketMonitor

    MarketMonitor是2009年微软专业开发者大会上StreamInsight小组资深程序经理Torsten Grabs演讲中的第一个StreamInsight Demo.这个Demo演示了如何 ...

  4. BlackBerry PlayBook NDK 官方样例介绍。

    在PlayBook NDK环境中可以通过导入样例的方式创建新项目,所创建的项目中会包括样例的源代码和相关配置文件,开发人员可以直接进行测试,是很好的PlayBook NDK 开发入门资料.现在的样例不 ...

  5. Java日志框架-SLF4J入门 [ LogBack 样例实现 ]

    概述 slf4j只是一个日志标准,并不是日志系统的具体实现. 我们编程的时候只需要操作slf4j,具体底层实现不关注,只需要配置即可. slf4j只做两件事情: 提供日志接口 提供获取具体日志对象的方 ...

  6. 一文入门HTML+CSS+JS(样例后续更新)

    一文入门HTML+CSS+JS(样例后续更新) 前言 HTML,CSS和JS的关系 HTML head元素 title link meta body元素 设置网页正文颜色与背景颜色 添加网页背景图片 ...

  7. Ajax框架,DWR介绍,应用,样例

    使用Ajax框架 1.简化JavaScript的开发难度 2.解决浏览器的兼容性问题 3. 简化开发流程 经常使用Ajax框架 Prototype 一个纯粹的JavaScript函数库,对Ajax提供 ...

  8. Python Web框架Tornado的异步处理代码演示样例

    1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与还有一个流行的Python web框架Django相比.tornado不提供操作数据库的ORM接口 ...

  9. BOS WEB入门开发样例

    BOS WEB820入门开发样例 目录 BOS WEB820入门开发样例. 1 一.建立实体和Query(自学) 1 1.导入解决方案. 1 2.建立业务单元. 2 3.添加字段. 3 4.发布元数据 ...

最新文章

  1. 计算机控制试卷中南大学,期末试卷,需要的自取
  2. php 扩展apc 参数优化
  3. 终端主题_泛终端全渠道新模式中国移动5G泛智能终端渠道生态合作峰会开幕
  4. Nginx-ingress部署及使用
  5. 为什么前端H5工程师工资那么高?
  6. 小米路由r1c 刷番茄_充分利用番茄路由器的5条提示
  7. 软件工程专业如何论文选题?
  8. 大数据技术体系(长期更新)
  9. 人工智能在日常农业种植中的应用
  10. pyhton BOF图像检索
  11. C-V2X在国内车路协同的应用
  12. 网站吊唁效果(黑白)
  13. 三篇论文,纵览深度学习在表格识别中的最新应用
  14. 常用的adodb使用方法
  15. 玉米社:seo优化推广 网站收录一直不太好什么原因?
  16. php+linux+线程安全,转:PHP的线程安全ZTS与非线程(NTS)安全版本的区别
  17. 微信小程序wx.downloadFile()使用体验
  18. 【GK101 谐波数据生成器】上位机软件升级(版本:1.1)
  19. unity3d shader之实时室外光线散射(大气散射)渲染
  20. Android 开发需要了解的TCP/IP和Http知识

热门文章

  1. 【中级软考】绑定、静态绑定、动态绑定、静态分配、动态分配是什么?
  2. mysql ——MHA
  3. Java多线程、高并发秒杀时MySQL出现死锁原因(Deadlock found when trying to get lock)及对应解决方案
  4. java正则表达式替换指定字符串_笔记_正则表达式替换字符串中特定范围内的字符。...
  5. python mapreduce函数_Map-reduce在Python高阶函数中的应用,python,用法,之,mapreduce
  6. python添加系统环境win7_python环境配置(基于win7 x64)
  7. c语言汉字属于什么类型_你知道你的身体属于什么类型么?
  8. idea运行项目报错Cannot run program “C:\Program Files\Java\jdk1.8.0_121\bin\java.exe......解决办法
  9. JVM中垃圾回收相关算法 - 值得了解一下的,因为早晚得了解
  10. jieba是python中一个重要的标准函数库_python——Jieba库整理(基础知识+实例)