静态和动态属性对于运营管理以及在生产级别更改系统行为都非常重要。 特别地,动态参数减少了服务中断。 本文展示了如何使用Quartz在Spring Applications中管理动态属性。
有关使用 Spring和Quartz集成提供“ 使用Spring和Quartz的多作业计划服务”的文章。

让我们看一下Spring中的Dynamic Property Management。

二手技术:

JDK 1.6.0_31
春天3.1.1
石英1.8.5 Maven的3.0.2

步骤1:建立已完成的专案

如下创建一个Maven项目。 (可以使用Maven或IDE插件来创建它)。

步骤2:图书馆

Spring依赖项已添加到Maven的pom.xml中。

<properties><spring.version>3.1.1.RELEASE</spring.version></properties><dependencies><!-- Spring 3 dependencies --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><!-- Quartz dependency --><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>1.8.5</version></dependency><!-- Log4j dependency --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.16</version></dependency></dependencies>

步骤3:创建DynamicPropertiesFile.properties

DynamicPropertiesFile涵盖了应用程序的动态属性。

# This property defines message content
# Possible values = Text. Default value : Welcome
Message_Content = Welcome Visitor# This property defines minimum visitor count
# Possible values = positive integer. Default value : 1
Minimum_Visitor_Count = 1# This property defines maximum visitor count
# Possible values = positive integer. Default value : 10
Maximum_Visitor_Count = 10

步骤4:创建applicationContext.xml

应用程序上下文的创建如下:

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><!-- Beans Declaration --><!-- Core Dynamic Properties Bean Declaration --><bean id="CoreDynamicPropertiesBean" class="org.springframework.beans.factory.config.PropertiesFactoryBean" scope="prototype"><property name="location" value="classpath:DynamicPropertiesFile.properties" /></bean><!-- Dynamic Properties Map Declaration --><bean id="DynamicPropertiesMap" class="java.util.HashMap"/><!-- Dynamic Properties File Reader Task Declaration --><bean id="DynamicPropertiesFileReaderTask" class="com.otv.dynamic.properties.task.DynamicPropertiesFileReaderTask"><property name="dynamicPropertiesMap"   ref="DynamicPropertiesMap"/></bean><!-- End of Beans Declaration --><!-- Scheduler Configuration --><!-- Job Detail--><bean id="DynamicPropertiesFileReaderTaskJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="DynamicPropertiesFileReaderTask" /><property name="targetMethod" value="start" /></bean><!-- Simple Trigger --><bean id="DynamicPropertiesFileReaderTaskTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"><property name="jobDetail" ref="DynamicPropertiesFileReaderTaskJobDetail" /><property name="repeatInterval" value="60000" /><property name="startDelay" value="0" /></bean><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="jobDetails"><list><ref bean="DynamicPropertiesFileReaderTaskJobDetail" /></list></property><property name="triggers"><list><ref bean="DynamicPropertiesFileReaderTaskTrigger" /></list></property></bean><!-- End of Scheduler Configuration -->
</beans>

步骤5:建立SystemConstants类别

创建一个新的SystemConstants类。 此类涵盖所有系统常数。

package com.otv.common;/*** System Constants** @author  onlinetechvision.com* @since   26 May 2012* @version 1.0.0**/
public class SystemConstants {//Names of Dynamic Properties...public static final String DYNAMIC_PROPERTY_MESSAGE_CONTENT = "Message_Content";public static final String DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT = "Minimum_Visitor_Count";public static final String DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT = "Maximum_Visitor_Count";//Default Values of Dynamic Properties...public static final String DYNAMIC_PROPERTY_MESSAGE_CONTENT_DEFAULT_VALUE       = "Welcome";public static final String DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT_DEFAULT_VALUE = "1";public static final String DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT_DEFAULT_VALUE = "10";public static final String BEAN_NAME_CORE_DYNAMIC_PROPERTIES_BEAN = "CoreDynamicPropertiesBean";public static final String APPLICATION_CONTEXT_FILE_NAME = "applicationContext.xml";
}

步骤6:创建DynamicPropertiesFileReaderTask类

