[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Sep 2005
    Beiträge
    39

    JDOM / XML Problem

    Hallo zusammen,

    ich habe ein Problem im Bereich XML Generierung. Kurzer Sachverhalt:

    Eine Internetseite schickt eine Anfrage per XML an uns. Diese wird zunächst von einem JAVA Programm, welches sich auf einem Linuxserver (verwendet tomcat) in der DMZ befindet, bearbeitet und dann über eine .pcml an ein RPG Programm übergeben. Dieses Programm liefert dann wieder eine XML als Antwort welche dann an den Sender zurückgeschickt wird.

    meine erste Vermutung:
    irgendwas stimmt hier nicht ...

    mein Problem:
    Das Javaprogramm bringt seit ein paar Tagen nur noch einen Timeout zurück.
    Am Programm selbst wurde aber anscheinend nichts geändert.

    Da das Programm nicht von mir ist und ich hier kaum Java programmiere fällt es mir jetzt nicht ganz einfach den Fehler zu finden. Folgendes konnte ich schon testen:

    Das Programm bekommt Daten zugeschickt,

    (req.getContentLength() ist größer -1)

    kann aber folgeden Zeile nicht ausführen:

    InputStream iStream = req.getInputStream();


    Code:
        protected void getXMLRequest(HttpServletRequest req) throws IOException,
                JDOMException {
        
            if (req.getContentLength() == -1) {
                log("contentlänge == -1");
                return;
            } else {
                DOMBuilder builder = new DOMBuilder(true);
                InputStream iStream = req.getInputStream();
                
                XMLRequest = builder.build(iStream);
                iStream.close();
                
                return;
            }
        }
    auf der Linuxconsole bekomme ich folgende Fehlermeldung:

    Code:
    org.jdom.JDOMException: Error on line 2: org.apache.crimson.parser/P-082 http://www.....de/shop/dtd/...dtd
            at org.jdom.input.DOMBuilder.build(DOMBuilder.java:274)
            at Lieferterminanfrage.getXMLRequest(Lieferterminanfrage.java:52)
            at Lieferterminanfrage.service(Lieferterminanfrage.java:92)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
            at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java:503)
            at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java:597)
            at org.apache.tomcat.servlets.InvokerServlet.service(InvokerServlet.java:257)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
            at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java:503)
            at org.apache.tomcat.core.ContextManager.service(ContextManager.java:559)
            at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:160)
            at org.apache.tomcat.service.TcpConnectionThread.run(SimpleTcpEndpoint.java:338)
            at java.lang.Thread.run(Thread.java:484)
    
    Root cause: java.net.NoRouteToHostException: Die Wartezeit für die Verbindung ist abgelaufen
            at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3035)
            at org.apache.crimson.parser.Parser2.externalParameterEntity(Parser2.java:2723)
            at org.apache.crimson.parser.Parser2.maybeDoctypeDecl(Parser2.java:1154)
            at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:488)
            at org.apache.crimson.parser.Parser2.parse(Parser2.java:304)
            at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:433)
            at org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:179)
            at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:86)
            at java.lang.reflect.Method.invoke(Native Method)
            at org.jdom.adapters.JAXPDOMAdapter.getDocument(JAXPDOMAdapter.java:146)
            at org.jdom.input.DOMBuilder.build(DOMBuilder.java:230)
            at Lieferterminanfrage.getXMLRequest(Lieferterminanfrage.java:52)
            at Lieferterminanfrage.service(Lieferterminanfrage.java:92)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
            at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java:503)
            at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java:597)
            at org.apache.tomcat.servlets.InvokerServlet.service(InvokerServlet.java:257)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
            at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java:503)
            at org.apache.tomcat.core.ContextManager.service(ContextManager.java:559)
            at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:160)
            at org.apache.tomcat.service.TcpConnectionThread.run(SimpleTcpEndpoint.java:338)
            at java.lang.Thread.run(Thread.java:484)
    mit dieser Meldung kann ich halt leider nicht viel anfangen ... kann mir hier vielleicht jmd. helfen?

    Wie kann es zu so einem Fehler kommen?
    Wurde der tomcat vielleicht falsch gestartet?
    Fehlen vielleicht die Zusatzklassen jdom.jar, servlet.jar ... ?
    Muss man hier etwas beim Kompilieren beachten? -> Ort der Zusatzklassen lokal und auf dem Server?

    Bin um jeden Tip dankbar ...
    mfg - Drittaccount

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.270
    So wie die Fehlermeldung aussieht (das ist die Erste), kann der Parser das XML-Dokument nicht verarbeiten, da es der zugeordneten DTD nicht entspricht.

    Der Fehler scheint aber nicht abgefangen zu werden, so dass das Java-Programm eben stirbt.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Oct 2004
    Beiträge
    240
    Ich denke, dass die falsche XML-Validierung ein Folgefehler ist.

    Der vorangegangene Fehler java.net.NoRouteToHostException:

    mit Zeitüberlauf weißt auf ein Netzwerkproblem hin.

    Normalerweise hat man dieses Problem bei Socketkommunikation, wenn das System keinen Rückkanal aufbauen kann.

    Auf einem Webserver wundert mich das zwar, aber wer weiß.

    1.) Kannst auch eine Anfrage auch innerhalb der DMZ stellen?

    2.) Kannst du an den Javaprogrammen was ändern?

    3.) Außerdem habe ich etwas Zweifel an der Fehlerzeile "InputStream iStream ...".
    Der Stacktrace zeigt JDOM-Programme, in dieser Zeile sind nur Java.io.* und das Servlet - nocheinmal prüfen!

    /Robert

  4. #4
    Registriert seit
    Sep 2005
    Beiträge
    39
    @RobertPic:

    zu Punk1:
    Wäre denke ich möglich, aber mit viel Aufwand.

    zu Punkt 2:
    die Quellen liegen vor. Ich kann also den Code ändern.

    zu Punkt 3:

    ich habe folgendes getestet:

    Code:
            if (req.getContentLength() == -1) {
                log("contentlänge == -1");
                return;
            } else {
            
                DOMBuilder builder  = new DOMBuilder(true);
                log("DOMBuilder builder  = new DOMBuilder(true);");
    
                InputStream iStream = req.getInputStream();
                log("InputStream iStream = req.getInputStream();");
                    
                XMLRequest = builder.build(iStream);
                log("XMLRequest = builder.build(iStream);");
                    
                iStream.close();
                log("iStream.close();");
                            
                return;
            }
    wenn er also eine Logzeile schreibt hat er auch den Befehl ausgeführt ...

    XMLRequest = builder.build(iStream); wird leider nicht ausgeführt.
    mfg - Drittaccount

  5. #5
    Registriert seit
    Oct 2004
    Beiträge
    240
    Hallo

    Baue Folgendes nach dem InputStream =... (bzw. log) ein:

    PHP-Code:
    StringBuffer xml = new StringBuffer();
    byte[] = new byte[4096];
    for (
    int n; (iStream.read(b)) != -1;) {
          
    xml.append(new String(b0n));
    }
    ByteArrayInputStream xmlStream = new ByteArrayInputStream(xml.toString().getBytes()); 
    danach noch ein
    log("XML-Inhalt: " + xml);

    und dahinter musst du den build(iStream) durch build(xmlStream) ersetzen.

    Wenn es keine Netzwerkproblem ist, solltest du die Anfrage im Log haben und weiterforschen können. Wenn er jetzt in der Schleife verstirbt, ist es zu 99,9% kein XML-Problem.

    Der Teil ist nicht besonders sauber geschrieben (beim Hin- und Herwandeln könnten Umlaute verloren gehen), also nach der Problembehebung besser wieder entfernen.

    /Robert

  6. #6
    Registriert seit
    Sep 2005
    Beiträge
    39
    @RobertPic:

    Vielen Dank für deinen Tip. Im Log kommt jetzt die XML-Anfrage an.
    Es scheint also kein Netzwerkproblem zu sein.
    Leider funktioniert der XMLRequest = builder.build(xmlStream); aber auch nicht ...

    Woran kann das liegen ?
    mfg - Drittaccount

  7. #7
    Registriert seit
    Sep 2005
    Beiträge
    39
    @Fuerchau:

    So wie die Fehlermeldung aussieht (das ist die Erste), kann der Parser das XML-Dokument nicht verarbeiten, da es der zugeordneten DTD nicht entspricht.
    Möglicherweise stimmt ja hier was nicht ... ich finde zwar keinen Fehler, aber vielleicht übersehe ich ja etwas.

    Also im Log kommt folgendes an:

    Code:
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <!DOCTYPE LieferterminanfrageKopf SYSTEM "http://www.shk-branchenportal.de/shop/dtd/LieferterminanfrageKopf.dtd">
    <LieferterminanfrageKopf>
        <Message id="0000000112435" sender="1331" receiver="121" passwd="test"/>
        <Auftragsdaten>
            <kndnr>001100</kndnr>
            <ordernr>A00XXXXXXX</ordernr>
            <ghbnr></ghbnr>
            <datumvon></datumvon>
            <datumbis></datumbis>
        </Auftragsdaten>
    </LieferterminanfrageKopf>
    Und die Layoutdatei:
    http://www.shk-branchenportal.de/shop/dtd/LieferterminanfrageKopf.dtd

    Code:
    <!ELEMENT LieferterminanfrageKopf (Message, Auftragsdaten)>
    <!ELEMENT Message EMPTY>
    <!ATTLIST Message
        id CDATA    #REQUIRED
        sender CDATA    #REQUIRED
        receiver CDATA    #REQUIRED
        passwd CDATA    #IMPLIED>
    
    <!ELEMENT Auftragsdaten (kndnr, ordernr?, ghbnr?, datumvon?, datumbis?)>
    <!ELEMENT kndnr (#PCDATA)>
    <!ELEMENT ordernr (#PCDATA)>
    <!ELEMENT ghbnr (#PCDATA)>
    <!ELEMENT datumvon (#PCDATA)>
    <!ELEMENT datumbis (#PCDATA)>
    mfg - Drittaccount

  8. #8
    Registriert seit
    Oct 2004
    Beiträge
    240
    Kommt jetzt immer noch die Exception vom 1. Posting?

    Wenn ja, tippe ich darauf, dass er beim Versuch das DTD-File zu lesen (über http) nicht ins Internet kommt.

    /Robert

  9. #9
    Registriert seit
    Sep 2005
    Beiträge
    39
    @RobertPic:

    du meinst warscheinlich diese hier:
    ( -> also doch ein Netzwerkproblem ?!)

    dann werd ich wohl einen unserer Netzwerkspezialisten aufsuchen müssen ...

    Vielen Dank nochmals für die Unterstützung.

    Code:
    org.jdom.JDOMException: Error on line 2: org.apache.crimson.parser/P-082 http://www.shk-branchenportal.de/sho...nfrageKopf.dtd
            at org.jdom.input.DOMBuilder.build(DOMBuilder.java:274)
            at Lieferterminanfrage.getXMLRequest(Lieferterminanfrage.java:72)
            at Lieferterminanfrage.service(Lieferterminanfrage.java:121)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
            at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java:503)
            at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java:597)
            at org.apache.tomcat.servlets.InvokerServlet.service(InvokerServlet.java:257)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
            at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java:503)
            at org.apache.tomcat.core.ContextManager.service(ContextManager.java:559)
            at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:160)
            at org.apache.tomcat.service.TcpConnectionThread.run(SimpleTcpEndpoint.java:338)
            at java.lang.Thread.run(Thread.java:484)
    
    Root cause: java.net.NoRouteToHostException: Die Wartezeit für die Verbindung ist abgelaufen
            at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3035)
            at org.apache.crimson.parser.Parser2.externalParameterEntity(Parser2.java:2723)
            at org.apache.crimson.parser.Parser2.maybeDoctypeDecl(Parser2.java:1154)
            at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:488)
            at org.apache.crimson.parser.Parser2.parse(Parser2.java:304)
            at org.apache.crimson.parser.XMLReaderImpl.parse(XMLReaderImpl.java:433)
            at org.apache.crimson.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:179)
            at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:86)
            at java.lang.reflect.Method.invoke(Native Method)
            at org.jdom.adapters.JAXPDOMAdapter.getDocument(JAXPDOMAdapter.java:146)
            at org.jdom.input.DOMBuilder.build(DOMBuilder.java:230)
            at Lieferterminanfrage.getXMLRequest(Lieferterminanfrage.java:72)
            at Lieferterminanfrage.service(Lieferterminanfrage.java:121)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
            at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java:503)
            at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java:597)
            at org.apache.tomcat.servlets.InvokerServlet.service(InvokerServlet.java:257)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
            at org.apache.tomcat.core.ServletWrapper.handleRequest(ServletWrapper.java:503)
            at org.apache.tomcat.core.ContextManager.service(ContextManager.java:559)
            at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:160)
            at org.apache.tomcat.service.TcpConnectionThread.run(SimpleTcpEndpoint.java:338)
            at java.lang.Thread.run(Thread.java:484)
    mfg - Drittaccount

  10. #10
    Registriert seit
    Oct 2004
    Beiträge
    240
    Du kannst den Fehler noch weiter einschränken, führe auf dem Linuxserver folgendes Befehle aus:

    1.) Kann die Adresse als IP umgesetzt werden? Anm. Das Webserver nicht auf Pings antworten, ist normal. Es geht darum, ob der Name aufgelöst werden kann.

    Code:
    ping www.shk-branchenportal.de
    2.) Download der Datei
    Code:
    wget http://www.shk-branchenportal.de/shop/dtd/LieferterminanfrageKopf.dtd
    Linuxbefehl zum Downloaden einer html-Seite. Liefert vielleicht noch genauere Fehler.

    /Robert

  11. #11
    Registriert seit
    Sep 2005
    Beiträge
    39
    » zu Punkt 1:

    Code:
    ping www.shk-branchenportal.de
     
    PING www.shk-branchenportal.de (80.66.16.142): 56 data bytes
    Die Adresse scheint er also richtig aufzulösen ...

    » zu Punkt 2:

    Code:
    wget http://www.shk-branchenportal.de/shop/dtd/LieferterminanfrageKopf.dtd
    --14:32:43--  http://www.shk-branchenportal.de:80/shop/dtd/LieferterminanfrageKopf.dtd
               => `LieferterminanfrageKopf.dtd'
    Connecting to www.shk-branchenportal.de:80...
    
    
    connect: Connection timed out
    Retrying.
    
    --14:35:52--  http://www.shk-branchenportal.de:80/shop/dtd/LieferterminanfrageKopf.dtd
      (try: 2) => `LieferterminanfrageKopf.dtd'
    Connecting to www.shk-branchenportal.de:80...
    connect: Connection timed out
    Retrying.
    
    --14:39:01--  http://www.shk-branchenportal.de:80/shop/dtd/LieferterminanfrageKopf.dtd
      (try: 3) => `LieferterminanfrageKopf.dtd'
    Connecting to www.shk-branchenportal.de:80...
    connect: Connection timed out
    Retrying.
    
    --14:42:10--  http://www.shk-branchenportal.de:80/shop/dtd/LieferterminanfrageKopf.dtd
      (try: 4) => `LieferterminanfrageKopf.dtd'
    Connecting to www.shk-branchenportal.de:80...
    Wie du schon richtig getippt hast hat der Linuxserver wohl wirklich Probleme mit dem Herunterladen der .dtd Datei.
    mfg - Drittaccount

  12. #12
    Registriert seit
    Oct 2004
    Beiträge
    240
    Noch ein letzter Hinweis: Das Problem kann am Linuxserver oder an der Firewall liegen.

    Wenn es vorher ging, müsst ihr irgendwas daran verstellt haben.

    /Robert

Similar Threads

  1. Problem mit Java-Methoden Aufruf aus ILE RPG?
    By Stoeberl in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 10-01-07, 10:58
  2. Webservices, SOAP, XML und Labeldruck
    By vige1000 in forum NEWSboard Linux
    Antworten: 4
    Letzter Beitrag: 21-12-06, 11:56
  3. Problem mit Steuerzeichen in Datenbank?
    By Stoeberl in forum NEWSboard Programmierung
    Antworten: 11
    Letzter Beitrag: 26-10-06, 10:07
  4. Merkwürdiges Problem in VRPG
    By Flappes in forum IBM i Hauptforum
    Antworten: 0
    Letzter Beitrag: 06-10-06, 08:39
  5. Problem mit XML PARSE in ILE COBOL
    By MikRom in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 15-08-05, 09:06

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •