2016-12-06 3 views
1

JAVA FX Webビューで実行されているjavasriptがあります。私はエンドポイントにアヤックスコールをしています。 xhttp3.open("POST", "http://testurl", false);すべてが期待どおりに動作する場合JAVAFX Ajax呼び出しがasynchがtrueに設定されていると、リクエスト本体に散発的に追加できない

var formData3 = new FormData(); 

var content = veryLargeJSONString; 

formData3.append("userfile", content); 
xhttp3.open("POST", "http://testurl", true); 
xhttp3.setRequestHeader("cache-control", "no-cache"); 
xhttp3.send(formData); 

は、応答は常にそれが原因フォームデータのサイズが大きいために長い時間を要するにもかかわらず返します。

asynchフラグがtrueに設定されている場合、JFXでは次の例外が発生するため、応答は送信されません。もちろん

PM com.sun.webkit.network.URLLoader doRun 
WARNING: Unexpected error 
java.io.IOException: Error writing request body to server 
    at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.checkError(HttpURLConnection.java:3479) 
    at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.write(HttpURLConnection.java:3462) 
    at com.sun.webkit.network.URLLoader.sendRequest(URLLoader.java:373) 
    at com.sun.webkit.network.URLLoader.doRun(URLLoader.java:162) 
    at com.sun.webkit.network.URLLoader.lambda$run$91(URLLoader.java:128) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.webkit.network.URLLoader.run(URLLoader.java:127) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

これはのみformDataコンテンツが非常に大きい場合、別の小さな内容とまったく同じ呼び出しは何の問題を持っていないが発生します。

私はこれがJVMを起動する方法と関係していると思っていたので、開始ヒープサイズと最大ヒープサイズを増やしてみました。

java -jar test.jar -Xms4096m -Xmx8192m 

ので最初の質問は、このJavaの例外を発生させ、なぜ非同期はAJAX呼び出しのためにtrueに設定されている場合、それが唯一発生しないことができるもの、です。

第2私のjava -jarの起動時にparamsを起動すると、私のシステムよりも多くのスタートアップヒープを割り当てることができますか?だから私は16ギガのRAMを持っていると私は13のギグを使用しているし、私は私のJavaアプリケーションを起動し、起動ヒープ4ギガの割り当てを試みる、それはちょうど私の起動パラメータを無視するのだろうか?

+0

jre-8u111とJava 8の以前のバージョンの間にはっきりとこの問題は修正されました。私はそれがいつパッチが当てられたかを正確に見て、私が見つけたら答えをさらに調べます。 –

答えて

2

このJava例外を引き起こす原因は何か、なぜAsynchがajax呼び出しでtrueに設定されている場合にのみ発生しますか?

これはWebViewのバグのようです。 http://bugreport.java.comに報告してください。

原因は何かわかりません。しかし、非同期処理の場合にのみ発生するので、私はWebViewコードで同時実行の実装の問題であると考えています。

提案回避策

  1. は、Java並行処理ユーティリティやサードパーティのライブラリを使用して、AJAX呼び出しを行うためにサードパーティのライブラリを使用します。

  2. 確認します必要に応じてPlatform.runLaterを使用して、 yncの応答。

  3. 2の間に必要なすべてのデータを転送するためのWebViewとJavaコードで実行されているJavaScriptの間で使用通信:

追加の質問への回答

私はJVMを起動していたので、開始ヒープサイズと最大ヒープサイズを増やしてみました。

java -jar test.jar -Xms4096m -Xmx8192m 

4メモリのライブは、ロッタメモリです。 8ギグはもっともっとです。ここではメモリに関する問題はないと思っています。起動時にアプリケーションにあまりにも多くのメモリを割り当てる必要はほとんどありません。

私はRAMの16回のギグを持っていると私は13回のギグを使用しているそうだとすれば、私は私のJavaアプリを起動し、起動ヒープのための4本のライブを割り当てようと、それはちょうど私のスタートアップパラメータを無視しますか?

いいえ、それはあなたの開始パラメータを尊重します。 JVMはあなたが要求した最小値(4ギガ)を割り当てます。あなたのアプリが実際に4つ以上のギグを使用する可能性は低いので、おそらく4ギグ以上のメモリを使用することはありません。あなたのアプリが使用可能な物理ラムサイズ(OSやその他のプログラムで16ギガ以下のスペース)を超えて使用する場合は、すべてが動作しますが、アプリのメモリとしてOS pagesのようにゆっくりと動きます。

+0

これはなぜ、これが時間の50%だけで、大きなjson文字列でのみ起こっているのだろうか?小さな文字列(必要に応じて特定のサイズのしきい値を見つけることができます)では、この問題はまったく発生しません。 –

+0

私の答えに述べたように、私はあなたの問題の原因を知りません。 WebViewの問題ではなく、ネットワーク接続またはサーバーの設定に問題がある可能性があります。 WebViewの基盤となるネットワーキングは、標準のJava [HttpUrlConnection](https://docs.oracle.com/javase/8/docs/api/java/net/HttpURLConnection.html)を使用しています。 Java 1.1以降、Ajax呼び出しの全体処理の一部に過ぎません。 Wiresharkなどのツールは、ネットワーク接続の問題をデバッグするのに役立つことがありますが、それにはある程度のスキルが必要です。 – jewelsea

関連する問題