Spring @Async与Future

4

我对java.util.concurrent.Future还不熟悉,有一些问题。如果我使用Future调用一个服务,我怎么知道是哪个元素调用了这个服务?

这里有一个例子:

  1. For each id I am using java.util.concurrent.Future to call a service to fill some extra data.

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

    Edit###

     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));
        ...
     }
    
获取响应
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个回答

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。Id和结果可以是任何类型。

0

这里有几件事情可以做。

  1. 将您的Future集合改为MapMap<MyKey, Future<ObjectX>>)。Map的键应该是一些可以用来映射回初始ObjectX的手段。
  2. 让您的服务返回一些关于其返回值的信息,以帮助确定id。

对于第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);
}

对不起,结果返回了一个不同类型的对象。 - user2095246
1或2是否有助于回答您的问题?最后一段只是我观察到的一些评论(由于问题编辑不再适用,因此已被删除)。 - nicholas.hauschild

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接