Thanks Michael,

Interesting idea piping to itself. I'll keep it in mind when I revisit this 
part of the code.

Regards,

On Tuesday, October 7, 2014 3:45:05 PM UTC-7, Michael Frank wrote:
>
>  Can i suggest an alternative?  Why not use actors to model this 
> computation?
>
> For example, you could have a class ProcessAssetsActor.  The class has a 
> Map<Long,Future> called assetFutures, and a List<Asset> called assets 
> containing the received assets.  In the preStart() method, you create a 
> future to get the asset ids and pipeTo(self).  in your receive loop, you 
> wait for the initial list of asset ids.  once that is received, you create 
> a future (again using pipeTo(self)) to get the asset for each assetId, and 
> put each assetId and future in assetFutures.  as each Asset is received in 
> the receive loop, remove the reference from assetFutures and add the Asset 
> to assets.  when assetFutures is empty, you are done computing.  passing 
> the result back to the client can be done a few ways; you could for example 
> have the ProcessAssetsActor send the result to the parent automatically, or 
> you could have the parent actor send a query message to the 
> ProcessAssetsActor (using ask() or tell()) and wait for a response message.
>
> This probably seems like a lot of extra work, but i like this pattern for 
> a couple reasons:
>
> 1) by using actors you have access to much better error handling.
> 2) as your business requirements change, it is easier to modify your 
> business logic in an actor than in a chain of futures.
>
> -Michael
>
> On 10/07/14 13:51, Joe Wong wrote:
>  
> Hi, 
>
>  I have the following events that I'm trying to put into a non blocking 
> way. The events are as follows
>
>  1. database call to get list of asset ids.
> 2. create a list of futures to get assets (getting assets can take a while 
> and are independent of one another)
> 3. process all the assets and return a Result.
>
>  What I have is the following 
>
>     public Future<Result> buildFuture(){ 
>   //Blocking DB call
>     Collection<Long> assetIds = assetDao.getAssetIds();
>     
>     Collection<Future<Asset>> assetFutures = new 
> ArrayList<>(assetIds.size());
>
>         for (Long assetId : assetIds) {
>        assetFutures.add(createFutureAsset(assetId, executionContext));
>     }
>
>      Future<Collection<Asset>> futureAssets = 
> sequence((Iterable)assetFutures, executionContext);
>
>     //once we have all Assets process them and return result
>     Future<Result> futureResult = futureAssets.map(
>         new Mapper<Collection<Asset>, Result>() {
>
>            @Override
>           public Result apply(Collection<Asset> assets) {
>             //do something with the assets
>             return new Result("done");
>           }
>         },
>         executionContext
>       );
>
>     return futureResult;
>  }
>  
>  What I'm trying to get my head around is how to wrap all 3 events into 
> one Future<Result>.  Any ideas? Thanks in advance
>  
>  Regards
>
>  -- 
> >>>>>>>>>> Read the docs: http://akka.io/docs/
> >>>>>>>>>> Check the FAQ: 
> http://doc.akka.io/docs/akka/current/additional/faq.html
> >>>>>>>>>> Search the archives: https://groups.google.com/group/akka-user
> --- 
> You received this message because you are subscribed to the Google Groups 
> "Akka User List" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to [email protected] <javascript:>.
> To post to this group, send email to [email protected] 
> <javascript:>.
> Visit this group at http://groups.google.com/group/akka-user.
> For more options, visit https://groups.google.com/d/optout.
>
>
>  

-- 
>>>>>>>>>>      Read the docs: http://akka.io/docs/
>>>>>>>>>>      Check the FAQ: 
>>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>>      Search the archives: https://groups.google.com/group/akka-user
--- 
You received this message because you are subscribed to the Google Groups "Akka 
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to