Autor Thema: Error cleaning up agent threads und WeakReference...  (Gelesen 37656 mal)

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Error cleaning up agent threads und WeakReference...
« Antwort #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.
sagt Mark.



slowfood.de

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Error cleaning up agent threads und WeakReference...
« Antwort #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?
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Error cleaning up agent threads und WeakReference...
« Antwort #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.
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 Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Error cleaning up agent threads und WeakReference...
« Antwort #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  ;D

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...
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Error cleaning up agent threads und WeakReference...
« Antwort #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.
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 flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Error cleaning up agent threads und WeakReference...
« Antwort #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.  ;D
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 Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Error cleaning up agent threads und WeakReference...
« Antwort #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³ »
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Error cleaning up agent threads und WeakReference...
« Antwort #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  ???

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ß).


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 Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Error cleaning up agent threads und WeakReference...
« Antwort #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...
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Error cleaning up agent threads und WeakReference...
« Antwort #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 »
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 Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Error cleaning up agent threads und WeakReference...
« Antwort #50 am: 13.04.06 - 11:31:06 »
und wenn ich den Code so wie von mir beschrieben verwende? Gibt es dann Probleme?
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Error cleaning up agent threads und WeakReference...
« Antwort #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
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 Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Error cleaning up agent threads und WeakReference...
« Antwort #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...
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Error cleaning up agent threads und WeakReference...
« Antwort #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)

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 Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Error cleaning up agent threads und WeakReference...
« Antwort #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;
}
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Error cleaning up agent threads und WeakReference...
« Antwort #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.
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 Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Error cleaning up agent threads und WeakReference...
« Antwort #56 am: 13.04.06 - 15:57:44 »
jaaaaa, mehr davon  :D

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  ;D besser)
sagt Mark.



slowfood.de

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Error cleaning up agent threads und WeakReference...
« Antwort #57 am: 13.04.06 - 16:09:32 »
eigentlich läuft es nun. Aber schon im ersten Belastungstest komme ich an irgendwelche Socketgrenzen  >:D

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   :'(

Gibts da ne Begrenzung inWindows oder in TCP oder im ServerSocket-Objekt?
sagt Mark.



slowfood.de

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Re: Error cleaning up agent threads und WeakReference...
« Antwort #58 am: 13.04.06 - 16:48:47 »
vielleicht ist es irgendein Wondows-Hotfix gegen DoS !?

Naja frohe Ostern und bis nächste Woche  O0
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Error cleaning up agent threads und WeakReference...
« Antwort #59 am: 13.04.06 - 17:52:43 »
jaaaaa, mehr davon  :D
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
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

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz