在具有分区区域的 Geode 服务器中获取数据
Getting data in a Geode Server with a Partitioned Region
我有一个带有一个定位器、三个缓存服务器和一个客户端的 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,这是我推送的所有数据。那么有没有办法只获取特定服务器上的数据呢?就像当我 运行 函数时它应该 return 类似:
Data on Server1: ....
Data on Server2: ....
Data on Server3: ....
您需要在函数体中使用PartitionRegionHelper 来获取本地数据。类似于:
@Override
public void execute(FunctionContext context) {
RegionFunctionContext rfc = (RegionFunctionContext) context;
Region r = PartitionRegionHelper.getLocalDataForContext(rfc);
...
}
我有一个带有一个定位器、三个缓存服务器和一个客户端的 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,这是我推送的所有数据。那么有没有办法只获取特定服务器上的数据呢?就像当我 运行 函数时它应该 return 类似:
Data on Server1: ....
Data on Server2: ....
Data on Server3: ....
您需要在函数体中使用PartitionRegionHelper 来获取本地数据。类似于:
@Override
public void execute(FunctionContext context) {
RegionFunctionContext rfc = (RegionFunctionContext) context;
Region r = PartitionRegionHelper.getLocalDataForContext(rfc);
...
}