Autor Thema: Java Agent auf Server stoppt ohne Fehlermeldung  (Gelesen 3840 mal)

Offline machineslave

  • Senior Mitglied
  • ****
  • Beiträge: 328
  • Geschlecht: Männlich
Java Agent auf Server stoppt ohne Fehlermeldung
« am: 06.08.07 - 16:03:31 »
Hallo,

ich habe einen Java Agenten (von einem ehemaligen Kollegen übernommen :(), welcher über das Domino Directory ($VIMPeople) huscht und diverse Daten ausliest und verarbeitet.
Zum Schluss wird eine Datei generiert und per FTP an eine andere Maschine übertragen.

Wenn ich den Agenten lokal laufen lasse, funktioniert er problemlos. Wenn er auf dem Server läuft, hört er kurz vor Ende (immer so bei einem Personeneintrag mit Anfangsbuchstabe V oder W) ohne eine Fehlermeldung auf.

Auf der Konsole wird die Meldung

08/06/2007 15:52:16   AMgr: Agent 'agentName' in 'admin/application.nsf' ran successfully; elapsed time was '6492' ticks

ausgegeben.
Die erlaubte Ausführungszeit für Agenten liegt bei 30 Minuten (der Agent selber braucht ca. 2 Minuten).
Hat jemand eine Idee, wo man da ansetzen kann? Ich habe schon JavaVerbose=1 eingetragen, sehe dort aber ebenfalls keine Fehlermeldung.

Hier mal der Code:


import lotus.domino.*;
import java.io.*;
import java.net.*;
import java.util.*;
import org.doomdark.uuid.UUIDGenerator;


public class JavaAgent extends AgentBase {
   public void NotesMain() {
      try {
         StringBuffer sb = new StringBuffer();                  
         StringBuffer sbNotConform = new StringBuffer();
         Session session = getSession();
         AgentContext agentContext = session.getAgentContext();
         Database db = agentContext.getCurrentDatabase();
         View v = db.getView("PersonUID");
         View vName = db.getView("(PersonName)");
         String server = db.getServer();
         Form form = db.getForm("NABFields");
         Vector fields = form.getFields();
         int fs = fields.size();                  
         //
         Database nabdb = session.getDatabase(server, "names.nsf");
         if(nabdb != null) {
            int k = 0;
            View nabview = nabdb.getView("($VIMPeople)");
            if(nabview == null) System.out.println("view is nothing");
            Document nabdoc = nabview.getFirstDocument();               
            while(nabdoc != null ) {            

                System.out.println("Total Memory"+Runtime.getRuntime().totalMemory());   
               System.out.println("Free Memory"+Runtime.getRuntime().freeMemory());
               System.out.println("UNID: " + nabdoc.getUniversalID());
               System.out.println("MAIL: " + nabdoc.getItemValueString("MailFile"));
               String mail = nabdoc.getItemValueString("InternetAddress");
               System.out.println("Mail: " + mail);               
               String firstname = nabdoc.getItemValueString("FirstName");
               System.out.println("Firstname: " + firstname);               
               String midname = nabdoc.getItemValueString("MiddleInitial");
               System.out.println("Midname: " + midname);               
               String name = nabdoc.getItemValueString("LastName");
               System.out.println("last name: " + name);               
               String cur_uid = nabdoc.getItemValueString("EspritUID");
               System.out.println("Cur_id: " + cur_uid);               
               
               System.out.println("Name: " + firstname + " " + name);

               if (!(firstname == null || firstname.equals("") || name == null || name.equals("") || mail == null || mail.equals(""))) {      
                  System.out.println("processing");
                  if (cur_uid == null || cur_uid.equals("")) {
                      // Process document ...
                  String esprit_uuid = "" + UUIDGenerator.getInstance().generateTimeBasedUUID();                  
                  System.out.println("Created UID: " + esprit_uuid);            
                  nabdoc.replaceItemValue("EspritUID", esprit_uuid);
                  nabdoc.save();
                  cur_uid = esprit_uuid;
                  }
                  if(midname == null) midname="";
                  if(!midname.equals("")) midname = midname + ".";
                  String concretEmailAddress = firstname + "." + midname + name;
                  concretEmailAddress = concretEmailAddress.replace(' ', '.');
                  if (mail.equalsIgnoreCase(concretEmailAddress + "@meinedomaene.com")) {                                 
                     Document   doc = v.getDocumentByKey(cur_uid);
                     if(doc == null) {
                        doc = db.createDocument();   
                        doc.replaceItemValue("Form", "Person");
                        System.out.println("Document created");
                     }   
                     int flag = 0;                                 
                     if(fs != 0) {
                        for(int i=0; i < fs; i++) {
                           String fieldName = (String)fields.elementAt(i);
                           String dbField = doc.getItemValueString(fieldName);
                           String nabField = nabdoc.getItemValueString(fieldName);
                           //case 1: formerly empty field has been filled in nab
                           //case 2: field value has been changed                                          
                           if (((dbField == null || dbField.equals("")) && (nabField != null && !nabField.equals(""))) ||
                              ((nabField == null || nabField.equals("")) && (dbField != null && !dbField.equals(""))) ||
                              (nabField != null && dbField != null && !nabField.equals(dbField))) {
                                 System.out.println("replicated: " + firstname + " " + name + ". Field: " + fieldName);
                                 doc.replaceItemValue(fieldName, nabdoc.getItemValueString(fieldName));
                                 flag++;
                           }                              
                        }                     
                     }      
                     if(flag > 0) {
                        DateTime dt = session.createDateTime("Today");
                        dt.setNow();
                        //String sLocalTime = dt.getLocalTime();
                        //doc.replaceItemValue("LastReplicated", sLocalTime);
                        doc.replaceItemValue("LastReplicated", dt);
                        System.out.println("Time stamp set.");
                        doc.save();   
                        sb.append(cur_uid);
                        sb.append("\n");
                     }   
                     //destroy the doc object
                     doc.recycle();         
                  } else {
                     //user doesn't have a correct email address   
                     System.out.println("No correct email address");
                     sbNotConform.append(cur_uid);   
                     sbNotConform.append("\n");
                  }
      
               }
   
               nabdoc = nabview.getNextDocument(nabdoc);
               System.out.println("Getting next document");
               if (nabdoc != null)
               {
                  System.out.println("Dokument gefunden");
               }
               else
               {
                  System.out.println("Dokument NICHT gefunden");
               }
            }      
            //System.out.println(k);

            /*****************************
             upload string to the server
            *****************************/
            String s = new String(sb);         
            Linlyn u = new Linlyn("einserver", "user", "passwort");
              u.upload(".", "newuseruids.txt",s);
            System.out.println("Created newuserids.txt");         
              //second upload
              String snc = new String(sbNotConform);
                Linlyn unc = new Linlyn("einserver", "user", "passwort");
              unc.upload(".", "notconformuser.txt", snc);
            System.out.println("Recycle session");
                session.recycle();
         }
      } catch(Throwable e) {
         e.printStackTrace();
      }
   }
}



Die letzte Ausgabe auf der Konsole ist immer

08/06/2007 15:51:22   AMgr: Agent ('agentName' in 'admin/application.nsf') printing: Getting next document

Gruß

Stefan
« Letzte Änderung: 07.08.07 - 12:43:10 von machineslave »
Stefan

Das Leben ist ein Scheiß Spiel, aber die Grafik ist geil

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Java Agent auf Server stoppt ohne Fehlermeldung
« Antwort #1 am: 06.08.07 - 18:45:16 »
Bei diesem weder prozeduralen  noch objektorientierten noch funktionalen Code sollte man sowas allein aus Respekt zu James Gosling nicht verraten, aber ersetze einfach

Code
 } catch(Exception e) {
         e.printStackTrace();
      }

mit

Code
 } catch(Throwable t) {
         t.printStackTrace();
      }

Exception nur die Überklasse aller checked Exceptions und Throwable von allen Exceptions.
Gut ist das auch nicht. Aber bei diesem Code muss man die Theory of the second best (http://en.wikipedia.org/wiki/Theory_of_the_Second_Best) anwenden. Wenn alles sowieso schon ziemlich komisch ist und nicht viel Hoffnung auf Besserung besteht, kann man auch zweifelhafte Tricks anwenden.


Dein Kollege hat die "Your code goes here" Aufforderung im Java-Agent Template vielleicht ein bischen zu wörtlich genommen.  ;D
Gruß Axel 

« Letzte Änderung: 06.08.07 - 19:04:47 von Axel Janssen »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline machineslave

  • Senior Mitglied
  • ****
  • Beiträge: 328
  • Geschlecht: Männlich
Re: Java Agent auf Server stoppt ohne Fehlermeldung
« Antwort #2 am: 07.08.07 - 13:10:21 »
Hallo,

ich habe den Code geändert und noch um ein paar Konsolenausgaben erweitert, um zu sehen, woran es hakt.
Der Agent stoppt immer nach n verarbeiteten Dokumenten (n=3089). An dem als nächstes zu verarbeiteten Dokument kann es nicht liegen,; das habe ich mal gelöscht.

Folgendes gibt mir die Konsole als letztes aus:

08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') printing: Total Memory63438848
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') printing: Free Memory61564416
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') printing: UNID: FD5A7CFF782D2BD4C12572980061D871
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') printing: MAIL: mail/maildateiname
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') printing: Mail: WomenCasual.Technic.DE@meinedomaene.com
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') printing: Firstname: WomenCasual Technic
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') printing: Midname:
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') printing: last name: DE
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') printing: Cur_id: 1b215048-e0fc-11db-9797-a356330aa72d
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') printing: Name: WomenCasual Technic DE
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') printing: processing
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') printing: Getting next document
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') printing: Dokument gefunden
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') printing: Total Memory63438848
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') printing: Free Memory61564416
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') error message: [Loaded java.lang.NoSuchMethodException from /opt/lotus/notes/70020/sunspa/jvm/lib/rt.jar]
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') error message: [Loaded java.io.PrintWriter from /opt/lotus/notes/70020/sunspa/jvm/lib/rt.jar]
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') error message: [Loaded java.lang.StackTraceElement from /opt/lotus/notes/70020/sunspa/jvm/lib/rt.jar]

Wie gesagt, die Dokumente sind einwandfrei, da der Agent ohne Fehler auf dem lokalen Notes-Client ausgeführt werden kann.

Gruß

Stefan
Stefan

Das Leben ist ein Scheiß Spiel, aber die Grafik ist geil

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Java Agent auf Server stoppt ohne Fehlermeldung
« Antwort #3 am: 07.08.07 - 15:35:42 »
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') error message: [Loaded java.lang.NoSuchMethodException from /opt/lotus/notes/70020/sunspa/jvm/lib/rt.jar]
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') error message: [Loaded java.io.PrintWriter from /opt/lotus/notes/70020/sunspa/jvm/lib/rt.jar]
08/07/2007 12:52:34   AMgr: Agent ('javaAgent' in 'application.nsf') error message: [Loaded java.lang.StackTraceElement from /opt/lotus/notes/70020/sunspa/jvm/lib/rt.jar]
Das ist wirklich rätselhaft. Kannst du mit ganz vielen System.out.println herausfinden, in welcher Zeile das passiert?

Gruß Axel
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Java Agent auf Server stoppt ohne Fehlermeldung
« Antwort #4 am: 08.08.07 - 10:27:11 »
Der Coder verwendet das Recycling komplett falsch.

du liset in einer Schleife jede Menge Nabdocs ein und machst für diese kein Recycling. Das ist schlecht. Dafür machst du aber ein Session.recycle, das in einem Agent nicht erlaubt ist.

Hier ein sinngemässes Zitat aus der Hilfe:

Recycle darf nur auf Objekte angewendet werden, die man selbst erstellt hat. Du bekommst die Session mit getSession vom AgentManager und sollst ihm daher die Session nicht zerstören.

Also mal das Recycle richtig machen und dann gibt es auch meistens weniger rätselhafte Fehler. Übrigens ist meine Erfahrung, dass der Server auf solche Probleme wesentlich empfindlicher als der Client reagiert.

Grüße

Ralf

Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline machineslave

  • Senior Mitglied
  • ****
  • Beiträge: 328
  • Geschlecht: Männlich
Re: Java Agent auf Server stoppt ohne Fehlermeldung
« Antwort #5 am: 08.08.07 - 11:45:47 »
Danke erstmal für Eure Hilfe.

Da es für mich sehr mühselig ist, diesen Code so umzuschreiben, dass er "vernünftig" gecoded ist, hab ich mich entschlossen, den Agenten in LotusScript umzubauen.
Das schaff ich wenigstens relativ zügig (und kann danach endlich in meinen wohlverdienten Urlaub gehen  :D)

Gruß

Stefan

P.S.: Ich hasse es, Code von anderen zu übernehmen .... :P
Stefan

Das Leben ist ein Scheiß Spiel, aber die Grafik ist geil

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz