Spring @Async with Future

时间:2013-04-30 14:07:33

标签: java spring asynchronous future

我是java.util.concurrent.Future的新手并且有一些问题。如果我使用Future调用服务,我如何知道用于调用服务的元素?

以下是一个例子:

  1. 对于每个id,我使用java.util.concurrent.Future来调用服务来填充一些额外的数据。

    Collection< Future< ObjectX>> future = new ArrayList< Future< ObjectX>>();  
    

    编辑###

     List< ObjectY> serviceResult= new ArrayList< ObjectY>();
    
    for (ObjectX obj: ids) 
     {  
       future.add(getAsyncInfo(obj);
     }
    
    //Because I have a lot of ids i need to call the service @async
    @Async
    public  Future< ObjectY> getAsyncInfo(ObjectX obj){
    
    return new AsyncResult<ObjectY>(callService(obj));
        ...
     }
    
  2. 获得回复

    for (Future<ObjectY> futureResult : future) 
        {               
            serviceResult.add(futureResult.get());
        }
    

    在这个阶段我有一个结果列表,我不知道什么结果属于id

         ids.get(0).setResult(serviceResult.get(0))????
         ids.get(0).setResult(serviceResult.get(1))????
         ids.get(0).setResult(serviceResult.get(2))????
         ...
    

    谢谢!

2 个答案:

答案 0 :(得分:2)

我会这样做

class MyResult extends AsyncResult<Object> {
    Object id;
    public MyResult(Object id, Object res) {
        super(res);
        this.id = id;
    }
    public Object getId() {
        return id;
    }
}

@Async
public MyResult getAsyncInfo(Object id) {
    Object res = callService(id);
    return new MyResult(id, res);
}

现在你知道结果和身份。 Id和结果可以是任何类型

答案 1 :(得分:0)

你可以在这里做几件事。

  1. Collection Future代替Map代替Map<MyKey, Future<ObjectX>> Map的密钥应该是您可以使用的一些方法回到最初的ObjectX
  2. 让您的服务返回有关其返回值的一些信息,以帮助确定ID。
  3. 对于1,我在想这样的事情:

    //to kick off the tasks
    Map<ObjectX, Future<ObjectY>> futures = new HashMap<ObjectX, Future<ObjectY>>();
    for (ObjectX id: ids) 
    {  
        futures.put(id, getAsyncInfo(id));
    }
    
    //...some time later...
    
    //to fetch the results
    for(Map.Entry<ObjectX, Future<ObjectY>> entry : futures.entrySet())
    {
        final ObjectX id = entry.getKey();
        final Future<ObjectY> future = entry.getValue();
        final ObjectY objY = future.get();
        id.setResult(objY);
    }