2012-05-28 4 views
0

네이티브 Java 응용 프로그램을 GWT로 변환하는 중입니다. 서버와의 통신은 상태 변경 중에 만 발생하며 지금까지는 차단 작업에 의해 처리되었습니다.GWT : 비동기 RPC로 차단 호출 바꾸기

현재 동기화 로직 :

void onUserClickedSync() { 
    downloadData(); // blocking operation 
    uploadData(); // blocking operation 
    setState(DONE); 
} 

가 어떻게 비동기 콜백을 활용하는 사람들과 작업을 차단 교체에 접근 할 수 있습니까?

현재 나의 생각은 본질적으로 아무 것도하지 않는 여분의 "바쁜"상태를 많이 추가하는 것입니다. 그런 다음 RPC의 콜백을 사용하여 논리가 계속 될 수있는 다음 상태를 트리거합니다.

동기화 로직이 될 것입니다 :이 방법이 유효

void onUserClickedSync() { 
    rpc.downloadData(new AsyncCallback<Data> { 
     public void onSuccess(Data result) { 
      //... 
      onDownloaded(); 
     } 
     //... 
    }); 
    setState(WAITING_FOR_DOWNLOAD); 
} 

void onDownloaded() { 
    rpc.uploadData(new AsyncCallback<Void> { 
     public void onSuccess(Void void) { 
      //... 
      setState(DONE); 
     } 
    //... 
    }); 
    setState(WAITING_FOR_UPLOAD); 
} 

인가? 내가 알아야 할게있어?

편집 : 내 예제가 의사 코드로 작성된 것은 매우 불분명했기 때문입니다.

+0

실제 작업을 위임하려면 미안하지만 이해할 수 없습니다. 스레드, 또는 "4 아무 것도하지 않으면 ..."이라는 메시지가 나타날 때까지 기다려야합니다. –

+0

OK, 약간 혼란 스러웠습니다. 그것을 제거했습니다. :) – vaughandroid

+0

좋아, 그럼 3 단계 후에 무엇을합니까? 콜백이 외부에서 상태를 설정하기 위해 대기중인 통화 대기 루프를 입력 하시겠습니까? –

답변

1

네, 질문에 대해 유감스럽게 생각해서 죄송합니다.하지만이 예는 분명하지 않았습니다.

이제 상황을보다 잘 처리 할 수있게되었으므로 귀하의 접근 방식은 실행 가능하다고 생각합니다. 콜백이 시스템 상태를 변경하면 동시에 발생하는 다른 이벤트와 충돌 할 수있는 "부작용"이 없음을주의하십시오.

"여러 콜백 대기"(즉, 사용자가 4 번의 업로드를 시작하여 4 번의 콜백을 할 수 있으며 반드시 "올바른 순서"가 아닐 수도 있음) 분명하지 않습니다. 또한 해당 uploaddata 전에 uploaddata 메서드가 종료 될 가능성이 있습니까?

일반적으로 예상치 못한 응답 (예 : 첫 번째 다운로드가 끝날 때까지는 아무 일도 일어나지 않음)이 예상치 못한 순서로 발생하지만 때로는 미묘한 버그를 유발할 수 있으므로주의해야합니다 제대로 진단하거나 재현하기가 어렵습니다.

우리는 나머지 응용 프로그램을 볼 수 없으므로 콜백간에 발생할 수있는 다른 점에 대해서는 분명하지 않지만 그 점에 대해 매우주의 깊게 살펴보고 특히 콜백 오류 처리를 특히 강력하게 만듭니다 (즉, 업로드가 중간에 실패하면 어떻게됩니까? 서버에서 중단 된 것을 알리는 콜백을 계속 받습니까? 어떤 상태로 이동 했습니까?)

+0

다시 걱정하지 마십시오. 질문 - 나의 원래 예제는 쓰레기였습니다. 문제를 설명하는 것은 분명히해야 할 일입니다 ... 어쨌든, 처음에는 시스템이 한 번에 하나의 콜백 만 대기하는 것을 보장합니다. 이 단계에서 내 변경 사항의 복잡성을 제한하기 위해 할 수있는 모든 조치를 취해야합니다 ... – vaughandroid

1

원격 상호 작용을위한 인터페이스를 설계 할 때 대개 대기 시간을 줄이기 위해 가능한 한 거친 작업을 수행해야합니다.

특히 "다운로드"와 "업로드"를 단일 작업으로 병합 할 수 있습니다. 이렇게하면 대기 시간을 단일 왕복으로 줄이고 여러 대기 상태를 제거 할 수 있습니다.