DynamicPropertiesFileReaderTask类已创建。 此类由Quartz管理。 它通过每分钟调用“ start”方法,通过DynamicPropertiesFile读取所有动态属性。 可以通过applicationContext.xml更改阅读时间。

请注意,默认情况下coreDynamicPropertiesBean的作用域为Singleton 。 它必须在运行时返回动态属性的新值,因此应将其范围设置为Prototype 。 否则,将无法接收新值。

package com.otv.dynamic.properties.task;import java.util.HashMap;
import java.util.Properties;import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;import com.otv.common.SystemConstants;/*** Dynamic Properties File Reader Task** @author  onlinetechvision.com* @since   26 May 2012* @version 1.0.0**/
public class DynamicPropertiesFileReaderTask implements BeanFactoryAware {private static Logger logger = Logger.getLogger(DynamicPropertiesFileReaderTask.class);private Properties coreDynamicPropertiesBean;private HashMap<String, String> dynamicPropertiesMap;private BeanFactory beanFactory;/*** Starts reading the dynamic properties**/public void start() {setCoreDynamicPropertiesBean(createCoreDynamicPropertiesBeanInstance());logger.info("**** Dynamic Properties File Reader Task is being started... ****");readConfiguration();logger.info("**** Dynamic Properties File Reader Task is stopped... ****");}/*** Reads all the dynamic properties**/private void readConfiguration() {readMessageContent();readMinimumVisitorCount();readMaximumVisitorCount();}/*** Reads Message_Content dynamic property**/private void readMessageContent() {String messageContent = getCoreDynamicPropertiesBean().getProperty(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT,SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT_DEFAULT_VALUE);if (messageContent.equals("")){getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT,SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT_DEFAULT_VALUE);logger.error(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT +" value is not found so its default value is set. Default value : " +SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT_DEFAULT_VALUE);} else {messageContent = messageContent.trim();getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT, messageContent);logger.info(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT + " : " +getDynamicPropertiesMap().get(SystemConstants.DYNAMIC_PROPERTY_MESSAGE_CONTENT));}}/*** Reads Minimum_Visitor_Count dynamic property**/private void readMinimumVisitorCount() {String minimumVisitorCount = getCoreDynamicPropertiesBean().getProperty(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT,SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT_DEFAULT_VALUE).trim();try {if (Integer.parseInt(minimumVisitorCount) > 0){getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT, minimumVisitorCount);logger.info(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT + " : " +getDynamicPropertiesMap().get(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT));} else {getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT,SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT_DEFAULT_VALUE);logger.error("Invalid "+SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT +" value encountered. Must be greater than 0. Its default value is set. Default value : "+ SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT_DEFAULT_VALUE);}} catch (NumberFormatException nfe) {logger.error("Invalid "+SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT +" value encountered. Must be numeric!", nfe);logger.warn(SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT +" default value is set. Default value : " +SystemConstants.DYNAMIC_PROPERTY_MINIMUM_VISITOR_COUNT_DEFAULT_VALUE);}}/*** Reads Maximum_Visitor_Count dynamic property**/private void readMaximumVisitorCount() {String maximumVisitorCount = getCoreDynamicPropertiesBean().getProperty(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT,SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT_DEFAULT_VALUE).trim();try {if (Integer.parseInt(maximumVisitorCount) > 0){getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT, maximumVisitorCount);logger.info(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT + " : " +getDynamicPropertiesMap().get(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT));} else {getDynamicPropertiesMap().put(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT,SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT_DEFAULT_VALUE);logger.error("Invalid "+SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT +" value encountered. Must be greater than 0. Its default value is set. Default value : " +SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT_DEFAULT_VALUE);}} catch (NumberFormatException nfe) {logger.error("Invalid "+SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT +" value encountered. Must be numeric!", nfe);logger.warn(SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT +" default value is set. Default value : " +SystemConstants.DYNAMIC_PROPERTY_MAXIMUM_VISITOR_COUNT_DEFAULT_VALUE);}}/*** Gets CoreDynamicPropertiesBean** @return Properties coreDynamicPropertiesBean*/public Properties getCoreDynamicPropertiesBean() {return coreDynamicPropertiesBean;}/*** Sets CoreDynamicPropertiesBean** @param Properties coreDynamicPropertiesBean*/public void setCoreDynamicPropertiesBean(Properties coreDynamicPropertiesBean) {this.coreDynamicPropertiesBean = coreDynamicPropertiesBean;}/*** Gets DynamicPropertiesMap** @return HashMap dynamicPropertiesMap*/public HashMap<String, String> getDynamicPropertiesMap() {return dynamicPropertiesMap;}/*** Sets DynamicPropertiesMap** @param HashMap dynamicPropertiesMap*/public void setDynamicPropertiesMap(HashMap<String, String> dynamicPropertiesMap) {this.dynamicPropertiesMap = dynamicPropertiesMap;}/*** Gets a new instance of CoreDynamicPropertiesBean** @return Properties CoreDynamicPropertiesBean*/public Properties createCoreDynamicPropertiesBeanInstance() {return  (Properties) this.beanFactory.getBean(SystemConstants.BEAN_NAME_CORE_DYNAMIC_PROPERTIES_BEAN);}/*** Sets BeanFactory** @param BeanFactory beanFactory*/public void setBeanFactory(BeanFactory beanFactory) throws BeansException {this.beanFactory = beanFactory;}}

