Swing GUI Client der mit J2EE Application Server kommuniziert

Hubivan

Mitglied
Also ich habe folgendes Problem/Aufgabe

Ziel ist es eine bestehende Anwendung (mit Swing GUI), die direkt auf eine Datenbank zugreift umzubauen um Transaktionssicherheit zu gewinnen.

Irgendjemand hatte dann wohl die Idee, dass J2EE Application Server ja für Webanwendungen die "Transaktionssicherheit" quasi bereistellen (Stichwort Transactionlevel).

Die bisher reine Swing Anwendung soll nun durch eine Anwendung auf einem Application Server ergänzt werden, der für die Anwendung dann quasi die Datenbankanfragen übernimmt.Die Datenbankanfragen selbst werden aber schon vom Client erstellt und "einzeln" losgeschickt.

GUI Client <----- redet mit -----> EJB Anwendung <----- redet mit ----> Datenbank.

Geht das eigentlich? bzw ist das sinnvoll?

Kann ein GUI Client sich eigentlich mit einem Application Server unterhalten, oder geht das nur bei Webanwendungen? (also mit JSP, Servlets und Co.)
 
Zuletzt bearbeitet:
Das geht sehr gut, ist sogar eine sehr häufig anzufindende Architektur. Im Prinzip ist der Fatclient einfach nur eine Presentation in deiner Remote VM.

Grundsätzlich frag ich mich aber, was Transaktionalität mit ner Client / Serverarchitektur zu tun hat. Oder genauer: warum muss ein ApplicationServer her um Transaktionalitä zu haben. Jede einfache JDBC Verbindung kann transaktional sein (insofern es die DB unterstützt). Klar coded man sowas im Normalfall nicht selber, aber warum gleich die Verteilungsarchitektur umwälzen? Sowas bringt nämlich auch einer Reihe von Overhead mit sich: die Daten müssen übers Netzwerk (Volumen / Zeit), LazyLoading, Gestaltung der Remoteschnittstelle serverseitig usw usw.

Zum anderen garantiert kein AS Transaktionssicherheit. Er bietet allerhöchstens Dienste zur Verwaltung von Transaktionen (JTA usw.).

Grundsätzlich solltet ihr euch mal Spring anschauen. Es bietet jede Menge Unterstützung für Transaktionalität (gut strukturierten Code vorrausgesetzt, kann man eine Anwendung mit Spring u.U. sogar transaktional machen ohne eine Zeile Code anzufassen oder zu schreiben). Vor allem bietet es eine einheitliche Abstraktion über alle Formen (JTA, DataSource, JPA) der Transaktionen hinweg.

Falls ihr unbedingt den Server mit ins Spiel bringen wollt, würde ich trotzdem keinen AS benutzen. Erstens ist der performancehungriger, aufwändiger zu administrieren und kann für euren Anwendungsfall nichts, was nicht auch in einem Tomcat oder Jetty läuft.

Joa, genug Gedanken für den Anfang?

Gruß
Ollie
 
Das geht sehr gut, ist sogar eine sehr häufig anzufindende Architektur. Im Prinzip ist der Fatclient einfach nur eine Presentation in deiner Remote VM.

Ja, das hatte ich mir fast gedacht, denn prinzipiell dürfte es einem Server ja egal sein woher er sein HTTP Request bekommt (egal ob Browser oder sonst was) solange, das Request korrekt aufgebaut ist, oder? Andere Client Server Architekturen kommunizieren ja auch über HTTP.

Grundsätzlich frag ich mich aber, was Transaktionalität mit ner Client / Serverarchitektur zu tun hat. Oder genauer: warum muss ein ApplicationServer her um Transaktionalität zu haben. Jede einfache JDBC Verbindung kann transaktional sein (insofern es die DB unterstützt).
Klar coded man sowas im Normalfall nicht selber, aber warum gleich die Verteilungsarchitektur umwälzen? Sowas bringt nämlich auch einer Reihe von Overhead mit sich: die Daten müssen übers Netzwerk (Volumen / Zeit), LazyLoading, Gestaltung der Remoteschnittstelle serverseitig usw usw.

Zum anderen garantiert kein AS Transaktionssicherheit. Er bietet allerhöchstens Dienste zur Verwaltung von Transaktionen (JTA usw.).

Dazu fallen mir nur zwei Sachen ein: "Nicht meine Idee" und "Buzzword-Bingo".

Grundsätzlich solltet ihr euch mal Spring anschauen. Es bietet jede Menge Unterstützung für Transaktionalität (gut strukturierten Code vorrausgesetzt, kann man eine Anwendung mit Spring u.U. sogar transaktional machen ohne eine Zeile Code anzufassen oder zu schreiben). Vor allem bietet es eine einheitliche Abstraktion über alle Formen (JTA, DataSource, JPA) der Transaktionen hinweg.

Danke für den Tipp, ich werd mal versuchen das ganze ins Gespräch bringen das Projekt steht Entwicklungsmäßig glücklicherweise erst in den Startlöchern und die Architektur ist auch noch nicht zementiert (hoffe ich jedenfalls).

Falls ihr unbedingt den Server mit ins Spiel bringen wollt, würde ich trotzdem keinen AS benutzen. Erstens ist der performancehungriger, aufwändiger zu administrieren und kann für euren Anwendungsfall nichts, was nicht auch in einem Tomcat oder Jetty läuft.

Joa, genug Gedanken für den Anfang?

Gruß
Ollie

Das mit dem Server könnte durchaus noch relevant sein (unabhängig von der Transaktionaliät), da zudem der Gedanke im Raum steht aus dem Fat-Client einen Thin-Client zu machen und die einen Großteil der Logik in den Server zu verlagern.

