Java监听文件变化动态设置合法调用微信jsconfig域名

@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();
            }
        }));
    }

}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值