Moin, moin,
leider ist mein Problem mit Java und Serverabstürzen noch nicht endgültig ausgeräumt. Beim letzten Problem wurde mir sehr kompetent geholfen.
Jetzt stehe ich vor dem Dilemma, daß mein Agent die Dokumente in der DB gegen das LDAP prüfen soll. Also laufe ich über alle Dokumente (ca. 30.000) der DB und prüfe, ob im LDAP noch entsprechende Daten vorhanden sind.
Auf meinem lokalen Client läuft das auch prima. Auf dem Server gibt es einen Komplettabschuß. Der Server steht nach ca. 30s komplett und muß neu gestartet werden.
In einer Dumpdatei fand ich folgenden Output:
High number of handles (116) for private memory block 0x11b3
~~~~~~~~~~~~~~~~~~~~
Process amgr: Handle table is full:
Num Handles= 6399, Max Handles= 6399, Avail= 0
Num MemHandles= 128, Max MemHandles= 1048576, Avail=1048448
~~~~~~~~~~~~~~~~~~~~
Ich hänge mal den Code an, damit jeder sich ein Bild machen kann, was in meinem Agenten so abläuft.
Ich habe recycelt, was zu recyclen war. Glaube ich zumindest!
Aber ich lasse mich gerne vom Gegenteil überzeugen.
import lotus.domino.*;
import javax.naming.*;
import javax.naming.directory.*;
import java.io.IOException;
import java.util.Hashtable;
import javax.naming.ldap.*;
public class JavaAgent extends AgentBase {
//... diverse Variablen
static String sn = "";
static String employeeType = "";
public void searchAID(LdapContext ctx, Log log, Document activeDoc,
SearchControls ctls) {
try {
if (activeDoc.getItemValueString("AID").length() < 7) {
System.out.println("aid = leer in searchAID");
} else {
String filter = "(& (uid=" + activeDoc.getItemValueString("AID")+ ")(objectClass=ivvSIActiveUser))";
System.out.println("Suche: uid="
+ activeDoc.getItemValueString("AID"));
NamingEnumeration answer = ctx.search("", filter, ctls);
if (answer != null && answer.hasMore()) {
// do nothing
} else {
System.out.println("Doc mit AID in DIRX nicht vorhanden");
// Document markieren, wenn es gelöscht werden soll
activeDoc.appendItemValue("delete", "ja");
activeDoc.save(true, true);
}
answer.close();
// System.out.println("searchAID beendet");
}
} catch (NamingException es) {
System.out.println("NamingException aufgetreten in searchAID");
es.printStackTrace();
} catch (Exception e) {
System.out.println("Exception aufgetreten in searchAID");
e.printStackTrace();
}
}// Ende searchAID
public void searchVTRNR(LdapContext ctx, Log log, Document activeDoc,
SearchControls ctls) {
// wenn die VTRNR nicht gefunden wird, Doc löschen
try {
if (activeDoc.getItemValueString("NVTRNR").equals("")) {
System.out.println("vtrnr = leer in searchVTRNR");
} else {
String filter = "(& (ivvAgentFullNumber =" + activeDoc.getItemValueString("NVTRNR")+ ")(objectClass=ivvAgency))";
NamingEnumeration answer = ctx.search("", filter, ctls);
if (answer != null && answer.hasMore()) {
System.out.println("Doc mit VTRNR in DIRX gefunden");
// do nothing
} else {
System.out.println("Doc mit VTRNR in DIRX nicht vorhanden");
// Document markieren, wenn es gelöscht werden soll
activeDoc.replaceItemValue("delete", "ja");
activeDoc.save(true, true);
}
answer.close();
}
} catch (NotesException es) {
System.out.println("NotesException aufgetreten in searchAID");
es.printStackTrace();
} catch (Exception e) {
System.out.println("Exception aufgetreten in searchVTRNR");
e.printStackTrace();
}
}// Ende searchVTRNR
public void controldocs(Database db, Log log, LdapContext ctx,
SearchControls ctls) {
try {
View View = db.getView("ALLES");
System.out.println("View geholt");
View.refresh();
DocumentCollection coll = db.getAllDocuments();
Document activeDoc = coll.getFirstDocument();
System.out.println("View enthält "
+ View.getAllEntries().getCount() + " Docs");
System.out.println("First Doc geholt");
while (activeDoc != null) {
if (activeDoc.getItemValueString("AID").length() == 7) {
searchAID(ctx, log, activeDoc, ctls);
} else {
if (activeDoc.getItemValueString("NVTRNR").length() == 9) {
if (!activeDoc.getItemValue("NVTRNR").isEmpty()) {
searchVTRNR(ctx, log, activeDoc, ctls);
}
}
}
// activeDoc.recycle();
activeDoc = coll.getNextDocument();
}
System.out.println("DelView holen");
View DelView = db.getView("DelView");
DelView.refresh();
System.out.println("DelView refreshen");
ViewEntryCollection DelCol = DelView.getAllEntries();
System.out.println("DelView mit " + DelCol.getCount()
+ " Dokumenten leeren");
DelCol.removeAll(true);
System.out.println("DelView leeren");
System.out.println("controldocs Ende");
} catch (NotesException es) {
System.out.println("NotesException aufgetreten in controldocs");
es.printStackTrace();
} catch (Exception e) {
System.out.println("Exception aufgetreten in controldocs");
e.printStackTrace();
}
}// Ende controldocs
public static void deletedoc(Database db, Document doc) {
try {
// doc.removePermanently(true);
doc.replaceItemValue("delete", "ja");
doc.save(true, true);
} catch (Exception e) {
System.out.println("Exception aufgetreten in deletedoc");
e.printStackTrace();
}
}
public void NotesMain() {
Database db;
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
db = agentContext.getCurrentDatabase();
Log log = session.createLog("Neuer LDAP_Vertreterdatenabgleich #2");
// log.openNotesLog("N-H-DB01", "agentlog.nsf");
log.openNotesLog("", "agentlog.nsf");
log.logAction("Agent gestartet");
if (db.isFTIndexed()) {
System.out.println("db.isFTIndexed");
String ldapCF = "com.sun.jndi.ldap.LdapCtxFactory";
String ldapURL = "ldap://xyzserver:389/";
String ldapBaseDN = "o=verbund,c=DE";
String ldapUserID = "cn=xyz,cn=Notes,cn=Applications,o=ivv-verbund,c=DE";
String ldapPassword = "kennwort";
Hashtable env = new Hashtable(4);
env.put(Context.INITIAL_CONTEXT_FACTORY, ldapCF);
env.put(Context.PROVIDER_URL, ldapURL + ldapBaseDN);
env.put(Context.SECURITY_PRINCIPAL, ldapUserID);
env.put(Context.SECURITY_CREDENTIALS, ldapPassword);
String[] attrs = new String[19];
attrs[0] = "ivvAgentFullnumber";
...
...
attrs[16] = "sn";
attrs[17] = "uid";
attrs[18] = "givenName";
try {
long startTime = System.currentTimeMillis();
LdapContext ctx = new InitialLdapContext(env, null);
int pageSize = 500; // 1000 entries per page
byte[] cookie = null;
int total;
ctx
.setRequestControls(new Control[] { new PagedResultsControl(
pageSize, Control.NONCRITICAL) });
int a = 0;
int b = 0;
int c = 0;
// Alle Dokumente aus der DB überprüfen gegen das Dirx
long chkTimeStart = System.currentTimeMillis();
SearchControls ctls = new SearchControls();
ctls.setReturningAttributes(attrs);
ctls.setSearchScope(2);
System.out.print("controldocs gestartet");
controldocs(db, log, ctx, ctls);
ctx.close();
//...diverse Ausgaben auf die Konsole und in die LOG.NSF
log.close();
} catch (NamingException e) {
e.printStackTrace();
System.out.println("Fehler aufgetreten in NamingException");
} catch (IOException e) {
e.printStackTrace();
System.out.println("Fehler aufgetreten in IOException");
} catch (Throwable t) {
t.printStackTrace();
System.out.println("Fehler aufgetreten in NotesMain");
}
} else {
System.out
.println("Datenbank ist nicht Volltextindiziert --> TAS melden und einrichten lassen");
}
} catch (Throwable t) {
t.printStackTrace();
System.out.println("Fehler aufgetreten in NotesMain");
}
}
} // end of NotesMain
Ich hoffe auf eure Hilfe,
Martin