静态变量在 Maven Jar 和 Eclipse 可运行的 JAR 中的行为不同



我需要使用在外部类中初始化的变量才能在内部类中使用。所以我使用了静态变量。这也是 Flink 应用程序。

当构建为 eclipse-export-runnable jar 时 - 它工作正常 - 变量保留的状态

当构建为 maven 或 eclipse-export-jar 时,它失败了 - 变量的状态丢失

FileMonitorWrapper.fileInputDir--values 是 " 并且不获取传递的值。

听起来很奇怪..任何想法

static transient String fileInputDir="";
static transient String fileArchiveDir="";
@SuppressWarnings("serial")
public DataStream<String> ScanDirectoryForFile(String inputDir, String inputFilePattern,String archiveDir, StreamExecutionEnvironment env) {
try {
FileMonitorWrapper.fileArchiveDir = archiveDir;
FileMonitorWrapper.fileInputDir = inputDir;
filteredDirFiles = dirFiles.filter(new FileMapper());
.
.
.
}
}

@SuppressWarnings("serial")
static class FileMapper implements     FilterFunction<TimestampedFileInputSplit>{
@Override
public boolean filter(TimestampedFileInputSplit value) throws Exception {
if(value.toString().contains("done")) 
FileMonitorWrapper.doneFound = true;
if(value.toString().contains("dat"));
FileMonitorWrapper.datFound = true;
if(FileMonitorWrapper.datFound && FileMonitorWrapper.doneFound) {
try {
if(value.getPath().toString().contains("done")) {
Files.move(Paths.get(FileMonitorWrapper.fileInputDir+"\"+value.getPath().getName()),
Paths.get(FileMonitorWrapper.fileArchiveDir+"\"+value.getPath().getName()));
}
}catch(Exception e){
e.printStackTrace();
}
return (!value.toString().contains("done"));
}
else 
return false;
}
}

}

一般来说,POJO 的序列化不会捕获静态变量的状态。 从我所读到的内容来看,Flink 序列化也不例外。

因此,当您说静态变量状态在某些情况下被"保留"时,我认为您误解了证据。 其他方法是保留静态变量的状态,或者将它们初始化为在"之前"和"之后"情况下恰相同的值。


我为什么这么肯定? 问题是序列化静态变量没有多大意义。 考虑一下

public class Cat {
private static List<Cat> allCats = new ArrayList<>();
private String name;
private String colour;
public Cat(...) {
...
allCats.add(this);
}
...
}
Cat fluffy = new Cat("fluffy", ...);
Cat claus = new Cat("claus", ...);

如果序列化Cat的静态字段:

  1. 每次串行流包含Cat时,它(必须)包含到目前为止创建的所有猫。

  2. 每当我反序列化一个包含Cat的流时,我还需要反序列化ArrayList<Cat>。 我该怎么处理它?

    • 我用它覆盖allCats吗? (并失去其他猫的踪迹?
    • 我把它扔掉吗?
    • 我是否尝试合并列表? (如何? 什么语义? 我有两只叫"毛茸茸"的猫吗?

基本上,这种情况没有语义可以很好地工作。(通用)解决方案是不序列化static变量。

最新更新