1

App EngineのRPCとGWT(App Engineに接続されたプロジェクト)を使用してページ付けを実装しようとしています。

クエリ結果とWebセーフカーソルオブジェクトの両方をRPCからGWTクライアントに渡すにはどうすればよいですか?

サーブレットを使用した例を見てきましたが、サーブレットなしでそれを行う方法を知りたいです。

memcacheを使用してサーバーにカーソルをキャッシュすることを検討しましたが、それが適切かどうか、またはキーとして何を使用する必要があるかわかりません(想定するセッション識別子ですが、App Engineでそれらがどのように処理されるかはわかりません) 。

サンプルプロジェクトへのリンクは素晴らしいでしょう、私は何も見つけることができませんでした。

4

2 に答える 2

2

OK、これを行う最良の方法は、カーソルを文字列としてクライアントに保存することです。

これを行うには、結果リストとカーソル文字列を保持できる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;
    }
}

プロキシの場合:

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

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

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

}

POJOとプロキシをそれぞれ使用するようにサービスとrequestFactoryを設定します

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

// request factory method
Request<OrganizationResultsWrapperProxy> getOrganizations(String webSafeCursorString); 

次に、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;
}
于 2012-10-10T19:41:01.177 に答える
0

2番目のオプションは、すでに述べたように、webSafeCursorStringをmemcacheに保存することです。

私のアイデアは次のようになります。

  1. クライアントは常にこの「getMyObjects(Object ... myParams、int maxResults、StringclientPaginationString)」のようなリクエストを送信します。clientPaginationStringは、以下に示すように一意に作成されます

  2. サーバーはリクエストを受信し、キーclientPaginationStringのwebSafeCursorStringがある場合はmemcacheを調べます

    1. サーバーが何も見つからない場合、サーバーはクエリを作成し、clientPaginationStringをキーとしてwebSafeCursorStringをmemcacheに保存します。->結果を返します

    2. サーバーがwebSafeCursorStringを見つけた場合、サーバーはそれを使用してクエリを再開し、結果を返します

問題は、memcacheをクリーンアップする方法と、一意のclientPaginationStringを見つける方法です。

一意のclientPaginationStringは、現在のUserId+現在のクエリのパラメータ+timestempである必要があります。これは問題なく動作するはずです!

memcacheをクリーンアップする簡単な方法は本当に考えられませんが、クリーンアップする必要はまったくないと思います。すべてのwebSafeCursorStringsとtimestemps+params + useridをマップを含むWebSafeCursor-Classに保存し、これらすべてをmemcacheに保存します...そしてこのクラスのものをしばらくの間クリーンアップします(タイムスタンプはそれより古い...)。

私が考えることができる1つの改善は、サーバー上に作成されたキー(userSessionId + servicename + servicemethodname + params)を使用してwebSafeCursorStringをmemcacheに保存することです。ただし、重要なのは、クライアントが新しいクエリに関心がある場合(memcacheがオーバーライドされる)、または次のページ付け結果が必要な場合(memcacheからwebSafeCursorStringを取得する)に情報を送信することです。ページのリロードが機能するはずです。ブラウザを2回タップすると、問題になると思います...

あなたは何と言うでしょう?

于 2013-11-10T15:37:49.610 に答える