@Service
public class WatchFileService {
private static Logger LOG = LoggerFactory.getLogger(WatchFileService.class);
@Autowired
private List<String> legalDomains;
@Value("${legalDomainFilePath}")
private String legalDomainFilePath;
@PostConstruct
public void watchDomainFileAndResetLegalDomains() throws IOException {
WatchService watchService = FileSystems.getDefault().newWatchService();
File file = new File(legalDomainFilePath);
Paths.get(file.getParent())
.register(watchService, StandardWatchEventKinds.ENTRY_MODIFY,
StandardWatchEventKinds.ENTRY_DELETE);
Thread watchThread = new Thread(() -> {
WatchKey watchKey;
while (true) {
LOG.info("监听");
try {
watchKey = watchService.take();
for (WatchEvent<?> event : watchKey.pollEvents()) {
if (Objects.equals(event.context().toString(), file.getName())) {
//重新加载列表
WatchEvent.Kind<?> kind = event.kind();
LOG.info("变化了");
CopyOnWriteArrayList<String> legalDomains = (CopyOnWriteArrayList<String>) this.legalDomains;
legalDomains.removeAll(legalDomains);
File dominFile = new File(legalDomainFilePath);
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String domain ;
LOG.info("获取配置文件中的域名列表读取开始");
while ((domain=br.readLine())!=null){
LOG.info(domain);
if(StringUtils.isNotBlank(domain))
legalDomains.add(domain);
}
LOG.info("获取配置文件中的域名列表读取结束");
}catch (IOException e) {
e.printStackTrace();
System.exit(0);
}
LOG.info("新结果集-----");
for (String legalDomain : this.legalDomains) {
LOG.info(legalDomain);
}
LOG.info("新结果集-----");
break;
}
}
// 重设WatchKey
boolean valid = watchKey.reset();
// 如果重设失败,退出监听
if (!valid) {
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
watchThread.setDaemon(true);
watchThread.start();
//这块一定要加上的,不然下次启动监听时会检查发现已经开启了监听
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
watchService.close();
} catch (IOException e) {
e.printStackTrace();
}
}));
}
}