当前位置: 首页 > 面试题库 >

用Java存储状态

李景天
2023-03-14
问题内容

广泛的讨论问题。是否已经有任何库可以让我在Java中存储应用程序的执行状态?

例如,我有一个处理文件的应用程序,现在该应用程序可能在某个时刻被迫关闭。我想存储所有已处理文件和未处理文件的信息,以及处理正在进行的阶段正在进行的流程。

是否已经有抽象此功能的库,或者我将不得不从头开始实现它?


问题答案:

似乎您正在寻找的是可以使用Java Serialization
API
执行的序列化。

如果决定使用诸如Apache Commons
Lang之类的已知库以及它的SerializationUtils类(其本身基于Java
Serialization API构建),则可以编写更少的代码。

使用最新的,将您的应用程序状态序列化/反序列化为文件的过程只需几行。

您唯一要做的就是创建一个保存应用程序状态的类,让我们称之为… ApplicationState:-)它看起来可能像这样:

class ApplicationState {

 enum ProcessState {
  READ_DONE,
  PROCESSING_STARTED,
  PROCESSING_ENDED,
  ANOTHER_STATE;
 }

 private List<String> filesDone, filesToDo;
 private String currentlyProcessingFile;
 private ProcessState currentProcessState;
}

使用这种结构,并使用SerializationUtils,可以通过以下方式完成序列化:

try {
      ApplicationState state = new ApplicationState();
      ...
      // File to serialize object to
      String fileName = "applicationState.ser";

      // New file output stream for the file
      FileOutputStream fos = new FileOutputStream(fileName);

      // Serialize String
      SerializationUtils.serialize(state, fos);
      fos.close();

      // Open FileInputStream to the file
      FileInputStream fis = new FileInputStream(fileName);

      // Deserialize and cast into String
      String ser = (String) SerializationUtils.deserialize(fis);
      System.out.println(ser);
      fis.close();
    } catch (Exception e) {
      e.printStackTrace();
    }


 类似资料:
  • 我目前正在考虑将opengl状态存储为某种适当类型的全局thread_local变量。那个设计有多糟糕?有什么陷阱吗?

  • 全局状态存储与普通状态存储有何不同? 全局状态存储是否在不同机器上运行的所有实例中都有数据副本?由于全局状态存储不使用任何更改日志主题进行恢复,因此在重新启动时它的行为在我的场景中全局存储的源主题没有键。

  • 我有一个用于处理TumblingEventTimeWindows,其中我使用状态存储在多个滚动窗口中保存一些值。我的问题是,这个状态存储没有在滚动窗口中保存,也就是说,如果我首先在windows[0,999]中存储一些东西,然后从windows[1000,1999]访问这个存储,那么这个存储是空的。我知道这里所述的全局状态和每个窗口状态。我要使用全局状态。我还尝试创建一个最低限度的工作示例来调查这

  • 我正在开发使用Spring Cloud Stream构建的Kafka Streams应用程序。在这个应用程序中,我需要: 使用可在以后检索的连续消息流。 保留与某些条件匹配的邮件 ID 列表。 在单独的线程中,运行一个计划程序,该计划程序定期读出消息 ID,检索与这些 ID 匹配的相应消息,并对这些消息执行操作。 从列表中删除已处理的消息 ID,以便不重复工作。 我已考虑如下实施: < li >将

  • 我们有以下高级DSL处理拓扑: 简而言之,我们在上面做的是: null 其思想是创建窗口化事件计数,并将这些窗口化键用于联接和聚合操作(在KTable的情况下,这类操作没有窗口) 问题是:join和aggregate操作的状态存储没有保留机制,并导致磁盘(RocksDB)中的空间爆炸。 更具体地说:(跳跃)窗口会在键上产生笛卡尔积,并且没有删除旧窗口的机制。 请注意,支持table1和table2

  • 问题内容: 我想在CoreData中存储托管对象的枚举状态 最后一步是将StateFullManagedObject的状态变量转换为ObjStatus以进行直接比较,这对我不起作用。例如,我不能在Int16和Int16枚举之间使用==运算符。我得到的编译时错误是 Int16不能转换为’MirrorDisposition’ 。请参阅以下条件: 如何在Int16和枚举之间进行比较/分配? 问题答案: