一个关于检测程序是否是第一次在环境中启动的功能

Springboot或java程序怎么样判断在这个环境中是第一次启动或者需要执行初始化程序

就是想程序在第一次启动的时候,执行一些代码或者脚本来进行能够支持测试或生产的环境部署

比如我的程序orm框架用的是jpa,然后库表是可以自动生成的
但是有一些基本的没有异议的字典数据是可以用sql文件来导入的
那我怎么样来判断程序是否是第一次启动?
判断表中的数据数量?还是在本地资源文件中写入的一个标识文件

在本地磁盘创建一个文件,标识是否初始化,这样很简单。

import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class MainTest {
	public static void main(String[] args) throws Exception {
		
		Path file = Paths.get("/etc/app/initialized");
		
		if (Files.exists(file)) {
			System.out.println("非第一次启动");
		} else {
			try {
				Files.write(file, "1".getBytes(), StandardOpenOption.CREATE_NEW);
			} catch (FileAlreadyExistsException e) {
				// 并发情况下,其他的线程已经创建了该文件
			}
			System.out.println("是第一次启动");
		}
	}
}

1 个赞

也可以在文件中写入一些元数据。

那这个函数应该在哪里调用呢?
因为像基于orm框架的持久化操作导入一些基础数据是需要jpa在容器内启动完成后才可以的
这个部分应该在springboot的哪个部分来运行?监听特殊事件吗,还是其他的

可以用 ApplicationRunner。在程序启动完毕后执行。

好的!我去试试

可以了!非常感谢

@Slf4j
@Component
public class FirstStartup implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        log.info("检测是否是第一次启动");

        String filePath = System.getenv("SystemDrive")+"/root/.ivory/initialized";
		log.info("The lock file on {}.",filePath.toString());
		File lockFIle =	FileUtil.file(filePath);
		if (!(lockFIle.exists()&&lockFIle.isFile())){
			log.info("第一次启动");
			FileUtil.touch(lockFIle);
			FileUtil.writeString("1", lockFIle, "UTF8");
		} else {
			FileUtil.writeString(RandomUtil.randomString(8), lockFIle, "UTF8");
		}
    }
}
1 个赞