2014-07-23 2 views
1

편집 : 아래 @maress answer에 대한 응답으로 질문을 편집했습니다.자바 비동기 서블릿 : 특정 이벤트 대기

Java (async enabled)의 웹 서비스가 있는데,이 서비스는 호출 될 때 다른 서비스를 비동기 적으로 호출합니다. 내 컨트롤러에서 나는 이것을 가지고있다 :

private boolean receivedEvent = false; 
private final Object SYNC = new Object(); 

public Callable<String> doStuff() 
{ 
    callSomeAsyncFunction(); 

    return new Callable<String>() 
      { 
       @Override 
       public String call() throws Exception { 

        synchronized (SYNC) 
        { 
         while (receivedEvent == false) 
         { 
          SYNC.wait(); 
         } 

         receivedEvent = false; 
         System.out.println("RETURN"); 
         return "ok"; 
        } 
       } 
      }; 
} 

public void onMyEvent(MyEvent event) 
    { 
     synchronized (SYNC) 
     { 
      receivedEvent = true; 
      System.out.println("RECEIVED"); 
      SYNC.notify(); 
     } 
    } 

EDIT : 알림이 결코 통과되지 않는다. System.out.println ("RETURN")은 호출되지 않습니다. 이벤트가 수신 중입니다 ('수신 됨'이 표시됨).

이제는 callSomeAsyncFunction()의 실행이 끝날 때까지 기다리고 싶습니다. 완료되면 처리기 public void onMyEvent(MyEvent event)에서 이벤트를 트리거합니다.

제안 사항? 내 접근 방식이 전혀 이해가되는지 확실하지 않습니다.

답변

1

항상 마지막 인스턴스에서 동기화하십시오.

private MyEvent myEvent; 
private final Object SYNC = new Object(); 

public Callable<String> doStuff() 
{ 
    callSomeAsyncFunction(); 

    return new Callable<String>() 
      { 
       @Override 
       public String call() throws Exception { 

        synchronized (SYNC) 
        { 
         while (myEvent == null) 
         { 
          SYNC.wait(); 
         } 
         return "ok"; 
        } 
       } 
      }; 
} 

public void onMyEvent(MyEvent event) 
    { 
     synchronized (SYNC) 
     { 
      myEvent = event; 
      SYNC.notifyAll(); 
     } 
    } 
+0

Thx, 이제 오류는 발생하지 않지만 알림이 작동하지 않습니다. 나는 결코 '돌아 오는'ok '에 도달하지 않는다;' –

+0

아마도 callSomeAsyncFunction()이 onMy/evnt (MyEvent) 함수를 호출하지 않기 때문일 수 있습니다. – maress

+0

있습니다. 나는 컨트롤 - 로그 온통있다 : –