java静态变量在maven JAR和eclipse可运行JAR中的行为不同

9nvpjoqh  于 2021-06-24  发布在  Flink
关注(0)|答案(1)|浏览(324)

我需要使用在外部类中初始化的变量来在内部类中使用。所以我使用了静态变量。这也是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;
  }
}

}

hjqgdpho

hjqgdpho1#

一般来说,pojo的序列化不能捕获静态变量的状态。从我读到的信息来看,flink系列化也没什么不同。
所以当你说静态变量状态在某些情况下是“保留”的,我认为你误解了证据。另一种方法是保存静态变量的状态,或者将它们初始化为在“before”和“after”情况下恰好相同的值。
为什么我这么肯定?问题是序列化静态变量没有多大意义。想想这个

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 ,我还需要反序列化 ArrayList<Cat> . 我该怎么处理它?
是否覆盖 allCats 用它(和其他猫失去联系?)
我要把它扔掉吗?
我是否尝试合并列表(怎样?什么语义学?我有两只叫“毛茸茸”的猫吗
基本上,对于这个场景,没有任何语义可以很好地解决问题。(通用)解决方案是不序列化 static 变量。

相关问题