注意:1.引入FileAlterationListenerAdaptor
2.listener不被spring容器管理,无法通过注解获取spring管理的bean。本例子用静态属性对其进行赋值。
1、文件监听器
/**
-
文件夹监听器
-
检测到文件夹更新,则更新缓存内容
*/
public class FileListener extends FileAlterationListenerAdaptor {
private static LocationService locationService;
private static MicsDatapointSystemService micsDatapointSystemService;
private static UploadProperties uploadProperties;
private static RedisTemplate<Object, Object> redisTemplate;public static LocationService getLocationService() {
return locationService;
}public static void setLocationService(LocationService locationService) {
FileListener.locationService = locationService;
}public static MicsDatapointSystemService getMicsDatapointSystemService() {
return micsDatapointSystemService;
}public static void setMicsDatapointSystemService(MicsDatapointSystemService micsDatapointSystemService) {
FileListener.micsDatapointSystemService = micsDatapointSystemService;
}public static UploadProperties getUploadProperties() {
return uploadProperties;
}public static void setUploadProperties(UploadProperties uploadProperties) {
FileListener.uploadProperties = uploadProperties;
}public static RedisTemplate<Object, Object> getRedisTemplate() {
return redisTemplate;
}public static void setRedisTemplate(RedisTemplate<Object, Object> redisTemplate) {
FileListener.redisTemplate = redisTemplate;
}/**
-
文件创建执行
*/
public void onFileCreate(File file) {
try {
setDataInRedis();//注入缓存
} catch (Exception e) {
e.printStackTrace();
}
}
/**
-
文件创建修改
*/
public void onFileChange(File file) {
try {
setDataInRedis();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
-
文件删除
*/
public void onFileDelete(File file) {
try {
setDataInRedis();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
-
目录创建
*/
public void onDirectoryCreate(File directory) {
try {
setDataInRedis();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
-
目录修改
*/
public void onDirectoryChange(File directory) {
try {
setDataInRedis();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
-
目录删除
*/
public void onDirectoryDelete(File directory) {
try {
setDataInRedis();
} catch (Exception e) {
e.printStackTrace();
}
}
public void onStart(FileAlterationObserver observer) {
super.onStart(observer);
}public void onStop(FileAlterationObserver observer) {
super.onStop(observer);
} -
文件创建执行
2、 文件夹变化观察
public class FileMonitor {
FileAlterationMonitor monitor = null;
public FileMonitor(long interval) throws Exception {
monitor = new FileAlterationMonitor(interval);
}
public void monitor(String path, FileAlterationListener listener) {
FileAlterationObserver observer = new FileAlterationObserver(new File(path));
monitor.addObserver(observer);
observer.addListener(listener);
}
public void stop() throws Exception {
monitor.stop();
}
public void start() throws Exception {
monitor.start();
}
}
3、项目启动则开始监听(第一次查询数据并存入redis),并为listener里的静态属性赋值
/**
-
项目启动后则执行文件夹变化监听工作;
-
并查询一次组态页面的数据放缓存里;
*/
@Component
@Order(value = 1)
public class FileInitRun implements CommandLineRunner {
@Autowired
LocationService locationService;@Autowired
MicsDatapointSystemService micsDatapointSystemService;@Autowired
RedisTemplate<Object, Object> redisTemplate;@Autowired
UploadProperties uploadProperties;@Override
public void run(String… args) throws Exception {
FileMonitor fileMonitor = new FileMonitor(1000l); fileMonitor.monitor(uploadProperties.getConfigurationPage(),new FileListener()); fileMonitor.start(); //解决listener注入不了spring容器对象的问题 FileListener.setLocationService(locationService); FileListener.setMicsDatapointSystemService(micsDatapointSystemService); FileListener.setUploadProperties(uploadProperties); FileListener.setRedisTemplate(redisTemplate);
}