来自Cassandra的GemFire CacheLoader

时间:2017-09-15 07:49:39

标签: gemfire spring-data-gemfire

在我与Cassandra使用GemFire的项目中,我的CacheLoader能够从Cassandra中提取数据,但是,GemFire中没有这些数据。从Cassandra获取数据后,GemFire中的数据没有更新。

我使用过以下代码:

public class TestLoader implements CacheLoader, Declarable {

    @Autowired
    private CassandraOperations cassandraOperations;

    @Override
    public void init(Properties props) {}

    @Override
    public Test load(LoaderHelper helper) {
        String key = (String) helper.getKey();
        key = key.replaceAll("\\s", "");
        Select select = QueryBuilder.select().from("Testing");
        select.where(QueryBuilder.eq(testkey, key));
        return cassandraOperations.selectOne(select, TEST.class);
    }

    @Override
    public void close() {}
}

测试 - 域类名称 测试 - Cassandra表名 testkey - Cassandra主键

enter image description here

1 个答案:

答案 0 :(得分:1)

因此,CacheLoader似乎没有select.where(..)语句,而select.where(QueryBuilder.eq("testkey", key));语句应该是CacheLoader。很明显,这段代码无法编译。不过,除此之外,我对你的配置和拓扑感到好奇,正如张夏伟在上面的评论中指出的那样。显然,您使用的是客户端/服务器拓扑,但其范围并不明显,也不是您的配置。

您应该在服务器的缓存PARTITION 区域上注册此PARTITION,而不是在客户端 Region 上注册(如果是是这样的)。无论服务器缓存 Region PARTITION_REDUNDANT还是PROXY都不重要。

但是,您的拓扑结构也需要了解很多,张夏伟也暗示。

在典型设置中,您的(缓存)客户端在CACHING_PROXYCACHING_PROXY客户端区域中请求缓存条目(按键)。如果该条目在本地不可用或无效(在PROXY配置中),则将请求转发(具有CacheLoader,请求始终转发)到具有的服务器区域的名称相同(例如" Test")。如果该条目在服务器的 Region 中不可用,并且已注册CacheLoader,则会调用具有该密钥的CacheLoader。在您的情况下,条目的数据将从Cassandra加载(如上所示)和" put"使用配置的Pool(再次,必须配置服务器端)进入服务器 Region ,然后返回到客户端。

现在,如果你涉及多个客户(可能是你的情况),那么你需要确保你有"订阅"已启用,您需要在客户所需的特定密钥或密钥中注册兴趣。或者,您可以使用CQ(推荐)来定义(GemFire OQL)查询谓词,以更简洁地表达您有兴趣接收通知的数据。

与客户PROXY | CACHING_PROXY 地区和"兴趣"相关联的layer上的订阅configured/enabled (例如,by key(s)using regex,带有重载的变体)用 Region API表示。

您可以找到有关配置客户端/服务器事件消息 here的更多信息。此外,您应该考虑Continuous Queries

您还应该通过阅读this确保您真正了解客户端/服务器消息,尤其是拓扑中的多个客户端。

还有其他可用的配置选项,如服务器端,例如consistency checking,尤其是当您在PR中配置了冗余时,其中一个客户端可能正在访问冗余副本,但这应该少于这是一个问题。

从技术上讲,它更可能是您的客户端队列的问题,因为客户端队列是异步更新的,而从服务器发送到客户端的通知是不确定的,正如文档所指出的那样......

  

5。条目X的事件从队列发送到Client2。发生这种情况时是不确定的。

无论如何,从这开始。确保来自单个客户端的请求/加载/更新首先是一致的,然后涉及其他客户端。确保您已表达了正确的利益政策等。请阅读我提供的链接中的文档。

希望这有帮助!

此致 约翰

相关问题