步骤7:创建应用程序类

应用程序类启动项目。

package com.otv.starter;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.otv.common.SystemConstants;/*** Application Starter Class** @author  onlinetechvision.com* @since   26 May 2012* @version 1.0.0**/
public class Application {/*** Main method of the Application**/public static void main(String[] args) {new ClassPathXmlApplicationContext(SystemConstants.APPLICATION_CONTEXT_FILE_NAME);}
}

第8步:运行项目

如果运行应用程序类,则显示以下控制台日志:

26.05.2012 17:25:09  INFO (DefaultLifecycleProcessor.java:334) - Starting beans in phase 2147483647
26.05.2012 17:25:09  INFO (SchedulerFactoryBean.java:648) - Starting Quartz Scheduler now
26.05.2012 17:25:09  INFO (PropertiesLoaderSupport.java:177) - Loading properties file from class path resource [DynamicPropertiesFile.properties]
26.05.2012 17:25:09  INFO (DynamicPropertiesFileReaderTask.java:36) - **** Dynamic Properties File Reader Task is being started... ****
26.05.2012 17:25:09  INFO (DynamicPropertiesFileReaderTask.java:63) - Message_Content : Welcome Visitor
26.05.2012 17:25:09  INFO (DynamicPropertiesFileReaderTask.java:76) - Minimum_Visitor_Count : 1
26.05.2012 17:25:09  INFO (DynamicPropertiesFileReaderTask.java:96) - Maximum_Visitor_Count : 10
26.05.2012 17:25:09  INFO (DynamicPropertiesFileReaderTask.java:38) - **** Dynamic Properties File Reader Task is stopped... ****26.05.2012 17:26:09  INFO (PropertiesLoaderSupport.java:177) - Loading properties file from class path resource [DynamicPropertiesFile.properties]
26.05.2012 17:26:09  INFO (DynamicPropertiesFileReaderTask.java:36) - **** Dynamic Properties File Reader Task is being started... ****
26.05.2012 17:26:09  INFO (DynamicPropertiesFileReaderTask.java:63) - Message_Content : Welcome Visitor, Bruce!
26.05.2012 17:26:09  INFO (DynamicPropertiesFileReaderTask.java:76) - Minimum_Visitor_Count : 2
26.05.2012 17:26:09  INFO (DynamicPropertiesFileReaderTask.java:96) - Maximum_Visitor_Count : 20
26.05.2012 17:26:09  INFO (DynamicPropertiesFileReaderTask.java:38) - **** Dynamic Properties File Reader Task is stopped... ****

步骤9:下载

OTV_SpringDynamicPropertyManagement

参考资料:

Spring Framework参考3.x

参考: Online Technology Vision博客中的JCG合作伙伴 Eren Avsarogullari提供的Spring动态物业管理 。

翻译自: https://www.javacodegeeks.com/2012/05/dynamic-property-management-in-spring.html

