最近在公司的一个项目中,有一些数据需要经常进行修改(因为需求是经常变动的),如果将这些数据写死在程序中的话,那么每次进行更改后,都是需要重启Tomcat才能生效的。这样的话就不是很方便,如何实现更改数据之后,不重新启动tomcat呢?我目前的做法,是将这些配置文件放到一个config.properties文件中,然后单独启动一个线程(或者是实现一个“定时器”,比如quartz),定时的去读取这个配置文件,进行加载,然后更改程序中需要更改的数据的“缓存”!想问问大家,有没有更好的实现类似需求的思路,还望大家指教!
- package com.spc.core.util;
- import com.spc.core.consumer.SpcTaskResultConsumer;
- import com.spc.core.service.SpcChargeService;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import java.io.File;
- import java.io.FileInputStream;
- import java.util.Properties;
- public class ChangeNumThread extends Thread {
- private Logger logger = LoggerFactory.getLogger(getClass());
- private String url;
- private long lastModifiedTime;
- private SpcChargeService service;
- public ChangeNumThread(SpcChargeService service, String url) {
- this.service = service;
- this.url = url;
- }
- @Override
- public void run() {
- while (true) {
- try {
- Thread.sleep(1 * 1000);
- File file = new File(url);
- long currTime = file.lastModified();
- if (lastModifiedTime != currTime && lastModifiedTime != 0) {
- Properties p = new Properties();
- p.load(new FileInputStream(file));
- logger.info("修改了取单数");
- service.updateGetOrderNum(Integer.parseInt(p.getProperty("getOrderNum")));
- SpcTaskResultConsumer spcTaskResultConsumer = new SpcTaskResultConsumer();
- logger.info("修改了卡密失效自动置成功的开关标志");
- spcTaskResultConsumer.updateIsAutoSuccessOn(p.getProperty("isAutoSuccessOn"));
- }
- lastModifiedTime = currTime;
- } catch (Exception e) {
- logger.error("监控线程发生异常:", e);
- }
- }
- }
- }
复制代码
然后更改的“缓存”就是:
- @Value("${getOrderNum}")
- private int getOrderNum;
- @Value("${confUrl}")
- private String confUrl;
复制代码 这里使用了spring的一个@value的注解,读取配置文件的值。
|