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);
         }
     })

それで、それは以下のコードと同じですか?(サードパーティのクライアント ライブラリを介して 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

ブロッキング呼び出しをラップする方法は正しいです。これは問題の原因ではありません (ただし、サードパーティのクライアント ライブラリが問題を引き起こしている可能性があります)。S3 通信に関しては、非ブロッキング/非同期 API を使用することをお勧めします。たとえば、jcloudsには非同期操作があります (その後、Java Future を play Promise に変換する必要があります)。または、play の WS のみを使用してみてください。

于 2013-05-02T11:52:08.517 に答える