【发布时间】:2014-04-27 11:12:00
【问题描述】:
我的应用程序使用 Play 框架来处理 REST 请求。我需要在 http 请求处理程序中执行一些可能持久的阻塞 I/O 操作。同时,我想有效地处理一些短暂的请求。
如此处所述:
http://www.playframework.com/documentation/2.2.0/JavaAsync
可以异步运行持久的操作。另一方面,如此处所述:
http://www.playframework.com/documentation/2.2.x/ThreadPools
Play 框架使用相同的默认线程池,所有应用程序代码都在其中执行。至少在 Java api 中不可能在不同的线程池上运行异步工作。
所以,我的问题是,考虑到这样的操作无论如何都使用相同的线程池这一事实,是否值得异步运行可能阻塞的 I/O 操作。或者也许最好增加默认线程池大小,并且在这种情况下不要使用异步 api? (这样至少代码可读性会高很多)
【问题讨论】:
-
在单独的线程池上运行持久的操作,或者为每个操作启动单独的线程。
-
@AlexeiKaigorodov:我愿意,但我在 Java api 中没有发现这种可能性。不过,我在 Scala api 中读到了这种可能性。但我现在正在使用 Java。
-
你没有找到如何通过java API启动线程或线程池?
-
:-) 不,我还没有找到如何使用本机 Play 框架 api 来做到这一点。我可以自己做 - 这是一种解决方案。但它需要有关 Play 本身的较低级别的知识,才能正确执行。并且可能与不同的 Play 助手不兼容,例如动作装饰器等
-
我不是 Play 专家,但我认为启动一个线程(池)不会有任何害处。但问题是,如何将长时间操作的结果传递回 Play 框架 - 应该使用一些异步机制,而不是在 Play 控制的线程上等待结果。
标签: java multithreading asynchronous playframework-2.0