Spring动态物业管理相关推荐

  1. 【Spring学习】spring动态配置多数据源

    这段时间在做智能导航的管理系统--运维系统,涉及到连接多个数据库的问题.因为运维系统要用到智能导航的一些功能,我们目前只是简单的将智能导航整合到运维系统中:运维系统有一个自己的数据库,导航也有自己的数 ...

  2. 我已经把它摸的透透的了!!!Spring 动态数据源设计实践,全面解析

    [ Spring 动态数据源 动态数据源是什么?它能解决什么??? 在实际的开发中,同一个项目中使用多个数据源是很常见的场景.比如,一个读写分离的项目存在主数据源与读数据源. 所谓动态数据源,就是通过 ...

  3. osgi和spring区别_OSGI和Spring动态模块–简单的Hello World

    osgi和spring区别 在此姿势中,我们将采用使用OSGi进行的第一个实现,并使用Spring Dynamic Modules改进应用程序. Spring动态模块(Spring Dm)使基于OSG ...

  4. OSGI和Spring动态模块–简单的Hello World

    在此姿势中,我们将采用使用OSGi进行的第一个实现,并使用Spring Dynamic Modules改进应用程序. Spring动态模块(Spring Dm)使基于OSGi的应用程序的开发更加容易. ...

  5. 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)

    AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...

  6. 【Spring源码三千问】Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy?

    Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy? 前言 版本约定 正文 例子测试 结论分析 proxyTargetClass 标识的校正 哪些接口不是 Reas ...

  7. 一文读懂Spring动态配置多数据源---源码详细分析

    Spring动态多数据源源码分析及解读 一.为什么要研究Spring动态多数据源 代云小说网 https://www.3187.info ​ 期初,最开始的原因是:想将答题服务中发送主观题答题数据给批 ...

  8. 从一个Spring动态代理Bug聊到循环依赖

    文章目录 Bug复现 结论 @PostConstruct的在Bean的生命周期的哪一步 一般代理类的生成时机在生命周期的哪一步 解决办法 两个思路 1.不生成代理类 2.在生成代理类之后再进行数据的初 ...

  9. spring动态代理实现计算器

    2019独角兽企业重金招聘Python工程师标准>>> 1.ArithmeticCalculator.java package com.huanlgiusong.spring.aop ...

最新文章

  1. python右对齐函数_python右对齐的实例方法
  2. sqoop动态分区导入mysql,使用sqoop import从mysql往hive含分区表中导入数据的一些注意事项...
  3. OpenCV训练SVM模型并预测的完整过程
  4. 前端分页功能的实现以及原理
  5. C# 使用PictureBox控件--点击切换图片
  6. libcareplus支持的补丁类型
  7. python处理文本
  8. MFC消息映射与消息传递内幕
  9. SQL常用命令和操作
  10. Oracle 逗号分割的字符串转换为可放入in的语句
  11. qt信号阻塞blockSignals的运用
  12. 【vue】mint-ui中navbar下划线不显示的问题
  13. 【LeetCode】86. 分隔链表
  14. 《工程伦理与学术道德》第四章习题
  15. 嵌入式培训多少钱?嵌入式学习要了解这些内容!
  16. 《数值分析》-- 埃尔米特插值与分段插值
  17. 面试官:说说Redis之I/O多路复用模型实现原理
  18. Vue Router 实现路由控制实战
  19. 在Excel中插入行并复制单元格格式
  20. 加州伯克利市计划发起“首次社区发行”,发售代币化债券

热门文章

  1. java线程——中断线程+线程状态+线程属性(优先级)
  2. 设置 JDK环境变量(Windows)
  3. djl和ljl_使用Spring Boot和DJL进行深度学习
  4. s71200模拟量输入输出_模拟用户输入并检查输出的简单方法
  5. java 异常处理发生异常_处理Java中的异常
  6. aws 堆栈模板_使用Arquillian和LocalStack脱机测试AWS云堆栈
  7. Apache Camel 3.2 – Camel的无反射配置
  8. 怎样使set现程变得安全_使不安全变得更加安全
  9. activemq网络桥接_ActiveMQ –经纪人网络解释–第4部分
  10. JVM体系结构:JVM中的执行引擎