2012-01-12 45 views
0

我有一个“客户端”EJB,它调用4 AsynchronousEJB s,并且应该让它们全部运行5秒。 5秒钟后,“客户端”EJB收集来自Future对象的就绪结果,该对象已完成运行,并返回输出。异步EJB最多等待X秒

我有一个问题,在客户端的“等待”部分。我试图调用future.get(5, TimeUnit.MILLISECONDS) 好像有时异步EJB s 开始运行后超时。 有没有正确的方法来做到这一点?

1)Map收集Future对象:

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秒。

而且,如果迭代Map并需要值和键,则可以遍历entrySet,而不是通过键集,然后对每个键执行get()

+0

我的客户不想等待长时间执行。这并不意味着它不应该等待没有启动执行的服务。 – lili 2012-01-12 15:53:00

+0

我调用future.get(timeout),并等待一部分超时。下次我计算超时时间时(我检查剩余时间还剩多少) – lili 2012-01-12 15:53:25

+0

>我检查剩下多少时间 - 你说得对,傻我 – 2012-01-12 16:36:16