2013-05-02 126 views
0

我使用亞馬遜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>被鎖定。同時,所有其他線程都在等待這個資源。然後系統陷入困境。由於強制阻塞代碼按照方式運行而導致問題的產生?

回答

0

你包裝阻塞呼叫的方式是正確的,這不會導致問題(但也許第三方客戶端庫導致問題)。 關於S3通信,我推薦使用非阻塞/異步API,例如, jclouds具有異步操作(然後您需要將Java Future轉換爲播放Promise),或嘗試僅使用play的WS。

+0

是不是隻使用返回OP.upload(Req,name)而不是異步?如果我仍然使用amazons3的第三個庫。 – 2013-05-03 10:05:44

+0

不,最好用未來提供的異步包裝它,正如您提到的頁面(ThreadPools)所記錄的那樣。如果您不使用future + async,則必須重新配置默認線程池。 – MartinGrotzke 2013-05-04 22:02:50