Java 消除或理解码头9和x27;s";IllegalStateException:HttpChannelOverHttp关闭后数据过多; 设置
我使用Java 消除或理解码头9和x27;s";IllegalStateException:HttpChannelOverHttp关闭后数据过多; 设置,java,jetty,jax-ws,embedded-jetty,Java,Jetty,Jax Ws,Embedded Jetty,我使用jaxws-maven插件v2.1生成一个web服务类。我还包括以下码头依赖项: org.eclipse.jetty.jetty服务器 org.eclipse.jetty.jetty-sevlet org.eclipse.jetty.jetty http-spi (所讨论的版本为9.2.10.v20150310,但除了了解其Jetty 9外,该问题还超出了Jetty的特定次要版本号) 使用以下代码,我可以成功发布服务: System.setProperty("com.sun.net.h
jaxws-maven插件
v2.1生成一个web服务类。我还包括以下码头依赖项:
org.eclipse.jetty.jetty服务器
org.eclipse.jetty.jetty-sevlet
org.eclipse.jetty.jetty http-spi
System.setProperty("com.sun.net.httpserver.HttpServerProvider",
"org.eclipse.jetty.http.spi.JettyHttpServerProvider");
final String url = "http://localhost/SlipperySoap";
final SlipperySoap service = new SlipperySoapImpl();
final Endpoint endpoint = Endpoint.publish(url, service);
问题
我经常从码头收到警告:
badMessage:java.lang.IllegalStateException:为关闭后数据过多HttpChannelOverHttp@38f120bc{r=1,a=IDLE,uri=-}
这些警告通常成批出现,如以下时间戳所示:
08:33:43.510 [pool-1-thread-4641] WARN : HttpParser: badMessage: ...
08:33:47.778 [pool-1-thread-4556] WARN : HttpParser: badMessage: ...
08:33:48.340 [pool-1-thread-4612] WARN : HttpParser: badMessage: ...
08:33:49.037 [pool-1-thread-4567] WARN : HttpParser: badMessage: ...
08:33:49.112 [pool-1-thread-4721] WARN : HttpParser: badMessage: ...
08:33:49.242 [pool-1-thread-4579] WARN : HttpParser: badMessage: ...
08:33:49.344 [pool-1-thread-4698] WARN : HttpParser: badMessage: ...
08:33:49.470 [pool-1-thread-4504] WARN : HttpParser: badMessage: ...
08:33:50.260 [pool-1-thread-4553] WARN : HttpParser: badMessage: ...
08:33:54.834 [pool-1-thread-4721] WARN : HttpParser: badMessage: ...
08:34:01.194 [pool-1-thread-4763] WARN : HttpParser: badMessage: ...
08:34:01.675 [pool-1-thread-4715] WARN : HttpParser: badMessage: ...
08:34:02.262 [pool-1-thread-4504] WARN : HttpParser: badMessage: ...
08:34:02.880 [pool-1-thread-4699] WARN : HttpParser: badMessage: ...
08:34:05.530 [pool-1-thread-4570] WARN : HttpParser: badMessage: ...
08:34:09.634 [pool-1-thread-4570] WARN : HttpParser: badMessage: ...
08:34:10.081 [pool-1-thread-4504] WARN : HttpParser: badMessage: ...
08:34:10.298 [pool-1-thread-4738] WARN : HttpParser: badMessage: ...
08:34:13.508 [pool-1-thread-4688] WARN : HttpParser: badMessage: ...
08:34:23.360 [pool-1-thread-4755] WARN : HttpParser: badMessage: ...
08:34:23.557 [pool-1-thread-4717] WARN : HttpParser: badMessage: ...
我试图了解这是否是一个合法的问题,导致我错过了这些请求的处理,或者这是一个可以被抑制和忽略的良性警告
如果这是一个合法的问题,我是否可以在服务器端采取任何措施来消除它(或者这是一个行为错误的客户端的问题?)
注意:我无法控制连接到此web服务的客户端。因此,任何解决方案都必须在服务器端生效
已经探索的途径
堆栈溢出
这里有一个堆栈溢出帖子,但是答案都是低质量的,并且没有试图理解核心问题。我试图改变Jetty默认的缓冲区大小,但这并没有缓解问题(这并不让我感到惊讶)
谷歌集团
A建议:
这只是一个警告,应该可以。IIRC强制关闭连接时会发生这种情况
这并没有提供足够的细节让我确信这是一条良性消息——缓冲区中的数据被丢弃而不是被处理,所以我需要了解造成这种情况的原因。为什么另一端发送请求,然后在读取响应之前关闭连接?这个消息还有其他解释吗
码头源
报告说:
/**
* Parse until next Event.
* @return True if an {@link RequestHandler} method was called and it returned true;
*/
public boolean parseNext(ByteBuffer buffer)
{
...
// handle end states
if (_state==State.END)
{
// eat white space
while (buffer.remaining()>0 && buffer.get(buffer.position())<=HttpTokens.SPACE)
buffer.get();
}
else if (_state==State.CLOSED)
{
if (BufferUtil.hasContent(buffer))
{
// Just ignore data when closed
_headerBytes+=buffer.remaining();
BufferUtil.clear(buffer);
if (_maxHeaderBytes>0 && _headerBytes>_maxHeaderBytes)
{
// Don't want to waste time reading data of a closed request
throw new IllegalStateException("too much data after closed");
}
}
}
...
/**
*解析直到下一个事件。
*@return True,如果调用了{@link RequestHandler}方法并返回True;
*/
公共布尔parseNext(ByteBuffer缓冲区)
{
...
//句柄结束状态
如果(_state==state.END)
{
//吃空白
而(buffer.remaining()>0&&buffer.get(buffer.position())0&&u headerBytes>\u maxHeaderBytes)
{
//不想浪费时间读取已关闭请求的数据
抛出新的非法状态异常(“关闭后数据过多”);
}
}
}
...
这再次提出了一个问题,为什么在国家进入关闭状态后,仍有数据需要处理。这是在关闭TCP连接之前未等待读取响应的行为异常客户端的签名吗?这是发出请求的客户端的结果,http行为意味着交换(请求和/或响应)应关闭连接(请求标头启动或服务器标头启动),但客户端仍在请求后发送内容(其标题和正文内容) 最常见的场景:一个写得不好的客户机,它期望连接是持久的,但不遵循http规范并查看指示连接状态的头,然后继续发出另一个请求
另一种常见的情况是:写得不好的客户机发送请求头和(可选)请求正文,但也会发送一些额外的字节超过请求正文。这将被解释为需要处理的另一个请求,但初始交换关闭了连接,这使得对这些额外字节的解析抛出了“关闭后数据过多”的警告因此,从服务器端的角度来看,我们可以做些什么来优雅地抑制该异常?