2013-05-02 77 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