2012-01-12 6 views
0

나는 "EJB"을 호출하고 4 AsynchronousEJB을 호출하며 모두 실행하는데 5 초를 제공해야합니다. 5 초 후 "클라이언트"EJB는 완료된 Future 오브젝트에서 준비 결과를 수집하고 출력을 리턴합니다.비동기 EJB에 대해 최대 X 초 대기

클라이언트 부분에서 "대기 중"문제가 있습니다. 나는 시도했다 future.get(5, TimeUnit.MILLISECONDS) 때로는 비동기 같아 보인다 EJB 시간 초과 후 실행을 시작합니다. 올바른 방법이 있습니까?

1) MapFuture 개체를 수집

Map<String, Future> futureMap = new HashMap<String, Future>(); 
    for (String userID: users) { 
      Future<Set<FrontPageData>> test = util.asyncGetData(userID); 
      futureMap.put(serviceID, test); 

    } 
    return futureMap; 

2) 그럼 난 Future 객체

final long now = Calendar.getInstance().getTimeInMillis(); 
    final long end = now + TimeUnit.SECONDS.toMillis(5) 
    Map<String, Object> output = new HashMap<String, Object>(); 
    Object data; 
    for (String userID: futureMap.keySet()) { 
     Future future= futureMap.get(userID); 
     try { 
      //check how much time left till the end 
      long timeout = end - Calendar.getInstance().getTimeInMillis(); 
      data = future.get(timeout, TimeUnit.MILLISECONDS); 
      output.put(userID, data); 
     } catch (Exception e) {//write to logs 
     } 
    } 
    return output; 
} 

에서 타임 아웃 출력을 얻을 당신에게

답변

0

나는 당신의 클라이언트를 생각하지 않습니다 감사합니다 비동기 코드가 여전히 스케줄링되어야하는지 또는 5 초 동안 실행되었는지에 대한 세부 사항을 알고 있어야합니다.

귀하의 모든 클라이언트는 대기 시간이 걱정됩니다. 시스템에 무제한의 리소스가 없으므로 비동기 코드가 즉시 실행되기 시작한다는 보장은 없습니다.

실제 실행 시간을 5 초로 제한하려면 코드를 실행하는 bean에서이 작업을 수행하는 유일한 방법이 있습니다.

p.s.

질문과 관련이 없지만 시간 초과에 대한 이상한 계산은 왜해야합니까? 이제 "지금 + 5 초 - 지금"으로, 다시 5 초가됩니다.

지도를 반복하고 값과 키가 모두 필요한 경우 키 집합 대신 enterSet을 반복하고 각 키에 을 수행 할 수 있습니다.

+0

내 고객은 장기간의 처형을 기다리고 싶지 않습니다. 그렇다고해서 실행을 시작하지 않은 서비스를 기다리지 않아도된다는 의미는 아닙니다. – lili

+0

future.get (timeout)을 호출하고 시간 초과 부분을 기다립니다. 다음 시간에 제한 시간을 계산하면 더 적은 시간이 걸릴 것입니다. (실행 시간이 얼마 남았는지 확인하십시오.) – lili

+0

> 실행 시간이 얼마 남았는지 확인하십시오. - 바보 같아요, 바보 같아요. –

관련 문제