2017-10-03 11 views
0

私は、ロケータが1つ、キャッシュサーバが3つ、クライアントが1つの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)); 
} 

partitoned領域には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: .... 

答えて

2

ローカルデータを取得するには、関数本体でPartitionRegionHelperを使用する必要があります。次のようなもの:

@Override 
public void execute(FunctionContext context) { 
    RegionFunctionContext rfc = (RegionFunctionContext) context; 
    Region r = PartitionRegionHelper.getLocalDataForContext(rfc); 
    ... 
} 
関連する問題