提问者:小点点

SpringData Gemfire在开发环境中插入假日期


我正在使用Gemfire开发一些应用程序,如果能够在Dev环境中提供一些虚假数据,那就太好了。

因此,我没有像今天这样在代码中这样做,而是在考虑使用Spring applation-context. xml在我目前正在处理的区域中预加载一些虚拟数据。一些接近DBUnit所做的事情,但DEV不是测试范围。后来我可以在Spring上切换envs,数据就不会被加载。

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

谢谢!


共1个答案

匿名用户

Spring Data GemFire中没有直接支持将数据加载到GemFire集群中。但是,为SDG/GemFire开发人员提供了多种加载数据的选项。

  1. 最常见的方法是定义一个附加到区域的GemFire CacheLoader。然而,这种方法是“惰性的”,只在缓存未命中时从(潜在的)外部数据源加载数据。当然,您可以对CacheLoader中的逻辑进行编程,以基于数据访问模式的某种“预测”方式“预取”一些条目。有关更多详细信息,请参阅GemFire的用户指南。

尽管如此,我们可以做得更好,因为您更有可能想要“预加载”特定数据集以用于开发目的。

另一种更有效的技术是使用在您的Spring ApplicationContext中注册的Spring BeanPost处理器,该处理器在初始化后发布处理您的“Region”bean。例如…

其中Region onPutAllBeanPostProcator实现为…

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 onPutAllBeanPostProcator旨在接受特定的区域(基于区域beanID)进行填充。因此,您可以定义多个实例,每个实例都采用不同的区域和不同的DataSource(可能)来填充选择的区域。这个BeanPostProcess只是将Map作为数据源,但当然,它可以是任何Spring管理的bean。

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

<beans>
  ...

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

通常,就预定义数据的“源”而言,加载预定义数据集是非常特定于应用程序的。正如我的示例所示,源可以像另一个Map一样简单。然而,它将是一个JDBC数据源,或者可能是一个属性文件,或者其他任何东西。这通常取决于开发人员的偏好。

不过,添加到Spring Data GemFire中可能有用的一件事是从GemFire缓存区域快照加载数据。即可能已从QA或UAT环境转储的数据,甚至可能出于测试目的从PROD中删除的数据。有关更多详细信息,请参阅GemFire快照服务。

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

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

你好约翰