2017-06-14 60 views
0

我已經創建了從分區區域Individual中選擇數據的函數。當我嘗試在客戶端執行函數變爲null時。GemFire 8.2.x中的QueryService函數返回空值

輸出
[[],空]

公共類MySelectPartitionFunction擴展FunctionAdapter實現申報{

private static final long serialVersionUID = 1L; 

    @Override 
    public void execute(FunctionContext context) { 
     Cache cache = CacheFactory.getAnyInstance(); 
      QueryService queryService = cache.getQueryService(); 

      String qstr = (String) context.getArguments(); 

      try { 
      Query query = queryService.newQuery(qstr); 
      RegionFunctionContext rContext = (RegionFunctionContext)context; 
      SelectResults results = (SelectResults) query.execute(rContext); 
      context.getResultSender().sendResult((ArrayList) (results).asList()); 
      context.getResultSender().lastResult(null); 
      } catch (Exception e) { 
      throw new FunctionException(e); 
      } 
     } 

    @Override 
    public String getId() { 
    return getClass().getName(); 
    } 

    @Override 
    public boolean hasResult() { 
     return true; 
    } 

    @Override 
    public boolean isHA() { 
     return false; 
    } 

    public void init(Properties arg0) { 
    } 

} 


public class TestFunctionQuery { 
    public static void main(String[] args) { 

     ResultCollector rcollector = null; 
     ClientCache cache; 
     Region<?, ?> individual; 

     cache = new ClientCacheFactory().set("name", "ClientWorker").set("cache-xml-file", "xml/clientCache.xml") 
       .create(); 
     individual = cache.getRegion("Individual"); 
     String qStr = "SELECT * FROM /Individual"; 

     try { 
      Set keyFilter = new HashSet(); 
      keyFilter.add(1); 

      rcollector = FunctionService 
       .onRegion(individual) 
       .withArgs(qStr) 
       .withFilter(keyFilter) 
       .execute("com.xxx.logic.MySelectPartitionFunction"); 

      Object result = rcollector.getResult(); 
      ArrayList resultList = (ArrayList)result; 
      List queryResults = new ArrayList(); 
      if (resultList.size()!=0) { 
      for (Object obj: resultList) { 
       if (obj != null) { 
       queryResults.addAll((ArrayList)obj); 
       } 
      } 
      } 
      System.out.println((queryResults)); 

     } catch (FunctionException ex) { 
      System.out.println("Exception"); 
     } 
     } 

} 

gfsh>describe region --name=Individual 
.......................................................... 
Name   : Individual 
Data Policy  : partition 
Hosting Members : server2 
server1 


Non-Default Attributes Shared By Hosting Members 

    Type |  Name  | Value 
--------- | ---------------- | ----- 
Region | size    | 3 
Partition | redundant-copies | 1 

回答

0

我能夠在功能和客戶端代碼

更改後檢索記錄
@Override 
public void execute(FunctionContext context) { 
    Cache cache = CacheFactory.getAnyInstance(); 
    QueryService queryService = cache.getQueryService(); 

     String qstr = (String) context.getArguments(); 

     try { 
      Query query = queryService.newQuery(qstr); 
      SelectResults<?> result = (SelectResults<?>) query.execute((RegionFunctionContext) context); 
      ArrayList<?> arrayResult = (ArrayList<?>) result.asList(); 
      context.getResultSender().sendResult(arrayResult); 
      context.getResultSender().lastResult(null); 
     } catch (Exception e) { 
     throw new FunctionException(e); 
     } 

} 

ClientCache cache; 
    Region<?, ?> individual; 

    cache = new ClientCacheFactory().set("name", "ClientWorker").set("cache-xml-file", "xml/clientCache.xml") 
      .create(); 
    individual = cache.getRegion("Individual"); 


    String qStr = "SELECT r1.id,r1.firstName, r1.lastName FROM /Individual r1"; 

    try { 

     Object result = FunctionService.onRegion(individual) 
       .withArgs(qStr).execute("com.xxx.logic.MySelectPartitionFunction").getResult(); 

Output [struct(id:2,firstName:Basha,lastName:Shaik),struct(id:1,firstname:Krish,lastName:Chaitu),struct(id:5,firstName:Vigneshwaran,lastName:Ganesan) ],null,[結構(id:4,名字:Arun,姓氏:Kishore),結構(id:3,名字:Anurag,姓氏:Kshirsagar)],null]