2016-05-12 6 views
4

Ich habe, was ich denke, war ein typischer Anwendungsfall. Ich benutze Apache HttpClient, um einen POST zu einem entfernten (internen) Server zu machen. Die Antwort vom Server ist XML.Der XML-DocumentBuilder von Java schlägt mit dem Zeitüberlauf des Parsens fehl?

Ich bekomme die Antwort von der Entität als Stream und parse es direkt in ein XML-Dokument. Dieser Codeausschnitt zeigt, was ich gerade mache.

HttpResponse response = httpClient.execute(request); 
int code = response.getStatusLine().getStatusCode(); 
if(code != 200) { 
    returnValue.addParameter("msg", "Recieved invalid status code '" + code + "'"); 
} 
else { 
    HttpEntity entity = response.getEntity(); 

    if (entity != null) { 
     InputStream iStream = entity.getContent(); 
     try { 
      DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
      Document doc = db.parse(iStream); 

Alles ist in Ordnung, wenn Sie dies auf meiner Dev-Box ausführen. Aber wenn ich es auf einem unserer internen Server bereitstellen, erhalte ich in der letzten Zeile meines Snippets db.parse(iStream) eine Verbindungstimeout-Ausnahme.

Warum?

Mein Verständnis (und Fiddler) sagt, dass die Anfrage abgeschlossen ist, wenn ich die Entität nach dem Inhalt frage. Daher wird der Eingangsstrom nicht über ein Netzwerk gezogen und sollte deshalb ziemlich schnell sein!

Wer hat eine Idee, was könnte los sein?

Vielen Dank im Voraus

aktualisieren, hier ist der Stack-Trace I

java.net.ConnectException: Connection timed out: connect 
    at java.net.DualStackPlainSocketImpl.connect0(Native Method) ~[?:1.7.0_80] 
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) ~[?:1.7.0_80] 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) ~[?:1.7.0_80] 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) ~[?:1.7.0_80] 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) ~[?:1.7.0_80] 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[?:1.7.0_80] 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[?:1.7.0_80] 
    at java.net.Socket.connect(Socket.java:579) ~[?:1.7.0_80] 
    at java.net.Socket.connect(Socket.java:528) ~[?:1.7.0_80] 
    at sun.net.NetworkClient.doConnect(NetworkClient.java:180) ~[?:1.7.0_80] 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:432) ~[?:1.7.0_80] 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:527) ~[?:1.7.0_80] 
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:211) ~[?:1.7.0_80] 
    at sun.net.www.http.HttpClient.New(HttpClient.java:308) ~[?:1.7.0_80] 
    at sun.net.www.http.HttpClient.New(HttpClient.java:326) ~[?:1.7.0_80] 
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:997) ~[?:1.7.0_80] 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:933) ~[?:1.7.0_80] 
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:851) ~[?:1.7.0_80] 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1301) ~[?:1.7.0_80] 
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:643) ~[?:1.7.0_80] 
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1297) ~[?:1.7.0_80] 
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDTDEntity(XMLEntityManager.java:1264) ~[?:1.7.0_80] 
    at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.setInputSource(XMLDTDScannerImpl.java:263) ~[?:1.7.0_80] 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1164) ~[?:1.7.0_80] 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1050) ~[?:1.7.0_80] 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:964) ~[?:1.7.0_80] 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606) ~[?:1.7.0_80] 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) ~[?:1.7.0_80] 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) ~[?:1.7.0_80] 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) ~[?:1.7.0_80] 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) ~[?:1.7.0_80] 
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243) ~[?:1.7.0_80] 
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:347) ~[?:1.7.0_80] 
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121) ~[?:1.7.0_80] 
    at com.XXXXXX.YYYYY.harness.server.Api.postCxml(Api.java:183) [classes/:?] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_80] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_80] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_80] 
    at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_80] 
    at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) [jersey-server-2.22.2.jar:?] 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144) [jersey-server-2.22.2.jar:?] 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161) [jersey-server-2.22.2.jar:?] 
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160) [jersey-server-2.22.2.jar:?] 
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) [jersey-server-2.22.2.jar:?] 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) [jersey-server-2.22.2.jar:?] 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) [jersey-server-2.22.2.jar:?] 
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) [jersey-server-2.22.2.jar:?] 
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326) [jersey-server-2.22.2.jar:?] 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) [jersey-common-2.22.2.jar:?] 
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) [jersey-common-2.22.2.jar:?] 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) [jersey-common-2.22.2.jar:?] 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) [jersey-common-2.22.2.jar:?] 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267) [jersey-common-2.22.2.jar:?] 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) [jersey-common-2.22.2.jar:?] 
    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) [jersey-server-2.22.2.jar:?] 
    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) [jersey-server-2.22.2.jar:?] 
    at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473) [jersey-container-servlet-core-2.22.2.jar:?] 
    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) [jersey-container-servlet-core-2.22.2.jar:?] 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) [jersey-container-servlet-core-2.22.2.jar:?] 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) [jersey-container-servlet-core-2.22.2.jar:?] 
    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) [jersey-container-servlet-core-2.22.2.jar:?] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) [catalina.jar:8.0.30] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.30] 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) [tomcat-websocket.jar:8.0.30] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.30] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.30] 
    at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) [log4j-web-2.5.jar:2.5] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.30] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) [catalina.jar:8.0.30] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) [catalina.jar:8.0.30] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) [catalina.jar:8.0.30] 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) [catalina.jar:8.0.30] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) [catalina.jar:8.0.30] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [catalina.jar:8.0.30] 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) [catalina.jar:8.0.30] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) [catalina.jar:8.0.30] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:521) [catalina.jar:8.0.30] 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1096) [tomcat-coyote.jar:8.0.30] 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:674) [tomcat-coyote.jar:8.0.30] 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2500) [tomcat-coyote.jar:8.0.30] 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2489) [tomcat-coyote.jar:8.0.30] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [?:1.7.0_80] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [?:1.7.0_80] 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-util.jar:8.0.30] 
    at java.lang.Thread.run(Thread.java:745) [?:1.7.0_80] 

