如何解决如何在重启后恢复Java命令行工具执行
我正在使用Java命令行工具,其工作方式如下:
- 下载文件(其中包含一些键/值数据对)
- 处理整个文件,并将键/值对存储在内存中的TreeMap中(按键排序)。
- 遍历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之间编写所有条件语句,以确保您的程序不会重新处理旧数据。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。