当前位置:   article > 正文

AKKA框架持久化入门样例_akka 持久化db

akka 持久化db

背景

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

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文件,其实只有两个依赖就够用了。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>TestAkka</groupId>
  7. <artifactId>TestAkka</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <build>
  10. <plugins>
  11. <plugin>
  12. <groupId>org.apache.maven.plugins</groupId>
  13. <artifactId>maven-compiler-plugin</artifactId>
  14. <configuration>
  15. <source>8</source>
  16. <target>8</target>
  17. </configuration>
  18. </plugin>
  19. </plugins>
  20. </build>
  21. <dependencies>
  22. <dependency>
  23. <groupId>com.typesafe.akka</groupId>
  24. <artifactId>akka-actor_2.12</artifactId>
  25. <version>2.5.22</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.iq80.leveldb</groupId>
  29. <artifactId>leveldb</artifactId>
  30. <version>0.7</version>
  31. </dependency>
  32. </dependencies>
  33. </project>

第四步:编写代码

总共需要四个文件

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

  1. import java.io.Serializable;
  2. public class MyData implements Serializable {
  3. private static final long serialVersionUID = 1L;
  4. private String name;
  5. public MyData(String name){
  6. this.name= name;
  7. }
  8. @Override
  9. public String toString() {
  10. return "MyData{" +
  11. "name='" + name + '\'' +
  12. '}';
  13. }
  14. }

(2)Actor类

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

  1. import akka.persistence.AbstractPersistentActor;
  2. import akka.persistence.SnapshotOffer;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. public class MyPersistentActor extends AbstractPersistentActor {
  6. private List<MyData> state = new ArrayList<MyData>();
  7. @Override
  8. public String persistenceId() {
  9. return "Kangyucheng";
  10. }
  11. @Override
  12. public Receive createReceiveRecover() {
  13. return receiveBuilder()
  14. .match(MyData.class, e -> state.add(e))
  15. .match(SnapshotOffer.class, ss -> state = (List<MyData>) ss.snapshot())
  16. .build();
  17. }
  18. @Override
  19. public Receive createReceive() {
  20. return receiveBuilder()
  21. .match(MyData.class, c -> {
  22. persist(c, event -> state.add(event));
  23. })
  24. .matchEquals("snap", s -> saveSnapshot(new ArrayList<>(state)))
  25. .matchEquals("print", s -> System.out.println(state))
  26. .build();
  27. }
  28. }

(3)Main测试类

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

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

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

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

第五步:运行程序

(1)第一次运行

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

 控制台打出来了List

 

(2)第二次运行

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

(3)第三次运行

可见前两次运行的结果

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/179744
推荐阅读
相关标签
  

闽ICP备14008679号