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 で実行することによって引き起こされていますか?