- PR -

AXISで「java.io.IOException: Broken pipe」が発生する

1
投稿者投稿内容
タカチ
会議室デビュー日: 2005/04/11
投稿数: 1
投稿日時: 2005-04-11 11:33
SOAPによるクライアント⇔サーバ間の通信において、以下の現象
で悩んでおります。

<現象>
クライアントが特定のSOAPメッセージを受信すると、サーバ側の
Webサーバ(Apache)のアクセスログに、下記のエラーが出力される。
--------------------------------------------------------------------
[dd/Apr/yyyy:hh:mm:ss +0900] "POST /test/TestService HTTP/1.0" 500 0
--------------------------------------------------------------------

本現象が発生するまでの流れです。

@ クライアントがSOAPメッセージを送信(リクエスト)
A @を受信したサーバがSOAPメッセージを返信(レスポンス)
B クライアントがAのSOAPメッセージを受信
C クライアントがAのSOAPメッセージを解析⇒UTFDataFormatException発生
D クライアントがサーバとのコネクションを強制切断
E サーバがSOAPレスポンスを再送信(想定する応答が得られないため?)
F サーバ側でIOException:Broken pipe が発生(既にコネクションが切断されているため?)
G Apacheのaccess_logにエラー500を出力

CですがこれはXMLのパーサを、Axisに付属のパーサ(xerces.jar)に切り替えることで
エラーは発生しなくなりました。
#結果的には、この対処で本現象は発生しなくなる。

気になっているのはD、Eです。
Dですが、SOAPクライアントは、WSDL2Javaにより、WSDLから自動生成しています。
今回のように、受信したSOAPメッセージの解析段階で例外が発生した場合、コネクション
を強制切断をしているが、これはAxisの仕様なのか。

最後にEですが、クライアント側がコネクションを強制切断した後、SOAPメッセージ
を再送信しているが、これもAxisの仕様なのか。

本現象につきまして、対処方又は詳細情報をお持ちの方いらっしゃいましたら
ご教授頂けますでしょうか。

<動作環境>
【クライアント】
OS:Windows XP
Webサーバ:Tomcat-5.0
SOAPコンテナ:Axis-1_1
Java:1.3.1_10
XMLパーサ:xercesImpl.jar・xmlParserAPIs.jar
※XMLパーサはjakarta-tomcat-5.0に付属

【サーバ】
OS:Solaris
Webサーバ:apache-1.3.33+Tomcat-4.0.4(mod_jk2)
SOAPコンテナ:Axis-1_1
Java:1.3.1_04

以下、詳細情報です。
CでSOAPメッセージの解析に失敗した際の、クライアント側例外
-----------------------------------------------------------------------
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.
userException
faultSubcode:
faultString: java.io.UTFDataFormatException: Expected byte 3 of 3-byte
UTF-8 sequence.
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace: java.io.
UTFDataFormatException: Expected byte 3 of 3-byte UTF-8 sequence.
at org.apache.xerces.impl.io.UTF8Reader.expectedByte(Unknown Source)
at org.apache.xerces.impl.io.UTF8Reader.read(Unknown Source)
at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)
at org.apache.xerces.impl.XMLEntityScanner.scanContent(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanContent(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at org.apache.axis.encoding.DeserializationContextImpl.parse(DeserializationContextImpl.java:242)
at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:538)
at org.apache.axis.Message.getSOAPEnvelope(Message.java:376)
at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:675)
at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:128)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:71)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:150)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:120)
at org.apache.axis.client.AxisClient.invoke(AxisClient.java:180)
at org.apache.axis.client.Call.invokeEngine(Call.java:2564)
at org.apache.axis.client.Call.invoke(Call.java:2553)
at org.apache.axis.client.Call.invoke(Call.java:2248)
at org.apache.axis.client.Call.invoke(Call.java:2171)
at org.apache.axis.client.Call.invoke(Call.java:1691)
-----------------------------------------------------------------------


Eで「IOException:Broken pipe」が発生した際の例外
-----------------------------------------------------------------------
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.io.IOException: Broken pipe
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace: java.io.IOException: Broken pipe
at java.net.SocketOutputStream.socketWrite(Native Method)
at java.net.SocketOutputStream.write(SocketOutputStream.java:91)
at org.apache.ajp.Ajp13.send(Ajp13.java:525)
at org.apache.ajp.RequestHandler.doWrite(RequestHandler.java:520)
at org.apache.ajp.Ajp13.doWrite(Ajp13.java:399)
at org.apache.ajp.tomcat4.Ajp13OutputStream.write(Ajp13OutputStream.java:79)
at org.apache.catalina.connector.ResponseBase.flushBuffer(ResponseBase.java:674)
at org.apache.catalina.connector.HttpResponseBase.flushBuffer(HttpResponseBase.java:764)
at org.apache.catalina.connector.ResponseBase.write(ResponseBase.java:647)
at org.apache.catalina.connector.ResponseBase.write(ResponseBase.java:652)
at org.apache.catalina.connector.ResponseStream.write(ResponseStream.java:312)
at org.apache.axis.attachments.DimeBodyPart.send(DimeBodyPart.java:314)
at org.apache.axis.attachments.DimeBodyPart.write(DimeBodyPart.java:258)
at org.apache.axis.attachments.DimeMultiPart.write(DimeMultiPart.java:85)
at org.apache.axis.attachments.AttachmentsImpl.writeContentToStream(AttachmentsImpl.java:518)
at org.apache.axis.Message.writeTo(Message.java:447)
at org.apache.axis.transport.http.AxisServlet.sendResponse(AxisServlet.java:1018)
at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:895)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:760)
at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:339)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.ajp.tomcat4.Ajp13Processor.process(Ajp13Processor.java:458)
at org.apache.ajp.tomcat4.Ajp13Processor.run(Ajp13Processor.java:551)
at java.lang.Thread.run(Thread.java:479)
-----------------------------------------------------------------------
1

スキルアップ/キャリアアップ(JOB@IT)