Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino

Error cleaning up agent threads und WeakReference...

<< < (10/19) > >>

flaite:
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

Mark³:
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();
}
}
}

--- Ende Code ---

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]);
--- Ende Code ---
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...)

flaite:
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;
}
}

--- Ende Code ---

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


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

flaite:
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;
}

--- Ende Code ---

Aber Singleton in Java ist wirklich so.

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln