求解:java.net.ProtocolException: Didn't meet stated Content-Length, wrote: '0' byt

本文记录了一种在WebLogic服务器正式环境中遇到的问题,即服务突然占用高CPU并出现特定异常的情况。异常主要涉及HTTP连接失败及Servlet输出内容长度不符预期等问题。此外,文中还提到了一个具体的Servlet(DownAdjunct)在处理文件下载请求时,执行线程长时间繁忙的现象。
在开发环境不出现上面的错误。但是在正式环境报这个错误。并在在出现这个错误之前,weblogic服务占用的CPU会变的很高,导致访问速度变的很慢。

下面是异常信息:
第一个异常:
<2011-6-10 下午03时06分52秒 CST> <Error> <HTTP> <BEA-101083> <Connection failure
.
java.net.ProtocolException: Didn't meet stated Content-Length, wrote: '0' bytes
instead of stated: '39936' bytes.
at weblogic.servlet.internal.ServletOutputStreamImpl.ensureContentLength
()V(Optimized Method)
at weblogic.servlet.internal.ServletResponseImpl.ensureContentLength()V(
Optimized Method)
at weblogic.servlet.internal.ServletResponseImpl.send()V(Optimized Metho
d)
at weblogic.servlet.internal.ServletRequestImpl.execute(Lweblogic.kernel
.ExecuteThread;)V(Optimized Method)
at weblogic.kernel.ExecuteThread.execute(Lweblogic.kernel.ExecuteRequest
;)V(Optimized Method)
at weblogic.kernel.ExecuteThread.run()V(ExecuteThread.java:178)
at java.lang.Thread.startThreadFromVM(Ljava.lang.Thread;)V(Unknown Sourc
e)
>
第二个异常:(/AAA/servlet/DownAdjunct下载附件的)
<2011-6-10 下午03时46分01秒 CST> <Error> <WebLogicServer> <BEA-000337> <ExecuteT
hread: '2' for queue: 'weblogic.kernel.Default' has been busy for "855" seconds
working on the request "Http Request: /AAA/servlet/DownAdjunct", which is m
ore than the configured time (StuckThreadMaxTime) of "600" seconds.>
Java 中,出现 `java.net.ProtocolException: Cannot write output after reading input` 异常的原因与 HTTP 请求的处理顺序有关。在用 POST 方式发送 URL 请求时,URL 请求参数的设定顺序非常关键,因为这是由 HTTP 请求的格式决定的。 HTTP 请求由两部分组成,即 HTTP 头和正文 content。`connect()` 函数会根据 `HttpURLConnection` 对象的配置值生成 HTTP 头部信息,所以在调用 `connect()` 函数之前,必须完成所有的配置。而正文内容是通过 `outputStream` 流写入的,`outputStream` 并非网络流,写入的内容先存于内存缓冲区,待其关闭时生成 HTTP 正文。 `HttpURLConnection` 的 `connect()` 函数只是建立与服务器的 TCP 连接,并未实际发送 HTTP 请求,HTTP 请求直到 `getInputStream()` 函数调用时才正式发出。按照正确顺序,对 `connection` 对象的配置要在 `connect()` 执行前完成,对 `outputStream` 的写操作要在 `inputStream` 的读操作之前。 如果 `inputStream` 读操作在 `outputStream` 的写操作之前,就会违反 HTTP 请求的格式要求,从而抛出 `java.net.ProtocolException: Cannot write output after reading input` 异常,因为在读取输入流时,HTTP 请求已经发送出去(包含 HTTP 头和正文),之后再对 `connection` 对象设置或写入 `outputStream` 是没有意义的,会导致异常发生[^1]。 ```java import java.io.IOException; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.Scanner; public class HttpExample { public static void main(String[] args) { try { URL url = new URL("http://example.com"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setDoOutput(true); // 错误示例:先读取输入流 Scanner scanner = new Scanner(connection.getInputStream()); while (scanner.hasNextLine()) { System.out.println(scanner.nextLine()); } // 再尝试写输出流,会抛出异常 OutputStream outputStream = connection.getOutputStream(); String postData = "param1=value1&param2=value2"; outputStream.write(postData.getBytes()); outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值