2016-04-01 5 views
0

Ich arbeite an einer Webanwendung (läuft auf Tomcat), die Programme auf einem IBM i (AS/400) mit der JTOpen ProgramCall-Klasse aufruft (com.ibm.as400.access.ProgramCall). Mein Problem ist bei Programmaufrufen, die mehr als 30 Sekunden benötigen, um zu antworten, die eine java.net.SocketTimeoutException: Read timed out exception auslösen.JTOpen ProgramCall Socket-Timeout

Für diese Klasse ist eine setTimeout()-Methode verfügbar, die sich jedoch nicht auf das Socket-Timeout auswirkt. Ich habe auch meine Tomcat-Konfigurationen überprüft und nichts gesehen, was dieses Verhalten verursacht hätte.

Kennt jemand eine Möglichkeit, das Timeout für eine solche Implementierung zu ändern?

Code:

pgmCall.setProgram(getCompleteName(), parmList); 
initializeAS400TextParameters(); 

// Run the AS/400 program. 
try { 
    Trace.setTraceDiagnosticOn(true); 
    Trace.setTraceInformationOn(true); 
    Trace.setTraceWarningOn(true); 
    Trace.setTraceErrorOn(true); 
    Trace.setTraceDatastreamOn(true); 

    if (pgmCall.run() != true) { 
     messageList = pgmCall.getMessageList(); 
     for (int i = 0; i < messageList.length; i++) { 
      log.debug("Error Message " + i + " " + messageList[i]); 
     } 
     setCompletionMsg("Program call failed."); 
     log.debug("442 Program call failed."); 

     return false; 
    } else { 
     messageList = pgmCall.getMessageList(); 
     for (int i = 0; i < messageList.length; i++) { 
      log.debug("Success Message " + i + " " + messageList[i]); 
     } 
     setCompletionMsg("Program called ok."); 
     log.debug("452 Program called ok."); 

     return true; 
    } 
} catch (Exception e) { 
    // This is where the timeout exception is thrown 
    log.debug("Error Running Program: " + e.getMessage() + " " + e.getLocalizedMessage()); 
    setCompletionMsg(e.getMessage()); 
} 

Antwort

1

Nun, nach einigen weiteren Stunden ich habe die Lösung gefunden. Anscheinend hat der ursprüngliche Entwickler einen socket timeout Parameter zu der JDBC-Verbindungszeichenfolge hinzugefügt - einfach den Parameter löschend, hat der Trick als der Standardwert 0, oder unbegrenztes Timeout.

Vorher:

String connectionStr = "jdbc:as400://" + systemInfo.getIPAddress() + ":1527" + ";naming=system;socket timeout=30000;thread used=false;errors=full;prompt=false;date format=iso;block size=128;transaction isolation=none;user=" + systemInfo.getUserName() + ";password=" + systemInfo.getPassword();

Nach:

String connectionStr = "jdbc:as400://" + systemInfo.getIPAddress() + ":1527" + ";naming=system;thread used=false;errors=full;prompt=false;date format=iso;block size=128;transaction isolation=none;user=" + systemInfo.getUserName() + ";password=" + systemInfo.getPassword();

: \

Verwandte Themen