如何在重启后恢复Java命令行工具执行

问题描述

我正在使用Java命令行工具,其工作方式如下:

  1. 下载文件(其中包含一些键/值数据对)
  2. 处理整个文件,并将键/值对存储在内存中的TreeMap中(按键排序)。
  3. 遍历TreeMap并将每个键/值Map条目传递到外部库。因此,基本上,其工作是按“键”对键/值条目进行排序,然后将其传递给外部方法
Sample file content (key-value pairs in JSON):
[{   
      "key" : 2
      "value" : "version2Content"
 },{   
      "key" : 1
      "value" : "version1Content"
 },{   
      "key" : 3
      "value" : "version3Content"
 }]

CLI工具中的伪代码

List<VersionPair> pairs = getVersionPairsFromJSON(input); 

TreeMap<Long,String> orderedEntries = new TreeMap<>();

for (VersionPair pair : pairs) {
    orderedEntries.put(pair.getKey(),pair.getVersionContent());
}

for (Map.Entry<Long,String> entry : orderedEntries) {
    externalMethod.sendVersion(entry.getKey(),entry.getValue())
        .whenComplete((Metadata,error) -> {
            if (error != null) {
                System.err.println("Failed to send Version with key: " + entry.getKey() + ",with content: " + entry.getKey());
            }
        });
}

// POJO for VersionPair
public class VersionPair {
    Long key;
    String versionContent;
    ...
    // constructor,getters and setters
}
public CompletableFuture<Metadata> externalMethod(Long key,String versionContent);

在这里,对externalMethod调用顺序应严格基于JSON文件keys的排序顺序(由于我的应用程序的性质)。例如:

externalMethod.sendVersion(1,"version1Content");
externalMethod.sendVersion(2,"version2Content");
externalMethod.sendVersion(3,"version3Content");

我想知道如果由于某种原因终止执行,是否有可能从中断的地方继续执行该工具。 (例如,用户按Ctrl + C)。假设文件内容保持不变。

我的用例还要求对于给定的键/值对,不能多次调用外部库方法。因此,如果在调用了一些键/值对的外部库之后程序停止了,我需要从程序停止的位置继续,而不是从头开始。

是否可以使用Java命令行工具实现此行为?如果没有,请问我们还有哪些其他选择可以实现这一目标?

谢谢!

解决方法

我猜您的用例是您想为最终用户构建一个命令行应用程序,以将数据提交到外部系统中。

为了实现“恢复”过程,这需要“持久性”存储来记住其“停止”的时间点。

因此,您可能需要包括“基于文件”的数据库,例如H2,HSQL等,或使用简单的文本文件来记住已处理了哪些记录。

假设您的命令行是这样的:java -jar app.jar data1.json,那么在您的程序中可能会立即创建一个data1-inprogress.dat文件。然后记下已成功处理externalMethod的每条记录。

因此,如果应用程序被中断,并且用户重新运行同一命令,则您的程序可以确定data1.json中具有data1-inprogress.dat的任何内容,以指示未完成。那么您可以开始在data1.json和dat1-inprogress.dat之间编写所有条件语句,以确保您的程序不会重新处理旧数据。