AtNotes Übersicht Willkommen Gast. Bitte einloggen oder registrieren.
01.12.21 - 14:11:56
Übersicht Hilfe Regeln Glossar Suche Einloggen Registrieren
News:
Schnellsuche:
+  Das Notes Forum
|-+  Lotus Notes / Domino Sonstiges
| |-+  Java und .NET mit Notes/Domino (Moderatoren: Axel, m3)
| | |-+  Error cleaning up agent threads und WeakReference...
« vorheriges nächstes »
Seiten: 1 2 [3] 4 5 Nach unten Drucken
Autor Thema: Error cleaning up agent threads und WeakReference...  (Gelesen 36255 mal)
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #40 am: 12.04.06 - 11:36:37 »

ich habe jetzt eine Schleife im ClientThread erstellt:
Code:
while ((inputLine = in.readLine()) != null) {
outputLine = ovp.processInput(inputLine);
out.println(outputLine);
if (outputLine.equals("bye"))
    break;
    }
In meinem Protocol liefere ich "bye" sobald kein bekannter Befehl gesendet wird

Mein Client liefert nun beliebig viele Befehle (aber ohne Schleife sondern sequentiell) :
Code:
ovSocket = new Socket("myhostname", 3000);
    out = new PrintWriter(ovSocket.getOutputStream(), true);
    in = new BufferedReader(new InputStreamReader(ovSocket
    .getInputStream()));
   
    out.println("set_ackreceipt#Key1");
    System.out.println(in.readLine());
    out.println("set_ackreceipt#Key2");
    System.out.println(in.readLine());
    out.println("remove_ackreceipt#Key1");
    System.out.println(in.readLine());
    out.println("remove_ackreceipt#Key2");
    System.out.println(in.readLine());
    out.println("bye");
    out.close();
    in.close();
    ovSocket.close();

Scheint zu klappen. Vorhin hatte ich ein paar Mal einen Socketabbruch (Software caused connection abort: recv failed) aber seit dem habe ich den Code schon wieder an einigen Stellen verändert und momentan läuft es stabil. Auch von Notes aus.
Gespeichert

sagt Mark.



slowfood.de
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #41 am: 12.04.06 - 13:10:19 »

jetzt habe ich nur noch ein Java- und Openview-spezifisches Problem:

Eine Verbindung zu Openview erhalte ich mit dem Objekt ApiSDSession.getSession(), welches mir wieder ein ApiSDSession liefert.
Nun gibt es zwar die Methode closeConnection(), nicht aber einen Test, ob die Verbindung noch aktiv ist. Nach einer Stunde Leerlauf (oder bei Server- oder Netzwerkproblemen) wird die Session aber abgebaut. Wie und wo in meinem Konstrukt aus Server, ClientThreads und Protocol prüfe ich nun, ob eine Session noch da ist und wenn nicht erstelle ich automatisch eine neue?
Das Objekt ApiSDSession ist ja auch noch vorhanden, wenn die Verbindung nicht mehr vorhanden ist. Sobald ich aber eine Methode nutze, die auf die Session zugreift werde ich wohl irgendeinen Laufzeitfehler bekommen.
Das heisst wohl, dass ich in irgendeiner catch-Bedingung die Logik platzieren muss, wieder eine neue Session aufzubauen?
Gespeichert

sagt Mark.



slowfood.de
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2966


WWW
« Antworten #42 am: 12.04.06 - 13:43:05 »

