javascript - 当异步设置为 true 时,JAVAFX Ajax 调用偶尔无法添加到请求正文

标签 javascript java ajax javafx http-post

我有一个在 JAVA FX Web View 上运行的 javasript。我正在对端点进行 ajax 调用。

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

xhttp3.open("POST", "http://testurl", false); 一切都按预期工作时,响应总是返回,即使由于大文件需要很长时间表单数据的大小。

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 调用的 Asynch 设置为 true 时发生。

其次 如果在我的java -jar 启动参数中我尝试分配比我的系统可用的启动堆更多的启动堆,会发生什么情况?因此,如果我有 16 GB 的 RAM 而我正在使用 13 GB,然后我启动我的 Java 应用程序并尝试为起始堆分配 4 GB,它会忽略我的启动参数吗?

最佳答案

what could be causing this java exception and why does it only occur when Asynch is set to true for the ajax call.

这似乎是一个 WebView 错误。您不妨通过http://bugreport.java.com举报。 .

我不知道是什么原因造成的。但是,由于它只发生在异步处理中,我猜测这是 WebView 代码中的并发实现问题。

建议的解决方法

  1. 使用第 3 方库通过 Java 并发实用程序或第三方库进行 ajax 调用:

  2. 确保使用 Platform.runLater适本地处理异步响应。

  3. 使用在 WebView 中运行的 JavaScript 与您的 Java 代码之间的通信来传输两者之间所需的任何数据:

其他问题的答案

I was starting the JVM, and thus I tried increasing the starting heap size and also max heap size.

java -jar test.jar -Xms4096m -Xmx8192m

4 GB 的内存是很多内存。 8 场演出甚至更多。我认为您这里没有内存问题,您不太可能需要在启动时为您的应用程序分配这么多内存。

So if I have 16 gigs of RAM and i'm using 13 gigs and then I start my java app and try to allocate for the starting heap 4 gigs, will it just ignore my start up parameter?

不,它会尊重您的起始参数。 JVM 将分配您请求的最小值(4 gig)。您的应用程序实际使用的内存不太可能超过 4 GB,因此它可能不会使用超过 4 GB 的内存。如果您的应用程序确实使用了超过您可用的物理内存大小(操作系统和其他程序的空间减少了 16 GB),那么一切仍然可以正常工作,就像 OS pages 一样慢您的应用内存。

关于javascript - 当异步设置为 true 时,JAVAFX Ajax 调用偶尔无法添加到请求正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41003136/

相关文章:

javascript - 在 dom 中,html 元素和片段之间的功能区别是什么?

java - Java基础问题,java中的变量类型和方法类型

jquery - 如何使用 jquery each 函数获取值列表

javascript - 如何将带有ajax的select2添加到jquery查询生成器?

javascript - 警报开关 Jquery

javascript - 如何在ajax响应后重绘数据表

javascript - ant design Select组件如何设置border-radius

java - objective-C中的 'isa'变量是否等于Java中的 'instanceof'

java - 键绑定(bind)问题

javascript - 当我通过 ajax 使用跨域调用通用处理程序时,在 ajax 成功时数据未定义