我需要使用在外部类中初始化的变量才能在内部类中使用。所以我使用了静态变量。这也是Flink应用程序。
当构建为eclipse-export-runnable jar时-可以正常工作-保留变量状态
当构建为maven或eclipse-export-jar时-失败-变量状态丢失
FileMonitorWrapper.fileInputDir-值为“”,并且不获取传递的值。
听起来很奇怪。任何想法
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;
}
}
}
答案 0 :(得分:0)
通常来说,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
的静态字段已序列化:
每次串行流包含Cat
时,它将(必须)包含到目前为止创建的所有cat。
每当我反序列化包含Cat
的流时,我还需要反序列化ArrayList<Cat>
。我该怎么办?
allCats
? (又迷失了其他猫?)基本上,这种情况下,总体上没有一个语义可以解决。 (通用)解决方案是不序列化static
变量。