qua*_*tum 0 java csv asynchronous playframework-2.0
我正在研究使用Play的异步功能来执行可并行化的任务,但是从我能够找到的所有文档,书籍和文章中,我无法弄清楚如何知道异步任务已经完成,所以也许我误解了一个关键的部分信息或使用错误的工具.
基本上,我需要从许多平面CSV构建一个分层对象图,结果是,读取这些CSV可以并行完成.但是,当我正在阅读CSV时,我正在以块的形式进行操作,我需要每个"工作人员"(处理CSV)停止,记住他们在CSV中的位置Result并向协调员报告,以便当所有工作人员报告时回到他们的块,我知道我已经完全处理了分层对象,并且可以使用它做其他事情,同时让工作人员继续,直到他们每个人已经到达他们一直在阅读的CSV的末尾.
有没有办法知道一个Promise已被转换为Result?我是否需要轮询Promise或者我能否以类似于Java的方式查询它ExecutorService.isDone()?您会建议哪些文档 - 似乎Play Framework上的所有书籍都快速死亡,因为API在次要版本之间快速变化(例如Akka.future()- > Promise.promise()或Promise.waitAll()- > Promise.sequence()等)
虽然你可以promise.get(timeout)用来等待承诺,但这不是推荐的方式.
使用它的更好方法是将其映射到另一个承诺,使用'map'方法进行另一个处理:
Promise<String> strPromise = Promise.pure("10");
Promise<Integer> intPromise = strPromise.map(new Function<String, Integer>() {
@Override
public Integer apply(String arg0) throws Throwable {
return Integer.valueOf(arg0);
}
});
Run Code Online (Sandbox Code Playgroud)
map函数有两种类型,一种是输入值,它是'strPromise'promise(String)的值,另一种是输出,它将是新promise(Integer)的值.
如果且仅当promise成功完成时才会调用map函数.因此'intPromise'将保持成功价值或失败.
如果您需要返回Response,那么您应该使用Play Async.最后的承诺应该是结果,游戏将照顾它.
如果您需要对承诺执行其他操作,那么(出于任何原因)不应该在另一个承诺中,您可以听取onRedeem的成功和onFailure的错误:
intPromise.onRedeem(new Callback<Integer>() {
@Override
public void invoke(Integer arg0) throws Throwable {
System.out.println("Promiss redeemed: " + arg0);
}
});
intPromise.onFailure(new Callback<Throwable>() {
@Override
public void invoke(Throwable arg0) throws Throwable {
System.out.println(arg0);
}
});
Run Code Online (Sandbox Code Playgroud)
请注意,如果您使用的是Java 8,则可以使用lambdas使其更具可读性.
| 归档时间: |
|
| 查看次数: |
2262 次 |
| 最近记录: |