工作中用到了在本地記錄agent唯一標識的需求,實現方式如下:
public class AgentIdHelper {
private static final Logger logger = LoggerFactory.getLogger(AgentIdHelper.class);
/**
* 監測本地是否有保存agentId的文件?
* 若有,讀取並校驗其中的UUID
* 若無,代碼中重新生成一個UUID,並保存到指定的目錄文件中
* 保存該UUID的文件名和路徑固定
*/
public static String checkLocalAgentId(String agentName) throws IOException {
String agentId = null;
File file = new File("./.".concat(agentName));
if (!file.exists()) {
logger.warn("no this file:{}, need to create!", agentName);
if (!file.createNewFile()) {
logger.error("Create new file fail!!!");
throw new IOException("Create new file fail!!!");
}
logger.info("Create a new file:{} successfully...", file.getName());
// 寫入UUID
agentId = UUID.randomUUID().toString();
logger.info("generate a new agentId:{}", agentId);
try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {
bw.write(agentId);
} catch (Exception e) {
logger.error("Close BufferedWriter or FileWriter exception!!!", e);
}
logger.info("New agentId:{} write to file successfully...", agentId);
} else {
logger.info("File:{} has exist, start to read it...", file.getName());
// 讀取文件內容
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String tmpAgentId;
while ((tmpAgentId = br.readLine()) != null) {
logger.info("show agentId:{} which read from file...", tmpAgentId);
agentId = tmpAgentId;
}
} catch (Exception e) {
logger.error("Close BufferedReader or FileReader exception!!!", e);
}
}
return agentId;
}
}
注:該方法使用uuid作爲唯一標識,並將生成的標識以字符串的形式保存在本地的隱藏文件中,每次程序啓動會先去本地讀取該文件,若無法讀取會重新生成一份