我需要使用在外部类中初始化的变量来在内部类中使用。所以我使用了静态变量。这也是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;
}
}
}
1条答案
按热度按时间hjqgdpho1#
一般来说,pojo的序列化不能捕获静态变量的状态。从我读到的信息来看,flink系列化也没什么不同。
所以当你说静态变量状态在某些情况下是“保留”的,我认为你误解了证据。另一种方法是保存静态变量的状态,或者将它们初始化为在“before”和“after”情况下恰好相同的值。
为什么我这么肯定?问题是序列化静态变量没有多大意义。想想这个
如果
Cat
已序列化:每次串行流包含
Cat
它将(必须)包含迄今为止创造的所有猫。每当我反序列化包含
Cat
,我还需要反序列化ArrayList<Cat>
. 我该怎么处理它?是否覆盖
allCats
用它(和其他猫失去联系?)我要把它扔掉吗?
我是否尝试合并列表(怎样?什么语义学?我有两只叫“毛茸茸”的猫吗
基本上,对于这个场景,没有任何语义可以很好地解决问题。(通用)解决方案是不序列化
static
变量。