Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 消除或理解码头9和x27;s";IllegalStateException:HttpChannelOverHttp关闭后数据过多; 设置_Java_Jetty_Jax Ws_Embedded Jetty - Fatal编程技术网

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
(所讨论的版本为9.2.10.v20150310,但除了了解其Jetty 9外,该问题还超出了Jetty的特定次要版本号)

使用以下代码,我可以成功发布服务:

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规范并查看指示连接状态的头,然后继续发出另一个请求


另一种常见的情况是:写得不好的客户机发送请求头和(可选)请求正文,但也会发送一些额外的字节超过请求正文。这将被解释为需要处理的另一个请求,但初始交换关闭了连接,这使得对这些额外字节的解析抛出了“关闭后数据过多”的警告

因此,从服务器端的角度来看,我们可以做些什么来优雅地抑制该异常?