2016-04-01 24 views
0

JTOpen ProgramCall sınıfını (com.ibm.as400.access.ProgramCall) kullanarak IBM i (AS/400) programlarını çağıran bir web uygulamasında (Tomcat üzerinde çalışıyor) çalışıyorum. Sorunum, yanıtlamak için 30 saniyeden fazla süren program çağrılarıdır; bunlar bir java.net.SocketTimeoutException: Read timed out exception'u tetikler.JTOpen ProgramCall Soket Zaman Aşımı

Bu sınıf için kullanılabilir bir setTimeout() yöntemi var, ancak yuva zaman aşımı üzerinde bir etkisi yok gibi görünüyor. Ayrıca Tomcat yapılandırmalarımı kontrol ettim ve bu davranışa neden olacak hiçbir şey görmedim.

Böyle bir uygulama için zaman aşımını değiştirmenin bir yolu olduğunu bilen var mı?

Kodu:

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()); 
} 

cevap

1

Eh, birkaç saat daha sonra çözüm buldum. Görünüşe göre orijinal geliştirici JDBC bağlantı dizesine bir socket timeout parametresi ekledi - sadece varsayılan değer 0 ya da sonsuz zaman aşımı olarak parametreyi kaldırarak hile yaptı.

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();

sonra::

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();

:

önce

\