Asynchronous 异步EJB最多等待X秒

Asynchronous 异步EJB最多等待X秒,asynchronous,ejb-3.1,future,Asynchronous,Ejb 3.1,Future,我有一个“客户机”EJB,它调用4个AsynchronousEJBs,应该给它们5秒钟的运行时间。5秒钟后,“客户机”EJB从完成运行的Future对象收集就绪结果,并返回输出 我对客户端的“等待”有问题。我试图调用future.get(5,TimeUnit.ms) 有时,异步EJBs似乎会在超时后开始运行。 有正确的方法吗 1) 收集地图中的未来对象: Map<String, Future> futureMap = new HashMap<String, Future

我有一个“客户机”
EJB
,它调用4个
Asynchronous
EJB
s,应该给它们5秒钟的运行时间。5秒钟后,“客户机”EJB从完成运行的
Future
对象收集就绪结果,并返回输出

我对客户端的“等待”有问题。我试图调用
future.get(5,TimeUnit.ms)
有时,异步
EJB
s似乎会在超时后开始运行。 有正确的方法吗

1) 收集
地图中的
未来
对象

    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;

谢谢

我认为您的客户不应该知道异步代码是否仍然需要调度,或者是否已经运行了5秒钟

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

如果希望将实际执行时间限制为5秒,唯一现实的方法是在执行代码的bean中执行

p、 美国

与您的问题无关,但为什么要对超时进行这种奇怪的计算?你现在做“现在+5秒-现在”,也就是5秒


而且,如果您在映射上迭代并且需要值和键,那么您可以在entrySet上迭代,而不是在键集上迭代,然后对每个键执行
get()

我的客户机不希望等待长时间执行。这并不意味着它不应该等待没有开始执行的服务。我调用future.get(timeout),并等待超时的一部分。下次计算超时时,我将有更少的时间(我检查还有多少时间运行)>它不应该等待没有开始执行的服务。-这一点仍然很难理解。为什么业务代码等待调度、等待DB结果还是等待CPU通过某个循环对客户端很重要?使用
get(timeOut,TimeUnit)
您只是在等待组合时间,不是吗?它是一个等待客户的平台。如果客户不在,平台将不会永远等待他们。如果他们启动缓慢,平台希望得到响应。
    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;
}