0

EJB我有一个调用 4秒的“客户端” ,Asynchronous EJB应该让它们全部运行 5 秒。Future5 秒后,“客户端”EJB 从完成运行的对象收集就绪结果,并返回输出。

我对客户端部分的“等待”有疑问。我试图调用future.get(5, TimeUnit.MILLISECONDS) 它似乎有时 async EJBs在超时后开始运行。有正确的方法吗?

1)收集Future对象Map

    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;

Future2)然后我从对象中获得超时输出

    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;
}

谢谢你

4

1 回答 1

0

我认为您的客户不应该知道异步代码是否仍然需要安排或者它是否已经运行了这 5 秒的详细信息。

您的客户应该关心的是总等待时间。由于没有系统拥有无限的资源,因此无法保证异步代码立即开始运行。

如果您想将实际执行时间限制为 5 秒,唯一现实的方法是在执行代码的 bean 中执行此操作。

ps

与您的问题无关,但是为什么要对超时进行这种奇怪的计算?您现在执行“now + 5 seconds - now”,又是 5 秒。

而且,如果您遍历 Map 并且需要值和键,则可以遍历 entrySet,而不是遍历键集,然后get()为每个键执行一次。

于 2012-01-12T15:27:37.997 回答