0

我正在使用 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 方式运行引起的问题吗?

4

1 回答 1

0

您包装阻塞调用的方式是正确的,这不会导致问题(但可能是第 3 方客户端库导致问题)。关于 S3 通信,我推荐使用非阻塞/异步 api,例如jclouds有异步操作(然后你需要将 java Future 转换为 play Promise),或者尝试只使用 play 的 WS。

于 2013-05-02T11:52:08.517 回答