我使用亞馬遜S3上傳照片作爲我的服務。 根據http://www.playframework.com/documentation/2.1.1/ThreadPools,代碼必須是阻止代碼。在播放框架中異步執行代碼塊的問題
「當您的代碼可能阻止時: 通過第三方客戶端庫(即不使用Play的異步WS API)使用REST/WebService API」。
「請注意,您可能會試圖將您的封鎖代碼封裝在Futures中,這並不會阻止它,它只是意味着阻塞將會發生在另一個線程中,您仍然需要確保線程池你在那裏使用了足夠的線程來處理阻塞。「
但現在我的代碼是:
return async(
future(new Callable<String>() {
public String call() {
return OP.upload(Req, name); //upload phoho with s3
}
}).map(new F.Function<String,Result>() {
public Result apply(String i) {
return ok(i);
}
})
那麼,這等於下面的代碼? (因爲我通過第三方客戶端庫使用WebService API)
return OP.upload(Req, name);
如果我仍然使用異步方法,是否會有任何問題?
我問,因爲我的服務器已經粉碎了一些時間。 轉儲信息是:
"application-akka.actor.default-dispatcher-231" prio=10 tid=0x00007fc994101000 nid=0x5964 waiting for monitor entry [0x00007fc9f6608000]
java.lang.Thread.State: BLOCKED (on object monitor)
at java.util.jar.Attributes.read(Attributes.java:394)
at java.util.jar.Manifest.read(Manifest.java:199)
at java.util.jar.Manifest.<init>(Manifest.java:69)
at java.util.jar.JarFile.getManifestFromReference(JarFile.java:182)
at java.util.jar.JarFile.getManifest(JarFile.java:163)
at sun.misc.URLClassPath$JarLoader$2.getManifest(URLClassPath.java:710)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:238)
at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
- locked <0x0000000715dd6038> (a sun.misc.Launcher$AppClassLoader)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
- locked <0x0000000715dd6038> (a sun.misc.Launcher$AppClassLoader)
...
我們可以看到,資源< 0x0000000715dd6038>被鎖定。同時,所有其他線程都在等待這個資源。然後系統陷入困境。由於強制阻塞代碼按照方式運行而導致問題的產生?
是不是隻使用返回OP.upload(Req,name)而不是異步?如果我仍然使用amazons3的第三個庫。 – 2013-05-03 10:05:44
不,最好用未來提供的異步包裝它,正如您提到的頁面(ThreadPools)所記錄的那樣。如果您不使用future + async,則必須重新配置默認線程池。 – MartinGrotzke 2013-05-04 22:02:50