我正在使用 amazon s3 上传照片作为我的服务。根据http://www.playframework.com/documentation/2.1.1/ThreadPools,代码必须是阻塞代码。
“当您的代码可能阻塞时包括:通过第三方客户端库使用 REST/WebService API(即,不使用 Play 的异步 WS 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);
}
})
那么它是否等于下面的代码?(因为我通过第 3 方客户端库使用 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> 被锁定。同时,所有其他线程都在等待这个资源。然后系统卡住了。是强制阻塞代码以 ascy 方式运行引起的问题吗?