0

나는 주요 사용자 페이지에서 Ajax 요청에 크게 의존하는 프로젝트를 진행 중이다.Play Framework 1.2.4 비동기 스레드에서 작업 동기화 : 가능합니까?

현재 웹 페이지에서 각각의 아약스 요청이있는 동일한보기가 "n"개 있습니다. 그래서 페이지를로드 할 때 동시에 "n"개의 아약스 요청이 실행됩니다.

첫 번째 요청이 실행 된 후 다른 요청이 캐시에서 데이터를 수집한다는 또 다른 디자인 문제가 있습니다. Heres는 워크 플로우 :

요청 :

  1. 보내기 요청
  2. 확인 캐시가 필요한 값
  3. 를 사용할 수없는 경우, ( 약간의 시간 소요) 웹 서버에서 데이터를 수집있는 경우
  4. 데이터를 수집하고 "x"분의 값을 캐시에 씁니다.
  5. 값을 으로 설정하십시오.

그래서 나는 시작에서 하나의 요청을 실행하고 다른 요청은 첫 번째가 끝날 때까지, 그들은 캐시에 사용할 수있는 데이터를 사용할 수 기다릴 수 있도록 관리 할 수 ​​있으며, 그것은 크게 성능을 향상시킬 수있는 경우 .

문제는 .. 그 요청이 늘 첫 페이지로드에서 캐시 값을 볼 이벤트 있도록 놀이가 모든 작업 비동기 실행

입니다 그래서 내가해야 할 것은 이것이다 : 그래서

----Main ASYNC Thread------ 
-------first View Request---- 
-------second Request (it will run after the first one so it will read from the cache--- 
----- and so on... 

, 어떻게 큐에 요청을 넣을 수 있습니까? 아니면 다른 요청을 "대기"할 수 있습니까?

나는 이것에 대한 응용 프로그램을 설계해야하지만 페이지 디자인과 자바 스크립트 디자인은 외부 소스에서 왔음을 알고 있습니다. 그래서 난 당신이 하나의 방법으로 데이터 로딩 로직을 캡슐화 경우, 예를 들어, 그 방법으로 모든 스레드를 동기화 할 수 있습니다 ..

답변

0

을 도와 .. 그런 것들에 작업 할 시간이

감사를 해달라고. AtomicBoolean 플래그를 사용합니다.

private final AtomicBoolean initialised = new AtomicBoolean(false); 

public Data getData() { 
    Data data = null; 
    if (!initialised.get() && initialised.compareAndSet(false, true)) { 
    cache.put(loadData()); 
    } 
    while ((data = cache.get()) == null); 
    return data; 
} 

하나의 접근 방식 중 하나.

+0

나는 두 가지 접근법으로이 문제를 해결했다. 우선 jquery.queue라는 것이 있다는 것을 깨달았고, 그래서 나는 ajax 요청을 대기열에 넣을 수있다. 그리고 나서 논리를 필요한 것으로 계산하고 캐시 한 것으로 변경했다. 첫 번째 요청에 대한 값과 다른 값은 캐시 된 값을 살펴 봅니다. (논리는 "캐시 찾기"와 같은 경우 "찾을 DB"를 찾을 수 없다면 "계산 수행") 처음으로 캐시 된 큐와 다른 캐시의 데이터를 캐시에서 얻습니다. – dreampowder

+0

BTW AtomicBoolean 내 지식 수준, 정보를 공유 주셔서 감사합니다, 나는 또한 어떻게 든 당신이 말한 것처럼 데이터 로딩 논리를 캡슐화하여 귀하의 답변을 수락 오전. 감사합니다. – dreampowder

+1

Np. 하지만 캐시 된 데이터가 여러 사용자/세션간에 공유되거나 다른 요청이 브라우저의 다른 탭에서 전송되는 경우 (세션은이 경우 세션이 동일 함) 초기 문제가 발생합니다. 이것은로드 된 각 페이지에 대해 생성 된 여러 개의 jqery 대기열이 있기 때문입니다. 따라서 서버 측의 동기화 메커니즘이 문제를 해결하는 데 필수적 일 수 있습니다. – Vlad

관련 문제