# Kommunikation von Webanwendungen (auf Tomcat Server) untereinander



## JavaMe (29. Feb 2012)

Hallo zusammen,

ich habe eine Webanwendung (WebApp1) auf einem Tomcat Server laufen. Diese enthält eine Reihe von JAVA Servlets und hat über 60 JARs im Bauch (davon gut 50 Fremdbibliotheken wie Spring, Apache Commons, Log4j, MQ, etc). Jetzt muss ich ein neues Third-Party Framework einbinden welches ebenfalls mit über 50 JARs daherkommt. Von diesen überschneiden sich einige (ca. 20 Stück) mit denen von WebApp2. Die Jars tragen teilweise unterschiedliche Versionsnummer und es gibt auch Klassen, die in völlig unterschiedlichen JARs vorkommen.

Um Konflikte zu vermeiden, habe ich mich entschieden, die Funktionen des neuen Frameworks in eine eigene Webanwendung (WebApp2) auszulagern, damit jede Webanwendung mit "seinen" JAR Files und darin enthaltenen JAVA Klassen arbeiten kann. Beide Webanwendungen sollen auf ein und dem selben Tomcat Server laufen.

Zwischen den beiden Webanwendungen muss ich Daten austauschen. Ein Byte-Array (enthält ein Xml-Dokument) und ein paar Strings. Teilweise können die XML-Dokument bis zu einem MB groß sein.

Nun ein paar Fragen zur Umsetzung:

1) Sollte ich HTTP Put oder HTTP Post verwenden ? HTTP Put habe ich bislang noch nie benutzt. Hätte ich dadurch irgendwelche Vorteile ?
2) Kann/sollte ich die Java-Objekte serialisieren oder mir einfach eine Schnittstelle ausdenken, die als Vereinbarung zwischen Sender und Empfänger gilt ?
3) Sollte ich die Daten des ByteArrays komprimieren, bevor ich sie an WebApp2 sende oder kann ich das vernachlässigen, weil beide WebApps in einer Tomcat Server Instanz laufen ?
4) Sollte man die Daten des ByteArray bas64 kodieren ?
5) Kann ich Exception Objekte aus WebApp2 an WebApp1 zurückliefern ?

Wie Ihr seht, kenne ich mich in Sachen Serialisierung nicht sehr gut aus. Ein Tipp reicht. Dann lese ich mir gerna alles Notwendige an.

Hoffe auf Eure Hilfe.

Danke im Vorraus

Holger


----------



## JavaMe (3. Mrz 2012)

Hallo zusammen,

da sich noch niemand gemeldet hat, hier mal ein Zwischenbericht:

2) Kann/sollte ich die Java-Objekte serialisieren oder mir einfach eine Schnittstelle ausdenken, die als Vereinbarung zwischen Sender und Empfänger gilt ?
=> Ich weiß nun, wie das mit dem Serialisieren geht. Habe mich allerdings dafür entschieden, die Werte der paar Strings im HTTP-Header zu übertragen und das Byte Array so an die andere Webanwendung zu übertragen, wie es ist.


3) Sollte ich die Daten des ByteArrays komprimieren, bevor ich sie an WebApp2 sende oder kann ich das vernachlässigen, weil beide WebApps in einer Tomcat Server Instanz laufen ?
=> Habe mich gegen das Komprimieren entschieden.

4) Sollte man die Daten des ByteArray bas64 kodieren ?
=> Da ich keine Binärdaten transportieren muss, kann ich mir das auch sparen.

5) Kann ich Exception Objekte aus WebApp2 an WebApp1 zurückliefern ?
=> Hier übelege ich noch, ob ich die Exception aus WebApp2 per Serialisierung an die aufrufende WebApp1 zurückschicke. Kann aber auch sein, dass ich nur einen Returncode zurückliefere, den WebApp1 dann auswertet.

Bleibt also noch die erste Frage offen:

1) Sollte ich HTTP Put oder HTTP Post verwenden ? HTTP Put habe ich bislang noch nie benutzt. Hätte ich dadurch irgendwelche Vorteile ?

Hat hierzu noch jemand einen Rat ?

Schönes Wochenende

Holger


----------



## JohannisderKaeufer (3. Mrz 2012)

Abhängig von Aufwand und größe der Projekte, sowie dem zur Verfügung stehenden Server kann ich mir auch vorstellen das sich sowas mit JEE und EJB's umsetzen läßt.

Sprich, neben dem Tomcat einen EJB-Container laufen lassen oder gleich einen JEE-Server verwenden.

Die Business-Logik aus der Webanwendung herausoperieren und in die EJBs verpacken.

Von beiden Webanwendungen per lookup auf die EJBs zugreifen.

Das wäre einerseits am wenigsten "gefrickel" und langfristig die bessere Lösung.

Kommt eine weitere Anwendung hinzu greift, man über das Interface der EBJs einfach auf die Businesslogik zu.

Das Risiko das man sich bei der Kommunikation verhedert oder falsch serialisiert fällt weg.


----------



## JavaMe (3. Mrz 2012)

Hallo und danke für Deine Antwort. Das Projekt erlaubt keine EJBs. Als Laufzeitumgebung ist der Tomcat Server gesetzt.


----------



## ...ButAlive (4. Mrz 2012)

