在项目中用到了kafka来生产消息、消费消息,无论是生产还是消费,都需要配置对应的配置文件,而且需要在项目启动时,就去读取配置文件的内容,并且只执行一次,这里就要用到static静态代码块了。
静态代码块是在虚拟机加载类(jvm加载类的顺序 加载-连接(验证-准备-解析)-初始化)的时候就执行的,而且只执行一次。如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
非静态代码块是在类new一个实例的时候执行,而且是每次new对象实例都会执行(买了《深入理解java虚拟机》这本书,也没看完,都是理论,看了几天就不在看了,以后还得看)。
下面直接把项目中用到的代码内容贴出来,留着说不定以后有用。
private static Logger logger = LoggerFactory.getLogger(LogMQMonitorConfig.class); private final static Lock lock = new ReentrantLock(); private static Properties monitorProperties = null; static { init(); } /** * 初始化数据 */ private static void init(){ InputStream inputStream = null; try { lock.lock();//如果被其它资源锁定,会在此等待锁释放,达到暂停的效果 if(monitorProperties == null){ monitorProperties = new Properties(); inputStream = LogMQMonitorConfig.class.getResourceAsStream("/properties/mq-monitor.properties"); monitorProperties.load(inputStream); } } catch (IOException e) { throw new RuntimeException("未找到 kafka 监控的配置文件:mq-monitor.properties"); } finally { lock.unlock(); if(inputStream!=null){ try { inputStream.close(); } catch (IOException e) { logger.error("mq-monitor.properties文件输入流异常", e); } } } }
这是监控初始化的主要代码,还有消费者和生产者的,都是一样的。
这里为了保证在多线程情况下对同一个全局资源的安全操作,即避免多个线程同时访问或修改同一资源,用到了可重入锁——ReentrantLock。关于锁这方面了解的不多,查了些资料也不是特别清楚,等以后认识深刻了在来总结下吧。