我有一个以这种方式配置的Gemfire服务器区域(分布式)和本地区域(缓存代理):
<client-cache>
<pool name="client" subscription-enabled="true">
<locator host="localhost" port="13489" />
</pool>
<region name="customers" refid="CACHING_PROXY">
<region-attributes>
<subscription-attributes interest-policy="all"/>
<!--<subscription-attributes interest-policy="cache-content"/>-->
</region-attributes>
</region>
</client-cache>
当我从客户端区域获取值并且客户端上的密钥未知时 - 它将从服务器获取。但是,在此之后,如果服务器值发生更改 - 即使设置了subscription-attributes,新值也不会传播到客户端。
这里的配置错误是什么?
答案 0 :(得分:3)
要将所有更改推送到本地缓存,您需要删除订阅属性标记,而是在池上保留subscription-enabled = true,然后以编程方式调用region.registerInterest API GemFire JavaDoc导致服务器开始向您的客户端发送更改通知。
作为一个很好的起点,我建议
region.registerInterestRegex(".*", InterestResultPolicy.NONE, false, false)
这将确保您只收到&#34; fresh&#34;值和将利用本地缓存进行重复检索,但不会尝试将所有值都放在内存中。但是,有很多兴趣注册选项,所以你需要咨询javadoc。
作为补充说明,CACHING_PROXY通常与一些逐出机制相结合,以确保本地缓存的大小不会无限增长。
此外,region标记内的订阅属性实际上适用于服务器端配置,而不是客户端。即使在服务器端,通常也不需要配置订阅属性,因为服务器端区域快捷方式(PARTITION,REPLICATE等)通常会对它们进行适当的配置。