我正在使用Gemfire开发一些应用程序,如果能够在Dev环境中提供一些虚假数据,那就太好了。
因此,我没有像今天这样在代码中这样做,而是在考虑使用Spring applation-context. xml在我目前正在处理的区域中预加载一些虚拟数据。一些接近DBUnit所做的事情,但DEV不是测试范围。后来我可以在Spring上切换envs,数据就不会被加载。
是否可以使用SpringData Gemfire将数据添加到本地数据网格?
谢谢!
Spring Data GemFire中没有直接支持将数据加载到GemFire集群中。但是,为SDG/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命名空间中添加一流的支持,用于预加载数据集。
你好约翰