我正在使用Gemfire开发一些应用程序,在开发环境中能够提供一些虚假数据会很棒。
因此,我没有像今天那样在代码中执行此操作,而是考虑使用spring application-context.xml在我当前正在处理的区域中预加载一些虚拟数据。接近DBUnit的东西,但DEV不是测试范围。 后来我可以在Spring上切换envs并且不会加载数据。
是否可以使用SpringData Gemfire将数据添加到本地数据网格?
谢谢!
答案 0 :(得分:2)
Spring Data GemFire没有直接支持将数据加载到GemFire集群中。但是,SDG / GemFire开发人员可以选择加载数据。
尽管如此,我们可以做得更好,因为您更有可能为了开发目的而“预加载”特定数据集。
另一种更有效的技术是使用在Spring ApplicationContext中注册的Spring BeanPostProcessor,它在初始化后对“Region”bean进行后处理。例如......
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命名空间中添加一流的支持,以便预加载数据集。
此致 约翰