AKKA框架持久化入门样例
背景
我们在开发的过程中可能会在内存中操作数据,但是可能会遇到突然服务器断电、网线被挖等情况。这就需要将内存中的数据持久化,在程序重启的时候依然能够恢复。
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框架持久化入门样例相关推荐
- PMD 自定义规则实践入门样例
原文:https://testerhome.com/topics/4918 准备工作 首先在PMD官网下载最新版本的文件,目前最新版本是5.4.1. 下载pmd-bin-5.4.1.zip和pmd- ...
- springboot+websocket+layui制作的实时聊天室,后端开发入门样例
实时聊天室 前言 效果图 涉及技术 springboot layui websocket 实现思路 websocket在springboot下的实现 前端实现 建立websocket连接 前端对应的w ...
- 【原创】一个简单的StreamInsight样例分析:MarketMonitor
MarketMonitor是2009年微软专业开发者大会上StreamInsight小组资深程序经理Torsten Grabs演讲中的第一个StreamInsight Demo.这个Demo演示了如何 ...
- BlackBerry PlayBook NDK 官方样例介绍。
在PlayBook NDK环境中可以通过导入样例的方式创建新项目,所创建的项目中会包括样例的源代码和相关配置文件,开发人员可以直接进行测试,是很好的PlayBook NDK 开发入门资料.现在的样例不 ...
- Java日志框架-SLF4J入门 [ LogBack 样例实现 ]
概述 slf4j只是一个日志标准,并不是日志系统的具体实现. 我们编程的时候只需要操作slf4j,具体底层实现不关注,只需要配置即可. slf4j只做两件事情: 提供日志接口 提供获取具体日志对象的方 ...
- 一文入门HTML+CSS+JS(样例后续更新)
一文入门HTML+CSS+JS(样例后续更新) 前言 HTML,CSS和JS的关系 HTML head元素 title link meta body元素 设置网页正文颜色与背景颜色 添加网页背景图片 ...
- Ajax框架,DWR介绍,应用,样例
使用Ajax框架 1.简化JavaScript的开发难度 2.解决浏览器的兼容性问题 3. 简化开发流程 经常使用Ajax框架 Prototype 一个纯粹的JavaScript函数库,对Ajax提供 ...
- Python Web框架Tornado的异步处理代码演示样例
1. What is Tornado Tornado是一个轻量级但高性能的Python web框架,与还有一个流行的Python web框架Django相比.tornado不提供操作数据库的ORM接口 ...
- BOS WEB入门开发样例
BOS WEB820入门开发样例 目录 BOS WEB820入门开发样例. 1 一.建立实体和Query(自学) 1 1.导入解决方案. 1 2.建立业务单元. 2 3.添加字段. 3 4.发布元数据 ...
最新文章
- 计算机控制试卷中南大学,期末试卷,需要的自取
- php 扩展apc 参数优化
- 终端主题_泛终端全渠道新模式中国移动5G泛智能终端渠道生态合作峰会开幕
- Nginx-ingress部署及使用
- 为什么前端H5工程师工资那么高?
- 小米路由r1c 刷番茄_充分利用番茄路由器的5条提示
- 软件工程专业如何论文选题?
- 大数据技术体系(长期更新)
- 人工智能在日常农业种植中的应用
- pyhton BOF图像检索
- C-V2X在国内车路协同的应用
- 网站吊唁效果(黑白)
- 三篇论文,纵览深度学习在表格识别中的最新应用
- 常用的adodb使用方法
- 玉米社:seo优化推广 网站收录一直不太好什么原因?
- php+linux+线程安全,转:PHP的线程安全ZTS与非线程(NTS)安全版本的区别
- 微信小程序wx.downloadFile()使用体验
- 【GK101 谐波数据生成器】上位机软件升级(版本:1.1)
- unity3d shader之实时室外光线散射(大气散射)渲染
- Android 开发需要了解的TCP/IP和Http知识
热门文章
- 【中级软考】绑定、静态绑定、动态绑定、静态分配、动态分配是什么?
- mysql ——MHA
- Java多线程、高并发秒杀时MySQL出现死锁原因(Deadlock found when trying to get lock)及对应解决方案
- java正则表达式替换指定字符串_笔记_正则表达式替换字符串中特定范围内的字符。...
- python mapreduce函数_Map-reduce在Python高阶函数中的应用,python,用法,之,mapreduce
- python添加系统环境win7_python环境配置(基于win7 x64)
- c语言汉字属于什么类型_你知道你的身体属于什么类型么?
- idea运行项目报错Cannot run program “C:\Program Files\Java\jdk1.8.0_121\bin\java.exe......解决办法
- JVM中垃圾回收相关算法 - 值得了解一下的,因为早晚得了解
- jieba是python中一个重要的标准函数库_python——Jieba库整理(基础知识+实例)