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/beans

http://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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值