Ich würde die Session grundsätzlich nach Gebrauch explizit schliessen.
Vermutlich die Session in einer eigenen Klasse wrappern. Im Problemfall kannst du ja auch auf Exceptions reagieren, die kommen, wenn die Connection nicht da ist, du aber die entsprechenden Methoden aufrufst. Du wirst vermutlich keine Runtime-Exception bekommen sondern eine checked Exception. Trotzdem besser die Exception schliessen.
Aber auch Runtime-Exceptions kann man ja abfangen (catch (Throwable t)
Ganz elegant wäre die Lösung über einen Connection Pool. Aber das kann schwierig sein. V.a. wenn du den Source code nicht hast. Aber vielleicht hat der Hersteller schon so etwas.
Gespeichert

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
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #43 am: 12.04.06 - 15:23:44 »

die Exception, die ich nach einem Timeout bekomme sieht so aus:

Zitat
Your session on the server has timed out. Click OK to log on, then try again.

Ist immer lustig, wenn in Backend-Code Frontend-Fehlermeldungen kommen  Grin

Wenn ich die abfangen möchte, muss ich dann exception.getMessage() mit diesem String vergleichen? Leider gibt es zur web-api nicht so eine gute Dokumentation...
Ich könnte ja in meiner zentralen Connection-Verwaltung eine Methode einbauen, die session.getUsername macht. Sollte hier irgendein Fehler auftreten würde ich dann einfach eine neue Session aufmachen und die dann zurückgeben.
Finde ich nicht so elegant, aber anders scheint das wohl nicht zu gehen...
Gespeichert

sagt Mark.



slowfood.de
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2966


WWW
« Antworten #44 am: 12.04.06 - 16:55:02 »

Hm. Du solltest diese Exception auf dem Server in eine RemoteException packen. Man kann ja seit 1.3 Exceptions chainen. Der Server ist Client von OpenView
Code:
try { } catch(TimeoutException te) {
throw new RemoteException ("OpenViewConnection failed", te); }
oder du machst eine neue Klasse OpenViewConnectionException extends RemoteException
so ungefähr.
Meine Idee mit dem Wrapper war Quatsch. Eine zentrale ConnectionFactory ist ok würd ich jetzt sagen.
Gespeichert

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
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2966


WWW
« Antworten #45 am: 13.04.06 - 05:59:06 »

Was ich da gesagt habe, ist bezogen auf deine Idee dort reine Strings zu übertragen kompletter Blödsinn.
Versuch das mal am WE mit serialisierbaren Command-Objekten.
RMI basiert übrigens auf Sockets. Dort gibt es einen übersichtlichen Mechanismus für Exceptions. Gehen tut es also.  Grin
Gespeichert

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
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #46 am: 13.04.06 - 09:15:44 »

meine Aufrufe nach Openview will ich nun in einer einzigen Session bündeln. Dafür erstelle ich eine Klasse, die bei jeder Verbindung genutzt werden soll, damit nie mehr als eine Session geöffnet ist. Daher wollte ich das als Singleton machen, aber irgendwie ist mir das wieder etwas verwässert. Haut das so hin? Erstmal der Code:

Code:
public class OV {
private static OV instance = null;

private ApiSDSession session;

private String srv;

private String usr;

private String pwd;

public OV(String srv, String usr, String pwd) {
this.srv = srv;
this.usr = usr;
this.pwd = pwd;

instance = this;
}

public static ApiSDSession getSession() {
try {
// check if session is usable
IBrandHome dummy = instance.session.getBrandHome();
return instance.session;

} catch (Exception e) {
// dummy not available that means no valid session
try {
instance.session = ApiSDSession.openSession(instance.srv,
instance.usr, instance.pwd);
return instance.session;
} catch (Exception ex) {
e.printStackTrace();
return null;
}
}
}

public static void disconnect() {
instance.session.closeConnection();
}

public static void connect() {
try {
instance.session = ApiSDSession.openSession(instance.srv,
instance.usr, instance.pwd);
} catch (Exception e) {
e.printStackTrace();
}
}
}

Die Nutzung ist folgende: Wenn der Server hochfährt übergibt er die Anmeldedaten an diese Klasse:

Code:
OV ov = new OV(args[0], args[1], args[2]);
ohne hier mehr damit zu machen.

Bei jedem Zugriff auf Openview wird in meinem Protocol nun folgendes aufgerufen:

OV.connect();
Nutzung der session über OV.getSession()
OV.disconnect();

Ich erzeuge also im Server eine statische Instanz und nutze diese dann später über statische Aufrufe der Klasse. Macht man das so oder ist das irgendwie komisch? Beim Singleton holt man sich ja eigentlich eine Instanz, die innerhalb des Singletons immer das gleiche statische Objekt liefert!?

(hab noch mal den Konstruktor geändert...)
« Letzte Änderung: 13.04.06 - 09:21:57 von Mark³ » Gespeichert

sagt Mark.



slowfood.de
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2966


WWW
« Antworten #47 am: 13.04.06 - 09:50:10 »

Wenn ich dich richtig verstehe, dann würde dies zur Folge haben, dass du multithreading vergessen kannst  Huh

Singleton implementierst du mit Java ungefähr so:


Code:
public class OV {

private static OV inst = null;

// constructors sind private.
private OV() {}

private OV(String srv, String usr, String pwd) {
this.srv = srv;
this.usr = usr;
this.pwd = pwd;
}


// hierüber bekommt man das Singleton.
public static OV getInst(String srv, String usr, String pwd) {
 if (OV.inst = null) {
   OV.inst = new OV(srv, usr, pwd);
 }
 return OV.inst;
}
}

Gibt noch ein paar gotchas mit multithreading und serialisierten Objekten, die z.B. in Joshua Blochs, Effective Java stehen.

Aber, warum?
Die Factory für die Session Objekte kann man vielleicht als Singleton erstellen. Aber von den Connections selber können doch wohl mehrere gleichzeitig aktiv sein, oder?

Btw. sind IOC frameworks (z.B. spring) wirklich viel besser als klassische Architekturen, die immer darauf hinauslaufen, dass es da diese ganzen Singleton-Factories gibt, die über den Source Code verstreut aufgerufen werden.
Und dann ändere mal den Construktor der Singleton-Factory... (ist mir oft passiert. macht keinen Spaß).


Gespeichert

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
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #48 am: 13.04.06 - 10:17:55 »

multithreading heißt für mich, dass von verschiedenen Rechnern aus gleichzeitig Aktionen durchgeführt werden können. Ob Openview schneller arbeitet wenn ich von meinem Server 7 Befehle innerhalb einer Session parallel anstosse oder das gleiche innerhalb von 7 parallelen Sessions weiß ich nicht. Für mich würde aber der erste Fall von beiden auch ok sein. Es wäre dann so, als würde ich meinen Openview-Client öffnen (1 Session) aber 7 Fenster gleichzeitig öffnen und in jedem was anderes machen.

Bei der untigen Singleton-Implementierung stört mich, dass ich über getInstance jedesmal User, Password etc mitschicken muss. Ich wollte das einmalig machen und dann später nur noch connect und disconnect nutzen.

Hab nun auch mal log4j eingebunden, dann wird mir das endlich mal transparenter was wirklich abläuft...
Gespeichert

sagt Mark.



slowfood.de
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2966


WWW
« Antworten #49 am: 13.04.06 - 11:16:11 »

Aber beim ersten Aufruf sind diese Parameter notwendig.

Du kannst so was hinzufügen:
Es muß über die getInst mit Parametern initialisiert werden, kann aber ohne Parameter geholt werden.

Code:
public static OV getInst() throws InstantiationException {

if (OV.inst == null) {
   throw new InstantiationException ("Der Singleton OW kann von aussen nur über den Aufruf Ov.getInst(String, String, String) initialisiert werden.")
   
}
return OV.inst;
}

Aber Singleton in Java ist wirklich so.
« Letzte Änderung: 13.04.06 - 11:18:02 von Axel Janssen » Gespeichert

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
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #50 am: 13.04.06 - 11:31:06 »

und wenn ich den Code so wie von mir beschrieben verwende? Gibt es dann Probleme?
Gespeichert

sagt Mark.



slowfood.de
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2966


WWW
« Antworten #51 am: 13.04.06 - 11:40:18 »

Multithreaded drauf zugreifen?
Ob das geht, das hängt von openView ab.
Das mußt du testen oder du kannst vermutlich auch die Entwickler fragen. Die sollten das wissen.

Gruß Axel
Gespeichert

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
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #52 am: 13.04.06 - 12:49:48 »

meine 'Serialisierung' mache ich durch aneinanderketten von Strings und einem Trennzeichen ('#' im Moment).
Code:
StringTokenizer splitter = new StringTokenizer(result, SEP);
Vector v = new Vector(splitter.countTokens());
while (splitter.hasMoreTokens()) {
v.addElement(splitter.nextToken());
}
mit v.elementAt(0) z.B. hole ich mir dann die Werte. Das ist aber irgendwie blöd, da bei null-Werten (also zwei ## hintereinander) der Tokenizer nix liefert und dann meine Anzahl von Elementen variiert. Kann Java keinen split() wie in Javascript oder Lotusscript? Ich finde irgendwie nix dazu pbwohl das doch sicher jeder ständig benutzt...
Gespeichert

sagt Mark.



slowfood.de
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2966


WWW
« Antworten #53 am: 13.04.06 - 13:47:18 »

meine 'Serialisierung' mache ich durch aneinanderketten von Strings und einem Trennzeichen ('#' im Moment).
Ich poste mal ein Beispiel mit serialisierten Objekten über Sockets. Aus meiner Sicht ist das objektiv einfacher.

Seit java 1.4 existiert eine split Methode in java.lang.String. Laß dir von dem regex nicht abschrecken. Das Beispiel sollte auf deinen Fall passen:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#split(java.lang.String)

Gespeichert

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
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #54 am: 13.04.06 - 14:48:03 »

das ist doch genau das, was ich gesucht habe...

Leider hab ich natürlich vergessen, dass ich erst nächste Woche die Server auf Domino 7 upgrade und dass die Clients auf 6.0.3 bleiben :-(

Zitat
error message: java.lang.NoSuchMethodError: java.lang.String: method split(Ljava/lang/String;)[Ljava/lang/String; not found

Mein Objekt Server läuft zwar in einer eigenen VM, aber die Clients (also Notesagenten) müssen ja die Antwort auswerten...

Nun nehme ich wohl dieses hier (Quelle: http://forum.java.sun.com/thread.jspa?threadID=646861&messageID=3808970

Code:
/**
 * Split string into multiple strings
 * @param original      Original string
 * @param separator     Separator string in original string
 * @return              Splitted string array
 */
private String[] split(String original, String separator) {
    Vector nodes = new Vector();
 
    // Parse nodes into vector
    int index = original.indexOf(separator);
    while(index>=0) {
        nodes.addElement( original.substring(0, index) );
        original = original.substring(index+separator.length());
        index = original.indexOf(separator);
    }
    // Get the last node
    nodes.addElement( original );
 
    // Create splitted string array
    String[] result = new String[ nodes.size() ];
    if( nodes.size()>0 ) {
        for(int loop=0; loop<nodes.size(); loop++)
        result[loop] = (String)nodes.elementAt(loop);
    }
    return result;
}
Gespeichert

sagt Mark.



slowfood.de
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2966


WWW
« Antworten #55 am: 13.04.06 - 15:13:19 »

... oder jakarta.commons. Da hätte ich als nächstes gesucht:
http://jakarta.apache.org/commons/lang/api-release/org/apache/commons/lang/StringUtils.html
Da gibt es auch eine split Methode.
Gespeichert

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
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #56 am: 13.04.06 - 15:57:44 »

jaaaaa, mehr davon  Cheesy

sowas suchte ich doch. In Notes weiß ich ja, wo ich was finde, aber in Java ist alles so groß und unübersichtlich, da muss ich erstmal Erfahrungen sammeln, was man immer einbaut und wo man es findet. Wie z.B. log4j, das ist genauso wie OpenLog in Notes ein absolutes muss in jeder Anwendung.
(es gibt ja auch log4LS von Johan Känngard analog zu log4j aber da gefällt mir OpenLog von Robincheaux  Grin besser)
Gespeichert

sagt Mark.



slowfood.de
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #57 am: 13.04.06 - 16:09:32 »

eigentlich läuft es nun. Aber schon im ersten Belastungstest komme ich an irgendwelche Socketgrenzen  Evil

Code:
while (true) {
Socket socket = httpd.accept();
(new ClientThread(socket)).start();
}

nach etwa 6 mal Thread starten und wieder beenden bleibt er bei httpd.accept() endlos stehen und auch meine beiden Testclients warten nun endlos. Keine Fehlermeldung, aber auch keine neue Socketverbindung   Cry

Gibts da ne Begrenzung inWindows oder in TCP oder im ServerSocket-Objekt?
Gespeichert

sagt Mark.



slowfood.de
Mark³
Senior Mitglied
****
Offline Offline

Geschlecht: Männlich
Beiträge: 386


Nordisch by Nature


WWW
« Antworten #58 am: 13.04.06 - 16:48:47 »

vielleicht ist es irgendein Wondows-Hotfix gegen DoS !?

Naja frohe Ostern und bis nächste Woche  Afro
Gespeichert

sagt Mark.



slowfood.de
flaite
Gold Platin u.s.w. member:)
*****
Offline Offline

Beiträge: 2966


WWW
« Antworten #59 am: 13.04.06 - 17:52:43 »

jaaaaa, mehr davon  Cheesy
jakarta-commons ist immer eine gute Anlaufstelle für grundlegende Sachen.
Hani Suleiman hat zwar ca. 719 bösartige Bemerkungen über jakarta commons Programmierer gemacht, aber ich finde da übertreibt er ein bischen.

Solltest du irgendwann einmal etwas mit Daten in Java machen, komme nicht auf den Gedanken, dass mit den Klassen java.util.Calendar (inklusive aller konkreten Implementierer wie java.util.GregorianCalendar), java.util.Date oder java.sql.Date alleine zu machen. Benutze auf jeden Fall JodaTime.

Gibts da ne Begrenzung inWindows oder in TCP oder im ServerSocket-Objekt?
Nein. Du hast irgendwas falsch gemacht. Deshalb insistiere ich ja so auf Objekte austauschen und nicht: Ha-Ha Programmierung ist einfach. Alles sind Strings. Das klappt in aus meiner Erfahrung in 80% der Fälle nicht.
RMI, EJB Implementierungen und eine Menge weiterer Sachen basieren auch java.net.Socket-Zeugs.

Gruß Axel
Gespeichert

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
Seiten: 1 2 [3] 4 5 Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  


Einloggen mit Benutzername, Passwort und Sitzungslänge

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006, Simple Machines Prüfe XHTML 1.0 Prüfe CSS
Impressum Atnotes.de - Powered by Syslords Solutions - Datenschutz | Partner: