Spring动态物业管理

静态和动态属性对于运营管理以及在生产级别更改系统行为都非常重要。 特别地,动态参数减少了服务中断。 本文展示了如何使用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[BZOJ1005][HNOI2008]明明的烦恼

[BZOJ1005][HNOI2008]明明的烦恼 试题描述 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? 输入 第一行为N(0 < N < 1000),接下来N行,第i1行给出第i个节点的度数Di,如…

android调用so封装jni,GitHub - Michelle0716/AndroidJniDemo1: 安卓对c进行so文件打包,并以jni的形式进行调用...

AndroidJniDemo1安卓对c进行so文件打包&#xff0c;并以jni的形式进行调用项目中的部分app &#xff1a; 编译so文件jniDemo: 添加运行so文件开发环境&#xff1a;android studio 3.0.1(As3.0以上创建项目&#xff0c;选择支持c/c,项目会自动生成需要的配置&#xff0c;不需要在…

ADF任务流:页面片段的托管bean范围

介绍 当我们使用ADF任务流并需要实现一些特定于流的业务逻辑或存储一些与该流相关的信息时&#xff0c;我们通常使用pageFlowScope托管bean。 而且&#xff0c;当我们需要为流的活动&#xff08;页面或页面片段&#xff09;提供服务时&#xff0c;我们将较短的作用域用于此类托…

Linux平台下:块设备、裸设备、ASMlib、Udev相关关系

对磁盘设备&#xff08;裸分区&#xff09;的访问方式分为两种&#xff1a;1.字符方式访问&#xff08;裸设备&#xff09;&#xff1b;2.块方式访问 Solaris平台 : 在Solaris平台下&#xff0c;系统同时提供对磁盘设备的字符、块方式访问。每个磁盘有两个设备文件名: 一个在/d…

Error0---local variable S is accessed from within inner class; needs to be declared final

local variable S is accessed from within inner class; needs to be declared final在内部类当中不能引用本地变量s,需要被声明为常量转载于:https://www.cnblogs.com/Cherrylalala/p/6636642.html

android版本如何修改时间,如何修改Android系统默认时间

相信很多人看到过Android手机或平板显示XXXX-01-01这个奇怪的日期&#xff0c;没错&#xff0c;这就是Android设备的默认日期。当Android设备没有联网&#xff0c;无法获取当前真实时间的时候&#xff0c;就会使用系统默认时间。大部分时候&#xff0c;系统默认时间是Epoch时间…

Java Web应用程序的反跨站点脚本(XSS)过滤器

这是为Java Web应用程序编写的一个好简单的反跨站点脚本&#xff08;XSS&#xff09;过滤器。 它的主要作用是从请求参数中删除所有可疑字符串&#xff0c;然后将其返回给应用程序。 这是我以前关于该主题的帖子的改进。 您应该将其配置为链&#xff08;web.xml&#xff09;中的…

生成建表脚本up_CreateTable

已经很久没用使用这个脚本了&#xff0c;今天用到&#xff0c;并做修改&#xff0c;增加了生成扩展属性功能。 Go if object_ID([up_CreateTable]) is not nullDrop Procedure [up_CreateTable] Go /* 生成建表脚本(V4.0) Andy 2017-3-28 */ Create Proc up_CreateTable (obje…

android程序员周记,程序员实习周记100篇

程序员实习周记100篇有效防止雷同&#xff01;简单修改即可使用&#xff01;姓名&#xff1a;XXX学号&#xff1a;20190920008专业&#xff1a;M]指导老师&#xff1a;实习时间&#xff1a;20XX-XX-XX—20XX-XX-XX2019年XX月XX日t8in6Ay8Cw7c HuktN6ttTE12V7A eZu9g e7W1Y Dxqx…

Python之装饰器

装饰器功能有两点&#xff1a;1.首先自动执行装饰器后面跟的这个函数&#xff0c;并将装饰器修饰的那个函数名作为参数带入装饰器后面函数&#xff1b;2.将装饰器后面函数的返回值&#xff0c;赋值给装饰器所修饰的那个函数。举个例子说明&#xff1a; 1 def outer(func):2 …

在独立Java应用程序中使用Tomcat JDBC连接池

这是从我们的客人文章W4G伙伴克拉伦斯豪的作者临春3从A按。 您可能会在文章结尾找到本书的折扣券代码&#xff0c;仅适用于Java Code Geeks的读者&#xff01; 请享用&#xff01; 在需要数据访问权限的独立Java应用程序中使用JDBC连接池时&#xff0c;大多数开发人员将使用com…

Python之路【目录】 2

http://www.cnblogs.com/wupeiqi/articles/4938499.html转载于:https://www.cnblogs.com/cp-miao/p/5750211.html

vs2019 缺android sdk,VS2019由于缺少NuGet Microsoft.NET.Sdk.Functions程序包而无法加载项目,但也无法添加此程序包(示例代码)...

我在解决方案中拥有的一个项目未在VSE2019中加载。它将引发此错误&#xff1a;C:MyProgramsrcMyProgram.Functions.csproj : error : The project file cannot be opened by the project system, because it is missing some critical imports or the referenced SDK cannot be…

数据库事物操作

事务 什么是事务?转账&#xff1a;1. 给wc账户减1000元2. 给wcxf账户加1000元 当给wc账户减1000元后&#xff0c;抛出了异常&#xff01;这会怎么样呢&#xff1f;我相信从此之后&#xff0c;wc再也不敢转账了。 使用事务就可以处理这一问题&#xff1a;把多个对数据库的操作绑…

通过OpenShift超越云技术

您是否厌倦了为您的应用程序请求新的开发机器&#xff1f; 您是否为应用程序设置新的测试环境感到烦恼&#xff1f; 您是否只想专注于和平开发应用程序而不会一直“沉迷于堆栈”&#xff1f; 我们听到你的声音。 我们也去过那里。 不用担心&#xff0c;OpenShift就在这里&#…

android+4.4+稳定性,新系统新UI!台电A10h四核安卓4.4.2性能测试

国内著名商标&#xff0c;数码用户首选品牌的台电科技在12月20日全国首发了安卓4.4.2系统&#xff0c;并且运行台电全新tUI同时&#xff0c;支持从安卓4.2系统OTA一键升级至安卓4.4.2系统&#xff01;作为国内首款升级到目前全球最新的Android4.4.2系统之后&#xff0c;整体性能…

网络知识点小结

VMware虚拟机三种联网方法及原理一、Brigde——桥接&#xff1a;默认使用VMnet0 1、原理&#xff1a; Bridge 桥"就是一个主机&#xff0c;这个机器拥有两块网卡&#xff0c;分别处于两个局域网中&#xff0c;同时在"桥"上&#xff0c;运行着程序&#xff0c;让…

在JUnit中超越核心Hamcrest

在通过JUnit和Hamcrest改进对assertEquals的文章中&#xff0c;我介绍了将Hamcrest与JUnit一起使用 。 然后&#xff0c;我查看了JUnit的内置Hamcrest Core Matcher支持 。 在本文中&#xff0c;我将介绍如何将Hamcrest的非核心匹配器与JUnit一起应用。 这些非核心匹配器默认情…

4pics1word android,4 Pics 1 Word

4 Pics 1 Word是一款非常有意思的看图猜词游戏&#xff0c;这款游戏中会给我们四张图片&#xff0c;玩家需要通过图片给出的信息来猜出是哪个词&#xff0c;看西西的介绍你可能以为这是一款千篇一律的看图猜词游戏&#xff0c;不过这里猜的不是中文而是英语单词。4 Pics 1 Word…

页面内锚点定位及跳转方法总结

接着上一篇&#xff0c;其实是一个功能&#xff0c;本来感觉挺简单的一个问题&#xff0c;没想到遇到两个坎儿&#xff0c;无语。。。 上一篇是关于scroll事件绑定的问题&#xff0c;这一篇的问题是&#xff1a;点击锚点跳转到相应DIV的问题。 最简单的方法是锚点用<a>标…