Aber wie würd ich dann ohne Beans etc mit einem Tomcat Transaktionalität erreichen können? Hast du ein paar Stichworte oder was anderes für mich, dass mir da weiterhelfen könnte?
 
Zuletzt bearbeitet:
Ja, das hatte ich mir fast gedacht, denn prinzipiell dürfte es einem Server ja egal sein woher er sein HTTP Request bekommt (egal ob Browser oder sonst was) solange, das Request korrekt aufgebaut ist, oder? Andere Client Server Architekturen kommunizieren ja auch über HTTP.
Falls ihr wirklich Client / Server macht, solltet ihr euch das Transportprotokoll gut überlegen. HTTP ist gut und verlässlich aber auch recht langsam. Denkbar wären z.B. auch RMI (sauschnell, aber evtl Portprobleme, je nachdem auf welchen Maschinen eure CLients laufen - Stichwort: beim Kunden, oder bei euch), Hessian, Burlap usw.

Dazu fallen mir nur zwei Sachen ein: "Nicht meine Idee" und "Buzzword-Bingo".
Gut, das kenn ich auch. Allerdings sollte man auf sowas keine Architekturentscheidungen aufbauen.

Das mit dem Server könnte durchaus noch relevant sein (unabhängig von der Transaktionaliät), da zudem der Gedanke im Raum steht aus dem Fat-Client einen Thin-Client zu machen und die einen Großteil der Logik in den Server zu verlagern.
Das macht je nach Anwendung Sinn. Allerdings kommt dann das Thema "Performance über die Leitung" zum tragen. Zu viele feingranulare Calls killen jede Performance, so dass man meist recht grobe Aufrufe macht. Dann bist du aber fast wieder bei einer Webanwendung. Desweiteren sollte man dann nen gutes Cachingkonzept haben.

Aber wie würd ich dann ohne Beans etc mit einem Tomcat Transaktionalität erreichen können? Hast du ein paar Stichworte oder was anderes für mich, dass mir da weiterhelfen könnte?
Wie ich ja schon sagte, hat Transaktionalität ja grundsätzlich erstmal nichts mit der Plattform zu tun. Das Connection Interface bietet ja erstmal alles was du brauchst um Transaktionen zu fahren. Da der geneigte Javaentwickler allerdings ungern auf Händen und Knien durch den Schlamm kriecht, gibt es da Frameworks bzw. Standards. EJB bringt sowas als Dienst mit - das hattest du ja schon erwähnt. Allerdings braucht nicht jede Javaanwendung (im Grunde genommen brauchen ihn vielleich 10% der Javaanwendungen) einen Applicationserver, den EJB vorraussetzt (genau genommen ja nur einen EJB container, aber den gibt es fast nur innerhalb eines AS).
Die Alternative ist halt der Einsatz von Spring und dessen Transaktionsabstraktion. Damit kannst du auf verschiedene Arten und Weisen Transaktionalität KONFIGURIEREN. Zum einen gibt es (sehr stark vereinfacht) die Möglichkeit zu sagen: Alle Methoden der Klassen aus dem package foo.bar die mit *Service enden sollen Transaktional sein. Alle Methoden, die mit get* anfangen sollen zusätzlich das ReadOnly Flag bekommen. Damit brauchst du nichtmal den Geschäftscode anfassen, vorrausgesetzt, es lässt sich mit endlchem Aufwand so ein "Pattern" ermitteln. Wenn man allerdings nicht mit dieser Art Transaktionssteuerung gerechnet hat, geht das oft nicht.

Die andere Variante das mit Spring zu konfigurieren sind Annotations. @Transactional an die Methoden, die Transaktional sein sollen und der Laden läuft (ein wenig Infrastruktursetup (DataSource, TransactionManager)) kommt natürlich noch dazu.

Der Clou an der Sache ist, dass dieses Konfigurationsmodell unabhängig von der Plattform ist - sprich, du wirfst das Projekt als WAR in nen Tomcat und es tut. Du wirfst das Projekt als EAR in einen JBoss und es tut.

Nähere Informationen zum Transaktionshandling mit Spring gibt es hier. Ich hab dir unten noch den Beispielcode einer Springdemo angehängt die ich hier vor kurzem gehalten hab. Ein Server mit verschiedenen Clients die über RMI kommunizieren (wobei das Protokoll recht leicht austauschbar ist). Zur Verdeutlichung der Transaktionalität findest du in SpringServer ein transactions.xml. Das ist der komplette Konfigurationscode für den Server.

Gruß
Ollie
 

Anhänge

  • SpringClientServer.zip
    81,9 KB · Aufrufe: 171
Hallo Oliver,

Danke für deine ausführliche Antwort. Die liefert mir jetzt auch ein paar gute Anhaltspunkte für die Diskussion mit den Verantwortlichen bei uns als auch beim Kunden.
Wie sich inzwischen herausgestellt hat, ist die Architekturentscheidung wohl doch nicht so zementiert wie bisher von mir und meinem Kollegen angenommen.
Genaugenommen ist das einzige was fest ist, dass die alte Lösung durch eine neue mit Transaktionssicherheit getausch werden soll.
Was noch im Raum steht, ist das die neue Lösung oder eine spätere Version davon, nicht mehr an einem einzelnen Rechner genutzt werden soll wie bisher sondern in einem ganzen LAN, was ja wiederum für eine Webanwendung sprechen würde. Sowohl wegen Performance also auch von wegen Installationsaufwand etc. Einen Internetbrowser hat ja eh jeder normale Arbeitsplatz installiert.

Danke auch für das Beispiel, das wird mir so oder so weiterhelfen ,bisher kenn ich RMI nämlich nur aus der grauen Theorie und so hab ich dann jedenfalls mal ein praktisches Beispiel.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück