SpringData Gemfire在Dev env上插入假日期

时间:2015-06-07 14:32:24

标签: gemfire spring-data-gemfire

我正在使用Gemfire开发一些应用程序,在开发环境中能够提供一些虚假数据会很棒。

因此,我没有像今天那样在代码中执行此操作,而是考虑使用spring application-context.xml在我当前正在处理的区域中预加载一些虚拟数据。接近DBUnit的东西,但DEV不是测试范围。 后来我可以在Spring上切换envs并且不会加载数据。

是否可以使用SpringData Gemfire将数据添加到本地数据网格?

谢谢!

1 个答案:

答案 0 :(得分:2)

Spring Data GemFire没有直接支持将数据加载到GemFire集群中。但是,SDG / GemFire开发人员可以选择加载数据。

  1. 最常见的方法是定义附加到Region的GemFire CacheLoader。但是,这种方法是“懒惰的”,只在高速缓存未命中时从(可能的)外部数据源加载数据。当然,您可以对CacheLoader中的逻辑进行编程,以基于数据访问模式以某种“预测”方式“预取”多个条目。有关详细信息,请参阅GemFire的User Guide
  2. 尽管如此,我们可以做得更好,因为您更有可能为了开发目的而“预加载”特定数据集。

    1. 另一种更有效的技术是使用在Spring ApplicationContext中注册的Spring BeanPostProcessor,它在初始化后对“Region”bean进行后处理。例如......

                               

    2. RegionPutAllBeanPostProcessor实现为......

      package example;
      
      public class RegionPutAllBeanPostProcessor implements BeanPostProcessor {
      
        private Map regionData;
      
        private String targetRegionBeanName;
      
        protected Map getRegionData() {
          return (regionData != null ? regionData : Collections.emptyMap());
        }
      
        public void setRegionData(final Map regionData) {
          this.regionData = regionData;
        }
      
        protected String getTargetRegionBeanName() {
          Assert.state(StringUtils.hasText(targetRegionBeanName), "The target Region bean name was not properly specified!");
          return targetBeanName;
        }
      
        public void setTargetRegionBeanName(final String targetRegionBeanName) {
          Assert.hasText(targetRegionBeanName, "The target Region bean name must be specified!");
          this.targetRegionBeanName = targetRegionBeanName;
        }
      
        @Override
        public Object postProcessBeforeInitialization(final Object bean, final String beanName) throws BeansException {
          return bean;
        }
      
        @Override
        @SuppressWarnings("unchecked")
        public Object postProcessAfterInitialization(final Object bean, final String beanName) throws BeansException {
          if (beanName.equals(getTargetRegionBeanName()) && bean instanceof Region) {
            ((Region) bean).putAll(getRegionData());
          }
      
          return bean;
        }
      }
      

      想象您可以注入某种类型的DataSource来预先填充Region,这并不难。 RegionPutAllBeanPostProcessor旨在接受要填充的特定Region(基于Region beans ID)。因此,您可以定义多个实例,每个实例使用不同的Region和不同的DataSource(可能)来填充所选的Region。这个BeanPostProcess只是将Map作为数据源,但当然,它可以是任何Spring托管bean。

      最后,通过利用Spring bean配置文件确保RegionPutAllBeanPostProcessor的这个或多个实例仅在DEV环境中使用是一件简单的事情......

      <beans>
        ...
      
        <beans profile="DEV">
          <bean class="example.RegionPutAllBeanPostProcessor">
            ...
          </bean>
          ...
        </beans>
      </beans>
      

      通常,根据预定义数据的“来源”,加载预定义数据集是非常特定于应用程序的。正如我的例子所示,源可以像另一个Map一样简单。但是,它可能是JDBC DataSource,也可能是属性文件或其他任何内容。这通常取决于开发人员的偏好。

      尽管如此,添加到Spring Data GemFire可能有用的一件事是从GemFire缓存区域快照加载数据。即可能已从QA或UAT环境转储的数据,或者甚至可能从PROD中清除以用于测试目的的数据。有关详细信息,请参阅GemFire Snapshot Service

      另请参阅我刚刚提交的JIRA票证(SGF-408)以添加此支持。

      希望这能为您提供足够的信息和/或想法。稍后,我将在SDG的XML命名空间中添加一流的支持,以便预加载数据集。

      此致 约翰