Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 存储用于应用程序引擎分页的光标_Google App Engine_Google Cloud Datastore - Fatal编程技术网

Google app engine 存储用于应用程序引擎分页的光标

Google app engine 存储用于应用程序引擎分页的光标,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我正在尝试使用AppEngine的RPC和GWT实现分页(这是一个AppEngine连接的项目) 如何将查询结果和web安全游标对象从RPC传递给GWT客户端 我见过使用servlet的示例,但我想知道如何在没有servlet的情况下实现它 我考虑过使用memcache在服务器上缓存光标,但我不确定这是否合适,或者应该使用什么作为键(我假设会话标识符,但我不确定appengine上如何处理它们) 指向示例项目的链接将非常棒,我一直找不到任何链接。好的,所以最好的方法是将光标作为字符串存储在客户端

我正在尝试使用AppEngine的RPC和GWT实现分页(这是一个AppEngine连接的项目)

如何将查询结果和web安全游标对象从RPC传递给GWT客户端

我见过使用servlet的示例,但我想知道如何在没有servlet的情况下实现它

我考虑过使用memcache在服务器上缓存光标,但我不确定这是否合适,或者应该使用什么作为键(我假设会话标识符,但我不确定appengine上如何处理它们)


指向示例项目的链接将非常棒,我一直找不到任何链接。

好的,所以最好的方法是将光标作为字符串存储在客户端上

要做到这一点,您必须创建一个可传输的包装器类,这样您就可以通过RequestFactory将其传递回客户端,RequestFactory可以保存结果列表和游标字符串。为此,需要创建一个普通POJO,然后为其创建一个代理

以下是POJO的代码:

public class OrganizationResultsWrapper {

    public List<Organization> list;
    public String webSafeCursorString;

    public List<Organization> getList() {
        return list;
    }

    public void setList(List<Organization> list) {
        this.list = list;
    }

    public String getWebSafeCursorString() {
        return this.webSafeCursorString;
    }

    public void setWebSafeCursorString(String webSafeCursorString) {
        this.webSafeCursorString = webSafeCursorString;
    }
}
公共类OrganizationResultsWrapper{
公开名单;
公共字符串websafecurstring;
公共列表getList(){
退货清单;
}
公共无效集合列表(列表){
this.list=列表;
}
公共字符串getWebSAFECURSTRING(){
返回此.websafecurstring;
}
public void setWebSAFECURSTRING(字符串WebSAFECURSTRING){
this.websafecurstring=websafecurstring;
}
}
对于代理:

@ProxyFor(OrganizationResultsWrapper.class)
public interface OrganizationResultsWrapperProxy extends ValueProxy{

    List<OrganizationProxy> getList();
    void setList(List<OrganizationProxy> list);

    String getWebSafeCursorString();
    void setWebSafeCursorString(String webSafeCursorString);

}
@ProxyFor(OrganizationResultsWrapper.class)
公共接口OrganizationResultsWrapperProxy扩展了ValueProxy{
List getList();
无效集合列表(列表);
字符串getWebSAFECURSTRING();
void setWebSAFECURSTRING(字符串WebSAFECURSTRING);
}
将您的服务和requestFactory设置为分别使用POJO和代理

// service class method
@ServiceMethod
public OrganizationResultsWrapper getOrganizations(String webSafeCursorString) {
    return dao.getOrganizations(webSafeCursorString);
}

// request factory method
Request<OrganizationResultsWrapperProxy> getOrganizations(String webSafeCursorString); 
//服务类方法
@服务方法
public OrganizationResultsWrapper getOrganizations(字符串WebSafeCurString){
返回dao.getOrganizations(websafecurstring);
}
//请求工厂方法
请求getOrganizations(字符串websafecurstring);
然后确保并运行RPC向导,以便运行验证过程,否则将在服务器上出现请求上下文错误

以下是我的数据访问类中的实现:

public OrganizationResultsWrapper getOrganizations(String webSafeCursorString) {
    List<Organization> list = new ArrayList<Organization>();
    OrganizationResultsWrapper resultsWrapper = new OrganizationResultsWrapper();

    Query<Organization> query = ofy().load().type(Organization.class).limit(50);

    if (webSafeCursorString != null) {
        query = query.startAt(Cursor.fromWebSafeString(webSafeCursorString));
    }

    QueryResultIterator<Organization> iterator = query.iterator();
    while (iterator.hasNext()) {
        list.add(iterator.next());
    }

    resultsWrapper.setList(list);
    resultsWrapper.setWebSafeCursorString(iterator.getCursor().toWebSafeString());

    return resultsWrapper;
}
public OrganizationResultsWrapper getOrganizations(字符串WebSAFECURSTRING){
列表=新的ArrayList();
OrganizationResultsWrapper resultsWrapper=新的OrganizationResultsWrapper();
Query Query=ofy().load().type(Organization.class).limit(50);
if(websafecurstring!=null){
query=query.startAt(Cursor.fromWebSafeString(WebSafeCursString));
}
QueryResulterator迭代器=query.iterator();
while(iterator.hasNext()){
add(iterator.next());
}
resultsWrapper.setList(列表);
resultsWrapper.setWebSafeCursorString(iterator.getCursor().TowersFestString());
返回结果包装器;
}

第二个选项是将websafecurstring保存在memcache中,如您所述

我的想法是这样的:

  • 客户机发送的总是这样的请求“getMyObjects(Object…myParams,int-maxResults,String-clientPaginationString)”。clientPaginationString是唯一创建的,如下所示

  • 服务器接收请求并查看memcache中是否存在密钥clientPaginationString的WebSafeCurString

  • 如果服务器找不到任何内容,他将创建查询并将websafecurstring保存到memcache中,其中clientPaginationString作为键。->返回结果

  • 如果服务器找到websafecurstring,他将用它重新启动查询并返回结果

  • 问题是如何清理memcache以及如何查找唯一的clientPaginationString:

    唯一的clientPaginationString应该是当前用户ID+当前查询的参数+timestemp。这应该很好用

    我真的想不出一个简单的方法来清理memcache,但是我认为我们根本不需要清理它。 我们可以将所有websafecurstring和timesteps+params+userid存储在包含映射的WebSafeCursor类中,并将所有这些存储在memcache中。。。并在一段时间内清理这些类(时间戳较旧…)

    我能想到的一个改进是使用在服务器上创建的密钥(userSessionId+servicename+servicemethodname+params)将websafecurstring保存在memcache中。但是,重要的是,如果客户机对新查询感兴趣(memcache被覆盖)或希望获得下一个分页结果(从memcache获取websafecurstring),则客户机将发送一个信息。重新加载页面应该可以工作。在浏览器中点击第二次可能会有问题,我想

    你会怎么说