Wie baust du denn deine Applikation? Ich würde eher Maven oder Ähnliches, zur Verwaltung der Abhängigkeiten verwenden, anstatt eine zweite Webapplikation zu erstellen. Damit könntest du dann auch Versionskonflikte auflösen.


----------



## JavaMe (5. Mrz 2012)

...ButAlive hat gesagt.:


> Wie baust du denn deine Applikation? Ich würde eher Maven oder Ähnliches, zur Verwaltung der Abhängigkeiten verwenden, anstatt eine zweite Webapplikation zu erstellen. Damit könntest du dann auch Versionskonflikte auflösen.



Unsere Applikation werden allesamt seit Jahren mit ANT gebuildet. Der Buildprozess ist bei uns festgeschrieben und unveränderlich. Jedenfalls, was unser Projekt betrifft. Deshalb kommt Maven oder Ähnliches nicht in Frage und die Entscheidung für eine weitere Webanwendung steht. 

Deshalb bleibt meine Frage:

Sollte ich HTTP Put oder HTTP Post verwenden ? HTTP Put habe ich bislang noch nie benutzt. Hätte ich dadurch irgendwelche Vorteile ?

PS: Danke für Eure Ratschläge architektureller Art. Hätte ja durchaus sein können, dass diese geholfen hätten.


----------



## irgendjemand (5. Mrz 2012)

mal davon abgesehen das HTTP PUT dazu gedacht war dateien via HTTP dierek auf einen server raufzuladen *bevor es FTP gab* wäre das in der heutigen zeit ein extremes sicherheitsrisiko ... desswegen ist HTTP PUT heute meist deaktiviert oder überhaupt nicht mehr implementiert ...
von daher erübrigt sich deine frage da dein server aus sicherheitsgründen HTTP PUT gar nicht mehr unterstützen sollte ... wenn er dies doch tut solltest du dieses loch so schnell wie möglich stopfen ... das kann gefährlich werden ...

zum allgemeinen : auch wenn ich mich in der EE szene nicht so gut auskenne bin ich doch der meinung das es möglich sein sollte dierekt innerhalb des servers die daten zu übergeben ... anstatt über HTTP "mit sich selbst" zu connecten ... *lösung wurde oben schon erwähnt*

da ich auch den anderen thread kenne in dem es um den grund für diesen thread hier ging ... nämlich die verschiedenen versionen und deren abhängigkeiten ... sehe ich eigentlich kein grund für deine entscheidung ...
wir haben dich im anderen thread bereits darauf hingewiesen das es möglichkeiten gibt diese abhängigkeits-unterschiede zu prüfen ... so das du dann nachher wirklich nur noch je ein jar pro lib hast ... und nicht zwei in verschiedenen versionen ...

grundsätzlich sollte aber gelten das sich die libs nicht all zu sehr unterscheiden sollten da es vermutlich alles annährend gleiche major-releases sind *so kam es zumindest im andere thread rüber das sich die libs nur im minor oder sogar nur im build unterscheiden* ...

probiere es doch einfach mal aus welche app probleme macht wenn du die eine oder andere version von verschiedenen libs verwendest ... sollten beide mit einer neueren version einer lib laufen solltest du diese verwenden ... sollte eine probleme machen versuche ob beide mit der älteren laufen ... gibt es dann immer noch probleme kontaktiere denjenigen der sich so fest auf dieses eine releaese festgefahren hat so das seine webapp nicht mit anderen versionen läuft ...

wenn du soweit bist hast du nachher zwar eine menge libs ... aber von jeder nur ein jar und weist das deine apps trotzdem sauber laufen ...

dann kannst du am ende beide zusammenkleben und zu einer großen app machen ...


das ganze ist viel arbeit ... das wissen wir ... aber es ist auf jeden fall die mühe wert anstatt den server mit haufen apps zu belegen nur weil man versions-konflikte in abhängigkeiten hat und sich scheut diese zu lösen ... und dann noch mit HTTP "außenrum" geht ... das ist nun wirklich keine lösung ... auf sowas würden vielleicht "java-anfänger" kommen ... aber wehr sich schon soweit mit java befasst das er im EE umfeld "heimisch" ist ... der sollte für sowas grundlegendes eigentlich auf die lösung kommen das man sich da mal n wochenende ransetzt und die libs einpflegt ...


----------



## homer65 (5. Mrz 2012)

Vielleicht solltest du dir auch mal OSGI anschauen.
Dort werden nicht alle jar nach aussen sichtbar, so das du mit "doppelten" jar arbeiten kannst.


----------



## JavaMe (5. Mrz 2012)

Hi,

Danke für die "Aufklärung" in Sachen POST und PUT.

Wie ich schon geschrieben habe, steht die Entscheidung fest, eine zweite Webanwendung zu bauen. 

Beide Hersteller (der eine liefert den Kern, den wir in Teilen erweitern, der andere liefert das neu einzubindende Framework), haben dies ebenfalls empfohlen. Selbst wenn man sich jetzt die Arbeit machen würde, die JARs zu untersuchen und doppelte zu entfernen, würde man diesen Aufwand bei jedem neuen Release beider Hersteller erneut treiben müssen. Es handelt sich bei der "App" auch nicht um eine kleine Anwendung, die man mal an einem Wochenende durchtesten kann. Ist aber auch egal. 

Tausend Dank für all Eure Hilfe !!!


----------

