2012-10-09 7 views
1

App Engine의 RPC 및 GWT (앱 엔진 연결 프로젝트)를 사용하여 페이지 매김을 구현하려고합니다.App Engine 페이지 매김 용 커서 저장

RPC에서 쿼리 결과와 웹 안전 커서 개체를 GWT 클라이언트로 전달하는 방법은 무엇입니까?

서블릿을 사용하는 예제를 보았지만 servelt 없이는 어떻게하는지 알고 싶습니다.

나는 memcache를 사용하여 서버에서 커서를 캐싱하는 것을 고려해 봤지만 적절한 것인지, 아니면 키 (세션 식별자라고 가정 할 것인가?)를 사용해야하는지 잘 모르겠다. on App Engine).

예제 프로젝트에 대한 링크가 환상적 일 것이므로 찾을 수 없습니다.

답변

2

좋습니다. 이렇게하려면 커서를 클라이언트에 문자열로 저장하는 것이 가장 좋습니다.

이렇게하려면 결과 목록과 커서 문자열을 저장할 수있는 RequestFactory를 통해 클라이언트에 전달할 수 있도록 전송할 수있는 래퍼 클래스를 만들어야합니다. 이것을하기 위해서 당신은 보통의 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; 
    } 
} 

: 여기

코드가 POJO에 대한 생겼는지

는 POJO 각각 프록시

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

// request factory method 
Request<OrganizationResultsWrapperProxy> getOrganizations(String webSafeCursorString); 
를 사용하도록 서비스 및 requestFactory를 설정

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

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

    String getWebSafeCursorString(); 
    void setWebSafeCursorString(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; 
} 
0

두 번째 옵션은 이미 언급 한 바와 같이, memcache에있는 webSafeCursorString를 저장하는 것입니다.

내 생각은 다음과 같습니다

  1. 클라이언트가 항상 전송이 "getMyObjects (객체 ... myParams, 문자열 clientPaginationString,에서 maxResults를 INT)"와 같은 요청합니다.

  2. 서버가 요청을 수신하고 키 clientPaginationString 서버가 아무것도 발견하지 않는 경우

    1. 에 대한 webSafeCursorString이있는 경우 memcache에에 보이는, 그는 쿼리를 작성하고 저장 아래 그림처럼 clientPaginationString 고유하게 생성된다 webSafeCursorString을 clientPaginationString을 키로 사용하여 memcache에 추가하십시오.- 서버가 결과

문제가 memcache에 청소하는 방법과 독특한를 찾을하는 방법입니다 그가 그것으로 쿼리를 다시 시작할 webSafeCursorString을 찾아 반환하는 경우> 결과를 ​​

  • 을 반환 clientPaginationString :

    unique clientPaginationString은 현재 UserId + 현재 검색어 + timestemp의 매개 변수 여야합니다. 이 잘 작동합니다!

    나는 정말로 memcache를 청소하는 방법을 생각할 수 없다. 그러나 우리는 그것을 전혀 청소할 필요가 없다고 생각한다. 맵을 포함하는 WebSafeCursor 클래스에 모든 webSafeCursorStrings 및 timestemps + params + userid를 저장하고 memcache에이 모든 것을 저장할 수 있습니다.이 클래스를 잠시 동안 정리합니다 (이전의 타임 스탬프 ...).

    내가 생각할 수있는 한 가지 개선점은 webSafeCursorString을 memcache에 서버 (userSessionId + servicename + servicemethodname + params)에 생성 된 키로 저장하는 것입니다. 그러나 중요한 것은 새로운 쿼리 (memcache가 재정의)에 관심이 있거나 다음 페이지 매김 결과 (memcache에서 webSafeCursorString 가져 오기)를 원할 경우 클라이언트가 정보를 전송한다는 것입니다. 페이지를 새로 고침하면 제대로 작동합니다. 브라우저의 두 번째 탭은 내가 생각하기에 문제가 될 것입니다 ...

    무엇을 말씀 하시겠습니까?