Antwort

2

Können Sie die genau Fehlermeldung posten und können Sie den Inhalt der Antwort schreiben einen Blick haben was ist darin?

Aber für mich klingt das wie ein Problem im Netzwerk/Sicherheits-Setup.

Versucht der DocumentBuilder erfolglos, auf eine DTD über einen Netzwerk-Socket für Ihr XML-Dokument zuzugreifen? Wenn im XML-Dokument DTD-Verweise vorhanden sind, versuchen Sie, sie zu bearbeiten, um die Ursache zu ermitteln.

+0

ich eine HTTP-Antwort von 200 erhalten zu sein - so nicht sicher, wie es ein Netzwerk/Setup-Problem sein könnte. Die Anfrage wurde erfolgreich abgeschlossen! – YanisTheYak

+0

Okay, vielleicht ist die Verbindung in Ordnung, aber vielleicht in der Antwort steht etwas wie "Fehler beim Anfordern etc ..." oder was auch immer. Ich denke nur daran, dass die Antwort, die du bekommen hast, nicht geparst werden kann. Versucht der DocumentBuilder erfolglos, auf eine DTD über einen Netzwerk-Socket für Ihr XML-Dokument zuzugreifen? Wenn im XML-Dokument DTD-Verweise vorhanden sind, versuchen Sie, sie zu bearbeiten, um die Ursache zu ermitteln. – KilleKat

+0

Ja - Sie haben Recht, es war die DTD! Server, auf dem ich bereitgestellt habe, hat keinen Internetzugang. – YanisTheYak

2

Wie KilleKat darauf hinwies, war dies darauf zurückzuführen, dass der DocumentBuilder versuchte, eine externe DTD zu validieren. Ich habe diesen Beitrag

Make DocumentBuilder.parse ignore DTD references

und modifizierte meinen Code

HttpResponse response = httpClient.execute(request); 
int code = response.getStatusLine().getStatusCode(); 
if(code != 200) { 
    returnValue.addParameter("msg", "Recieved invalid status code '" + code + "'"); 
} 
else { 
    HttpEntity entity = response.getEntity(); 

    if (entity != null) { 
     InputStream iStream = entity.getContent(); 
     try { 
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      dbf.setValidating(false); 
      dbf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 

      DocumentBuilder db = dbf.newDocumentBuilder(); 
      Document doc = db.parse(iStream); 
+0

Die Einstellung 'load-external-dtd' auf' false' funktioniert für mich. 'setValidating (false)' ist nicht notwendig. – JonnyJD