我使用亚马逊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