2011-05-19 179 views
2

HI,java.nio.channels.ClosedChannelException - 客户端关闭SSL

我glassfish3.1服务器上运行一个机器上的web服务。

在第二台机器上,我有一个java(GUI)应用程序,正在运行并调用上述Web服务。

在我的web服务调用中,我发送一个文件作为SOAP附件。它到达服务器,然后处理文件,然后通过https返回到我的客户机。

如果我的文件过大,时间超过15分钟时,操作失败,并且我收到以下错误:

在客户端: 无法因异常创建SOAP消息:org.jvnet .mimepull.MIMEParsingException:javax.net.ssl.SSLException:SSL同行关闭错误

在服务器端: javax.servlet.ServletException 在org.glassfish.webservices.JAXWSServlet.doPost(JAXWSServlet.java: 150) at javax.servlet.http.H ttpServlet.service(HttpServlet.java:755) at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardPipeline。 doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326) at org.apache.catalina.connector.CoyoteAdapter。服务(CoyoteAdapter.java:227) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java: 822) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013) at com.sun.grizzly。 http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 在com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 在com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 在com.sun.grizzly.http.HttpProtocolChain.execute( HttpProtocolChain.java:79) 在com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 在com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 在com.sun.grizzly。 ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool。 java:513) at java.lang.Thread.run(Thread.java:662) 导致:javax.xml.ws.WebServiceException:com.ctc.wstx.exc.WstxIOException:java.nio.channels。ClosedChannelException at com.sun.xml.ws.encoding.MtomCodec.encode(MtomCodec.java:184) at com.sun.xml.ws.encoding.SOAPBindingCodec.encode(SOAPBindingCodec.java:282) at com.sun .xml.ws.transport.http.HttpAdapter.encodePacket(HttpAdapter.java:400) at com.sun.xml.ws.transport.http.HttpAdapter.access $ 100(HttpAdapter.java:96) at com.sun。 xml.ws.transport.http.HttpAdapter $ HttpToolkit.handle(HttpAdapter.java:618) at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:259) at com.sun。 xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:162) at org.glassfish.webservices.JAXWSServlet.doPost(JAXWSServlet.java:145) ... 27更多 导致b y:com.ctc.wstx.exc.WstxIOException:java.nio.channels.ClosedChannelException at com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:313) at com.sun.xml.ws.util .xml.XMLStreamWriterFilter.flush(XMLStreamWriterFilter.java:71) at com.sun.xml.ws.streaming.XMLStreamWriterUtil.getOutputStream(XMLStreamWriterUtil.java:101) at com.sun.xml.ws.message.jaxb.JAXBMe​​ssage .writePayloadTo(JAXBMe​​ssage.java:320) at com.sun.xml.ws.message.AbstractMessageImpl.writeTo(AbstractMessageImpl.java:147) at com.sun.xml.ws.encoding.MtomCodec.encode(MtomCodec.java :168) ... 34更多 引起:org.apache.catalina.connector.ClientAbortException:java.nio.channels.ClosedChannelException at org.apache.catalina.co (org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:351) at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:输出缓冲区。 175) at com.ctc.wstx.io.UTF8Writer.flush(UTF8Writer.java:99) at com.ctc.wstx.sw.BufferingXmlWriter.flush(BufferingXmlWriter.java:214) at com.ctc.wstx。在sun.nio.ch.SocketChannelImpl.ensureWriteOpen(SocketChannelImpl.java:133) 在太阳java.nio.channels.ClosedChannelException :sw.BaseStreamWriter.flush(BaseStreamWriter.java:311) ...... 39多个 引起.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:324) at com.sun.grizzly.util.OutputWriter.flushCh annel在(OutputWriter.java:108) 在com.sun.grizzly.util.OutputWriter.flushChannel(OutputWriter.java:76) 在com.sun.grizzly.util.SSLOutputWriter.flushChannel(SSLOutputWriter.java:102) com.sun.grizzly.ssl.SSLOutputBuffer.flushChannel(SSLOutputBuffer.java:138) 在com.sun.grizzly.http.SocketChannelOutputBuffer.flushBuffer(SocketChannelOutputBuffer.java:398) 在com.sun.grizzly.http.SocketChannelOutputBuffer。 flush(SocketChannelOutputBuffer.java:376) at com.sun.grizzly.http.ProcessorTask.action(ProcessorTask.java:1241) at com.sun.grizzly.ssl.SSLProcessorTask.action(SSLProcessorTask.java:164) at com.un.grizzly.tcp.Response.action(Response.java:268) at org.apache.catalina.connector.OutputBuffe r.doFlush(输出

...

我认为SSL会话超时我的客户端,而不是在服务器端。

现在我试图找出一种方法来增加我的客户端,我想是15分钟的SSL超时...

我不能这样做,任何帮助将appriciated .. 。 谢谢

+0

什么意思是SSL“会话”?这可能只是一个连接超时。你在客户端上用什么来提出请求? – Taylor 2011-05-19 17:06:13

+0

我发现当尝试发送或接收SOAP消息太大时,会出现类似的错误(带和不带SSL)。除了削减我的要求之外,我从来没有真正得到过满意的解决方案。 – 2011-05-19 17:44:25

+0

误导性标题。这里没有关于客户端关闭SSL的证据。其实它抱怨对方这样做不正确。 – EJP 2011-05-20 23:34:20

回答

-1

打开你的域名。xml并尝试找出您正在使用的SSL版本。 如果您看到如下所示的内容:[ssl3-enabled =“false”],那么它是默认超时时间为100秒的SSL2。

<ssl classname="com.sun.enterprise.security.ssl.GlassfishSSLImpl" ssl3-enabled="false" cert-nickname="s1as"></ssl> 

在这种情况下 要么你可以把一些更大的价值SSL会话超时属性[你可能需要添加这种]

,或者你可以选择使用SSL3通过SSL其中默认情况下超时值较大。

价:http://download.oracle.com/docs/cd/E19798-01/821-1753/abhaq/index.html

+0

与此无关。这是SSL *会话*超时,而不是连接或读取超时。这意味着如果SSL会话大于100秒(令人惊叹的值),则SSL会话无法恢复。 – EJP 2011-05-20 03:45:25

+0

@Pushkar由于客户端说“SSL对端关闭不正确”[注意术语peer],所以问题出现在服务器端 – 2011-05-20 16:48:55

+0

,但不是SSL会话问题。 SSL会话超时不会关闭频道。 – EJP 2011-05-20 23:13:58

0

I think that SSL session is timed out on my client side

号你的客户端遇到不首先从所述服务器接收的SSL close_notify消息闭合(重置)连接。所以它不是客户。我猜测服务器会强加一个POST大小限制,并在超过它时关闭连接。

如果您发送的数据太多,您将在某处或某处遇到IOException。要么服从极限,要么提高,要服从新的价值。

+0

由于客户端正在说“SSL对端关闭不正确”[注意术语peer],所以问题出现在服务器端。其次,防火墙对像SSL,TLS这样的隧道连接没有直接影响,这就是为什么它们是安全的。防火墙不具备拦截SSL和/或TLS封装数据包[HTTPS,SFTP等]的能力,因此如何获得HTTP-POST大小的知识? – 2011-05-20 16:49:10

+0

@Puspendu Banerjee防火墙当然有这种能力。这就是它的目的。 SSL或不SSL。我没有透露有关拦截数据包的事情。它所要做的就是发送一个TCP RST。它不必查看内容长度,它可以查看IP标题中的数据包大小以及TCP标题中的段大小。从客户端的角度来看,如果防火墙或路由器断开连接,它与对等设备一样。然而,服务器似乎正在关闭自己的连接出于某种原因,可能是看传出的响应大小? – EJP 2011-05-23 04:31:49