Stack:Geode 9.1,SDG 2.0 场景:我们有一个场景,即动态创建(快照)临时区域,并希望利用SDG查询来使用这些新区域而不是定义的区域。 题; 是否有一个钩点来覆盖代理调用后的区域名称,因此我们可以为SDG存储库添加临时区域名称而不是定义的区域?
答案 0 :(得分:1)
在代理调用之后是否有覆盖区域名称的钩点,因此我们可以为SDG存储库添加临时区域名称而不是已定义的区域?
嗯,是的,在SD的 Repository 基础设施的几个方面都有钩点(每个说法)你可以做到这一点,但它(特别是SDG)不是故意的设计时考虑到了这个目的,所以它有点牵扯。
如您所知,您使用 Spring 应用程序@Configuration
类上的SDG @EnableGemfireRepositories
注释启用了SDG 存储库,就像这样.. < / p>
@Configuration
@EnableGemfireRepositories(..)
class ApplicationGemFireConfiguration { .. }
实际上,&#34;代理&#34;由SD 存储库基础架构为特定于应用程序的SD 存储库接口扩展创建,由特定于数据存储(例如GemFire)SD模块提供的默认实现支持(例如SDG)。
确定此默认实现的一种方法是通过注释上的repositoryBaseClass
属性。如您所见,它默认为o.s.d.g.repository.support.SimpleGemfireRepository
。
在内部,SD的存储库基础架构,特别是SDG,创建了一个SDG SimpleGemfireRepository
类的实例来支持代理,以实现基本的CRUD和查询操作在SD CrudRepository
接口上定义(因此开发人员不必这样做;开发人员只需要声明其他特定于应用程序的查询方法)。
SimpleGemfireRepository
类expects o.s.d.g.GemfireTemplate
的实例以及EntityInformation
关于应用程序SD 持久保存(处理)的应用程序域对象类型的实例存储库。如您所知,这是由特定于应用程序的SD 存储库定义的,就像这样......
interface CustomerRepository extends GemfireRepository<Customer, Long> { .. }
应用程序域对象类型(即实体类;例如&#34; Customer
&#34;)通常确定 Region ,其中持久化/访问该类型的对象(即mapped)......
@Region("Customers")
class Customer .. { .. }
正是这种映射元数据(即@Region("Customers")
)默认为used by the SD[G] Repository infrastructure/extension,以确定实体所映射的GemFire Region 。如果我做出了解决方案,那会更容易一些。 Region 7可配置,例如可插入的策略界面,类似&#34; RegionResolver
&#34; (我可以考虑一下)。
还可以覆盖应用程序 Repository 界面本身的 Region ;例如,除了上面的CustomersRepository
之外,您还可以......
@Region("VIPS")
interface VipCustomerRepository extends CustomersRepository { .. }
再次,请参阅&#34; POJO mapping meta-data&#34;了解更多信息。
由于SimpleGemfireRepository
委托GemfireTemplate
执行所有 Region 数据访问操作,实际上GemfireTemplate
引用了 Region 由repo使用。正如see所述,GemfireTemplate
会引用 Region ,在其上执行数据访问操作,包括&#34;查询&#34;。同样, Region 由7中的SD [G] Repo基础设施确定。
那么,你如何利用这些知识,我收集确定地区&#34;动态&#34;在运行时,因为你创建&#34;临时&#34; 地区就是这样。
嗯,您可以提供自己的实施班级(代替SDG&#39; SimpleGemfireRepository
),就像这样......
@Configuration
@EnableGemfireRepositories(repositoryBaseClass = DynamicRegionGemfireRepository.class)
class ApplicationGemFireConfiguration { .. }
您仍然必须像以前一样定义一个接受GemfireTemplate
和EntityInformation
的构造函数,in SDG's SimpleGemfireRepository
类......
class DynamicRegionGemfireRepository<T, ID> extends SimpleGemFireRepository<T, ID {
DynamicRegionGemfireRepository(GemfireTemplate gemfireTemplate, EntityInformation<T, ID> entityInformation) {
super(new DyanmicRegionGemfireTemplate(gemfireTemplate, entityInformation), entityInformation);
}
}
获得GemfireTemplate
的引用后,您可以将其包装或替换为您自己的实现,例如......
class DynamicRegionGemfireTemplate<T, ID> extends GemfireTemplate {
private final EntityInformation<T, ID> entityInformation;
private final Region<?, T> primaryRegion;
DynamicRegionGemfireTemplate(GemfireTemplate gemfireTemplate, EntityInformation entityInformation) {
this.primaryRegion = gemfireTemplate.getRegion();
}
// override Region<?,?> getRegion() here
}
现在,您覆盖GemfireTemplate
上的getRegion()
方法(技术上,o.s.d.g.GemfireAccessor
,GemfireTemplate
延伸。
@Override
public Region<K, V> getRegion() {
// logically determine the "temporary" Region to use,
// perhaps using the EntityInformation, or else just return
// the primary Region if no temporary Region exists.
return primaryRegion;
}
这样的事情......有意义吗?
还有其他方法可以实现这一目标。
无论如何,希望这有帮助!
此致 约翰