[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Mar 2006
    Beiträge
    3

    Möglichkeit Timeout bei ProgrammCall

    Wer kann mir hier helfen? Wir haben ein Programm entwickelt, das mittels eines ProgrammCalls Funktionalitäten auf der AS/400 anstartet. In diversen Fehlersituationen kommt der Aufruf xxx.run nicht zurück. Besteht die Möglichkeit über Mittel der Toolbox einen Timeout zu definieren? Gibt es zu dem Methodenaufruf run Alternativen?

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Das kannst du nur per separatem Thread erledigen, der nach vorgegebener Zeit ein Wecksignal schickt.

    Aber Achtung:
    Der Job auf der AS/400 läßt sich dadurch normalerweise nicht canceln sonder läuft dann eben ohne Verbindung erst mal weiter !
    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
    EDIT: Ich sehe Fuerchau war schneller, dafür gibt's gleich ein Beispiel.

    Laut API bieten ProgrammCalls kein Timeout.

    Für den genauen Ratschlag müsste ich noch wisssen, ob du das Programm auf der AS/400 oder woanders läuft...

    Unabhängig davon, aber die 2 Möglichkeiten:

    1. via JDBC-Connection und CallableStatement. Dort gibt es ein Querytimeout. Um das Programm in eine StoredProcedure binden, suche im Forum.

    2. einen Überwachungsthread starten

    etwas so wie hier:
    Code:
    int waitSec = 900;
    int killTime = 30;
    
    Thread timeGuard = new Thread(new TimeGuard(waitSec+killTime, Thread.currentThread()));
    try {
        this.log("*** Warte auf Arbeit .... ***");
        timeGuard.start();
        DQData = dq.read(waitSec);
    } catch (InterruptedException e ) {
        this.log ( "TimeOut - Wiederanlauf in 2 Minunten" );
        .....
    } finally {
        timeGuard.interrupt();
    }
    Hier die Klasse Timeguard:

    Code:
       public class TimeGuard extends Thread  {
           
          private long waitTime;
          private Thread callThread;
    
          public TimeGuard (int waitTimeSec, Thread callThread) {
                        
              this.waitTime = waitTimeSec * 1000;
              this.callThread = callThread;
          }
    
          public void run() {
              try {
                  Thread.sleep(waitTime);
                  callThread.interrupt();   // Timeout, Caller unterbrechen
    
              } catch (InterruptedException e) {
                  // Normalfall
              }
          }
       }
    Einschränkung: Wenn man es ganz genau haben will, müsste man noch um ein Syncobject einbauen.

    Ich hab schon irgendwo eine elegantere Lösung gesehen, lebe mit der aber auch ganz gut.

    Falls es noch Fragen gibt nur zu.

    Robert P.

    PS. Wie man an diesem Beispiel sieht, läßt einen das Timeout der DataQueues auch im Stich, wenn der Listener am PC läuft und die AS/400 z.B. niederfährt --> ohne Timeout wartet der Listener dann ewig (auch wenn neue Einträge in die Dataqueue kommen würden)

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Ob ein QueryTimeout auf eine Stored-Procedure funktioniert, habe ich noch nicht ausprobiert.

    Allerdings läuft ein CALL SQL-Procedure in einem anderen Job als CALL Programm und unterliegt auch anderen Regeln !!!

    Ausserdem muss die Procedure dann für die AS/400 ThreadSave sein, da sonst kein Timeout-Thread gestartet werden kann.
    Also kein Aufruf von RPG's, CLP's usw. sondern ausschließlich C bzw. native SQL-Prozeduren, die als Threadsave deklariert wurden.
    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

  5. #5
    Registriert seit
    Oct 2004
    Beiträge
    240
    Zitat Zitat von Fuerchau
    Ob ein QueryTimeout auf eine Stored-Procedure funktioniert, habe ich noch nicht ausprobiert.
    Hab es mal schnell ausprobiert:
    Bei der stored Procedure mit CL-Programm wird es ignoriert.

    Bei der native SQL-Procedure fängt er zu schätzen an.....

    Es bleibt wirklich nur die Überwachungsvariante vom Aufrufer.

    Zum Canceln: Man kann die Wahrscheinlichkeit erhöhen, wenn man ein Reconnect (Objekt as400) durchführt. Diverse Perfomanceoptimierungen können einen dabei aber in die Suppe spucken...

    Robert P.

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Im Falle eines nötigen Cancels sollte man die Verbindung komplett freigeben und vom Garbagecollector auflösen lassen.
    Ein Reconnect könnte auch Resourcenprobleme bereiten, eine nagelneue Verbindung bekommt sicherlich auch einen neuen Job.
    Achtung Ausnahme: ConnectionPooling !!!
    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

  7. #7
    Registriert seit
    Oct 2004
    Beiträge
    240
    Zitat Zitat von Fuerchau
    Im Falle eines nötigen Cancels sollte man die Verbindung komplett freigeben und vom Garbagecollector auflösen lassen.
    Ein Reconnect könnte auch Resourcenprobleme bereiten...
    Mit Reconnect war auch close und neues Connect gemeint - die Klasse AS400 hat gar kein reconnect.

    Anbei gleich den Code:

    Code:
    // Wiederaufbau der AS/400-Verbindung (z.B. für DataQueue)
        public void reconnect ()  {
             if (as400 != null) {
                 as400.disconnectAllServices();
                 as400 = null;
             }
             as400 = new AS400(sysname, username, password);
    }
    [FONT=verdana,geneva,lucida,'lucida grande',arial,helvetica,sans-serif]

    [/FONT]Robert P.

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Hallo,

    ich spüre da so ein leichtes Kräuseln meiner Nackenhaare, wenn ich das richtig verstanden habe, dann habe ich einen Java Client, der einen AS400 Serverdienst aufruft (sei es nun ein call via AS400 Objekt, oder ein JDBC Call), der seinerseits irgendwie hängen bleibt, oder nicht in die Pötte kommt. Solange dieses AS400 Programm vor sich hin dümpelt, solange wird kein Garbage Collector es wegräumen, vermutlich funzt dann nicht mal finalize und dann müllt sich das ganze mit womöglich ewig hängenden Leichen zu. Den Ansatz das auf dem Client zu monitoren und von dort den Thread aufzugeben, das würde ich bleiben lassen.
    Auf dem Server einen Monitor einzubauen, scheitert vermutlich daran, dass es sich um einen RPG Schinken handelt, deer keinen Monitor Thread hat und haben kann.
    Ich würde hier ganz entschieden für ein Redesign und neu schreiben der AS400 Seite plädieren (wahrscheinlich liest der eh nur aus der Datenbank). Sollte das absolut nicht gehen, weil keiner mehr weiß, was dieses Teil treibt, oder selbiges solch wertvolle Gedanken enthält, auf die man kein zweites Mal kommt, dann wäre das eine der ganz abgezählten Ausnahmen in denen ich auf die synchrone Variante setzen würde:
    - aus Java per JNI aufrufen
    - Monitor Thread in Java
    - bei timeout Exception Aufruf abbrechen
    - das RPG Teil keinesfalls mit Thread serializable wandeln
    - nach Abbruch das Java Objekt dem Garbage Kollektor überlassen

    Bei Stresstests dieser Art würde ich immer das AS400 Objekt meiden und selbiges nur über den jt400 Treiber versuchen, auch vom native Treiber würde ich hier wg. Buggy Syndromen die Finger lassen.

    @Baldur: die Thread Safe Sache hat mit der Möglichkeit einen Thread zu starten nix zu tun. Der Job (in dem das Java Teil läuft) muss Multithreading erlauben, das Subsystem muss über entsprechende Anzahl von activity levels verfügen, das Subsystem muss einen eventuell zusätzlichen Qshell Job erlauben und das wars. Thread *serializable bewirkt lediglich, dass man nicht zweimal gleichzeitig in dasselbe Modul reinkommt, die Aufrufe werden geblockt, bis der, der gerade dran ist, zurück kommt. Das ist sowohl unzureichend (export von Variablen), wie gefährlich (Verklemmungen durch Deadlocks).

    @Robert: wenn ich das richtig verstehe, brauchst du den Monitro Mechanismus nur, weil die DTAQ Implementierung der Toolbox nicht das tut, was sie soll?! die soll doch gerade nach waitSec aufhören, wie sie das mit AS400 API auch tut.

    mfg

    Dieter Bender

    PS: die rein AS400 seitige Lösung über Zwischenschaltung einer DTAQ wäre vielleicht sogar noch das beste:
    - Aufuf eines AS400 Programms per JDBC
    - selbiges stellt eine Anforderung in eine DTAQ und wartet n sek auf Antwort
    - wenn der wait zuschlägt Rückgabe an Java Programm "wwn" (war wohl nix) und Abbruch des RPG Schinkens



    Zitat Zitat von Fuerchau
    Im Falle eines nötigen Cancels sollte man die Verbindung komplett freigeben und vom Garbagecollector auflösen lassen.
    Ein Reconnect könnte auch Resourcenprobleme bereiten, eine nagelneue Verbindung bekommt sicherlich auch einen neuen Job.
    Achtung Ausnahme: ConnectionPooling !!!
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  9. #9
    Registriert seit
    Oct 2004
    Beiträge
    240
    Zitat Zitat von BenderD
    @Robert: wenn ich das richtig verstehe, brauchst du den Monitro Mechanismus nur, weil die DTAQ Implementierung der Toolbox nicht das tut, was sie soll?! die soll doch gerade nach waitSec aufhören, wie sie das mit AS400 API auch tut.
    Genau. Prinzipiell funktioniert die Wartezeit bei der Toolbox. Der Wartemechanismus ist aber nur serverseitig implementiert.

    Das eigentliche Problem ist aber, dass der DataQueue.read keine Exception wirft, wenn die AS/400 weg ist (und die Javaprogramme auf Windows- bzw. Linux laufen). Der Job bleibt auf warten, auch wenn die AS/400 schon längst wieder da ist und neue Einträge warten.

    Daher meine "Hurra ich lebe noch" Kontrolle für meine 24x7-Jobs (auf Linux und Windows).

    Bei einem Blick in JTOPEN-Forum ist auch keine Hilfe für dieses Problem ist Aussicht gestellt worden. (http://www-912.ibm.com/j_dir/JTOpen....7?OpenDocument)

    Bei Calls (über stored Procedures) bin ich bisher ohne Timeouts ausgekommen.

    Robert P.

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Hallo,

    dann wäre es doch eigentlich besser, einen eigenen Wrapper (extends ... DataQueue) zu schreiben und die read Methode zu überschreiben der genau dies kapselt.

    mfg

    Dieter Bender

    PS: oder diesen Toolbox Schmonz durch eine (schmale) Schicht von stored Procedures zu ersetzen, oder vom Design her ganz darauf zu verzichten.

    Zitat Zitat von RobertPic
    Genau. Prinzipiell funktioniert die Wartezeit bei der Toolbox. Der Wartemechanismus ist aber nur serverseitig implementiert.

    Das eigentliche Problem ist aber, dass der DataQueue.read keine Exception wirft, wenn die AS/400 weg ist (und die Javaprogramme auf Windows- bzw. Linux laufen). Der Job bleibt auf warten, auch wenn die AS/400 schon längst wieder da ist und neue Einträge warten.

    Daher meine "Hurra ich lebe noch" Kontrolle für meine 24x7-Jobs (auf Linux und Windows).

    Bei einem Blick in JTOPEN-Forum ist auch keine Hilfe für dieses Problem ist Aussicht gestellt worden. (http://www-912.ibm.com/j_dir/JTOpen....7?OpenDocument)

    Bei Calls (über stored Procedures) bin ich bisher ohne Timeouts ausgekommen.

    Robert P.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  11. #11
    Registriert seit
    Oct 2004
    Beiträge
    240
    Hallo
    Zitat Zitat von BenderD
    dann wäre es doch eigentlich besser, einen eigenen Wrapper (extends ... DataQueue) zu schreiben und die read Methode zu überschreiben der genau dies kapselt.
    Das wäre sicher einen Tick schöner, allerdings kommt der DataQueue.read bei mir nur einmal in meinem (oft verwendeten) DataQueueListener vor.

    Zitat Zitat von BenderD
    PS: oder diesen Toolbox Schmonz durch eine (schmale) Schicht von stored Procedures zu ersetzen, oder vom Design her ganz darauf zu verzichten.
    Derzeit habe ich nur 2 Arten von Kommunikation:
    1. Javajob (auf AS/400, Linux, PC) wird per DataQueue getriggert. z.B. PDF-Wandlung, neue Daten für Spedition...

    2. Wenn die Daten von "Außen" kommen, z.B. XML-Datei vom EDIFACT-Konverter werden die Arbeiten vom Javaprogramm erledigt/vorbereitet (z.B. XML-Datei in die Datenbank mappen) und anschließend eine stored Procedure aufgerufen, welche z.B. die EDFIACT-Bestellung verarbeitet.

    Bei den nächsten Projekten müssen viele 5250-Clients (schnell) bedient werden. Ich werde daher eine Lösung mit Sockets anstreben.

    Für den Client-(ILE)-Teil gibt es Freeware von IBM, welche angeblich ganz brauchbar ist (aus RPG, Cobol... ähnlich einfach wie DataQueues).
    Seit der Registrierung ist jetzt eine Woche vergangen....ich berichte dann über die "Tauglichkeit".

  12. #12
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Hallo Robert,

    ich hatte mit dem extend auf die DataQueue mehr die Zentralisierung in einem Objekt im Blick; im Grunde will eine Applikation Daten und sonst nix, es sei denn es geht was schief, dann wird eine exception erwartet; dass das ganze irgendwo durch eine DataQ durchgeknebelt wird, ist der Applikation egal.
    Mit den Sockets bin ich mir nicht sicher, ob du da einen guten Tausch machst, es sei denn du schreibst den zentrale Dispatcher, der die Anfragen annimmt und verteilt in C. Wenn du für jeden 5250 Client von vornherein einen eigenen Server startest, dann gibt das einigen Overhead und Probleme, wenn so'n Ding wegschläft oder abschmiert, bei einer 1 zu n Lösung geht nix ohne Multithreading und das kann weder RPG noch Cobol auf der AS/400.
    Ich würde da als Schmalspur zu einem DataQ basierten Dispatcher tendieren und den in Java schreiben. Wenn man es schick machen will, dann könnte man das ganze auch als WebService erscheinen lassen; dann kann man einen fertigen Server verwenden und braucht dann für die Clients eine schmale Schicht, die die Daten aufbereitet; dafür würde dann ein Schmalspur Parser als Adapter reichen.

    mfg

    Dieter Bender

    Zitat Zitat von RobertPic
    Hallo

    Das wäre sicher einen Tick schöner, allerdings kommt der DataQueue.read bei mir nur einmal in meinem (oft verwendeten) DataQueueListener vor.


    Derzeit habe ich nur 2 Arten von Kommunikation:
    1. Javajob (auf AS/400, Linux, PC) wird per DataQueue getriggert. z.B. PDF-Wandlung, neue Daten für Spedition...

    2. Wenn die Daten von "Außen" kommen, z.B. XML-Datei vom EDIFACT-Konverter werden die Arbeiten vom Javaprogramm erledigt/vorbereitet (z.B. XML-Datei in die Datenbank mappen) und anschließend eine stored Procedure aufgerufen, welche z.B. die EDFIACT-Bestellung verarbeitet.

    Bei den nächsten Projekten müssen viele 5250-Clients (schnell) bedient werden. Ich werde daher eine Lösung mit Sockets anstreben.

    Für den Client-(ILE)-Teil gibt es Freeware von IBM, welche angeblich ganz brauchbar ist (aus RPG, Cobol... ähnlich einfach wie DataQueues).
    Seit der Registrierung ist jetzt eine Woche vergangen....ich berichte dann über die "Tauglichkeit".
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. timeout bei ClientAccess / Mocha
    By cbe in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 17-11-06, 22:11
  2. Antworten: 11
    Letzter Beitrag: 22-06-06, 10:21
  3. timeout beim Datentransfer mit JDBC ...?
    By bode in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 27-04-06, 19:08
  4. Ausgabe 04/06 Sockets mit Timeout
    By Rincewind in forum NEWSboard load'n'go
    Antworten: 0
    Letzter Beitrag: 04-08-04, 10:53
  5. Anfänger, cwbtf.exe parameter übergeben?
    By thoughtless in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 03-06-04, 15:26

Berechtigungen

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