使用分区区域在Geode服务器中获取数据

时间:2017-10-03 14:40:55

标签: java geode

我有一个Geode系统,有一个定位器,三个缓存服务器和一个客户端。在这些服务器中,有一个我的数据所在的分区区域。我要做的是在每台服务器上运行一个函数来获取该特定服务器上的数据。我在下面编写了以下函数:

public void execute(FunctionContext fc) {
    Cache cache = CacheFactory.getAnyInstance();
    // testRegion is a partitioned region
    Region<Object, Object> region = cache.getRegion("/testRegion");
    Set<Object> keys = region.keySet();
    Set keysTillSecondLast = new HashSet();
    int setSize = keys.size();
    Iterator keysIterator = keys.iterator();
    for(int i = 0; i < (setSize -1); i++)
    {
        keysTillSecondLast.add(keysIterator.next());
    }
    for (Object k : keysTillSecondLast) {
        fc.getResultSender().sendResult((Serializable) region.get(k));
    }
    Object lastResult = keysIterator.next();
    fc.getResultSender().lastResult((Serializable) region.get(lastResult));
}

分区域中有30个条目。当我像上面这样调用上面的函数时:

public void runFunction() {
    MyFunction function = new MyFunction();
    FunctionService.registerFunction(function);

    Execution execution = FunctionService.onServers(cache);
    ResultCollector collector = execution.execute(new MyFunction());
    List result = (List) collector.getResult();
    System.out.println(result);
}

result列表的大小为60(重复条目)。当我使用FunctionService.onServer()方法时,列表大小为30,这是我推送的所有数据。那么有没有办法只获取特定服务器上的数据?就像我运行函数时一样,它应该返回类似:

Data on Server1: ....
Data on Server2: ....
Data on Server3: ....

1 个答案:

答案 0 :(得分:2)

您需要在函数体中使用PartitionRegionHelper来获取本地数据。类似的东西:

@Override
public void execute(FunctionContext context) {
  RegionFunctionContext rfc = (RegionFunctionContext) context;
  Region r = PartitionRegionHelper.getLocalDataForContext(rfc);
  ...
}