Получение данных на сервере 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 ответ

Решение

Вам нужно использовать PartitionRegionHelper в теле функции для получения локальных данных. Что-то вроде:

@Override
public void execute(FunctionContext context) {
  RegionFunctionContext rfc = (RegionFunctionContext) context;
  Region r = PartitionRegionHelper.getLocalDataForContext(rfc);
  ...
}
Другие вопросы по тегам