在他們開始使用CompletionStage
作爲控制器的返回類型將被用於異步執行,或者簡而言之PlayFramework的最新版本,如果返回CompletionStage
是異步執行...PlayFramework定製執行人
現在,當我們知道我們提交給CF
的工作是長時間運行的IO
操作時,我們需要傳遞一個自定義執行程序(否則它將默認在FJP
上執行)。
每個控制器執行有HTTP
背景下,其在它所有的請求信息也這種情況下必須有你的EntityManagers
如果使用JPA
...
如果我們只是創建自定義ExecutorService
和它注入我們的控制器使用supplyAsync()
我們不會擁有所有的上下文信息。
下面是一些控制器動作返回CompletionStage
return supplyAsync(() -> {
doSomeWork();
}, executors.io); // this is a custom CachedThreadPool with daemon thread factory
}
,並在,如果我們試圖在doSomeWork()
Request request = request(); // getting request using Controller.request()
或使用運行像這樣preinjected JPAAPI jpa
領域爲例控制器
jpa.withTransaction(
() -> jpa.em() // we will get an exception here although we are wrapped in a transaction
...
);
例外像
No EntityManager bound to this thread. Try wrapping this call in JPAApi.withTransaction, or ensure that the HTTP context is setup on this thread.
正如你所看到的JPA代碼被包裹在交易,但發現沒有上下文,因爲這是的是定製純java線程池。
使用CompletableFuture和自定義執行程序時,提供所有上下文信息的正確方法是什麼?
我也試圖定義在application.conf
定製的執行者和演員系統查找他們,但我最終將不得不MessageDispatcher
這雖然是ExecutorService
支持不符合CompletableFuture
(兼容或許我錯了嗎?如果是的話如何使用它?使用CF)