# Serverdienst in Tomcat implementieren



## freez (15. Sep 2007)

Hallo,

ich habe hier einen kleines Java Programm, welches mir im Netzwerk einige Aufgaben wahr nimmt (So eine Art Proxy... Quellcode liegt vor). Nun muss ich dieses Programm sowieso als Dienst mit dem Betriebssystem starten. Ausserdem muss ich noch eine Konfigurationsoberfläche entwickeln. Nun habe ich mir gedacht, dass ich diese Oberfläche mit JSF im Tomcat erstelle. Nun wäre es für mich denkbar, das ich dieses Programm im Tomcat gleich mitstarte.

2 Vorteile sehe ich daraus: Ich muss dieses Programm nicht extra als Dienst im System hinterlegen, und meine JSF Applikation könnte direkt auf die Methoden des Programmes zugreifen um Konfigurationsänderungen zu übergeben und Laufzeitvariablen auszulesen und anzuzeigen.

Mein Problem: Ich habe keine Ahnung, wie ich so ein Programm im Tomcat als ständig laufende Applikation integriere und wie ich dann von meiner JSF Applikation darauf zugreifen kann. Ausserdem habe ich keine Ahnung, nach was ich in google suchen soll. Also, ich weiß was ich will, das hört sich auch richtig geil an, aber ich habe keine Ahnung, wie ich es umsetzen kann


----------



## freez (15. Sep 2007)

Guten Abend 

naja, ich weiß zwar nicht, ob ich es jetzt richtig gemacht habe, aber ich abe das Programm einfach in ein Servlet gesteckt und in der init Methode gestartet. mit einem load-on-Startup habe ich das Servlet von Anfang an am laufen. Spricht etwas dagegen es so zu gestalten?

Nun möchte ich natürlich noch die Konfigurationsseiten mit jsf erstellen. Da habe ich momentan noch einen Knackpunkt. Wie kommt meine managedBean an das laufende Servlet um da publicMethods aufzurufen?


----------



## HLX (17. Sep 2007)

Implementiere es am Besten so, dass das Servlet deine Managed-Bean verwurstet.

Die Bean hat Session-Scope? Dann leite den Request einfach an dein Servlet weiter.


----------



## freez (17. Sep 2007)

Hm, das hört sich gut an. Nur habe ich gerade keine Vorstellung, wie ich das im detail mache.
Die Bean ist im Session Scope. Ich kann mir vorstellen, dass die JSF Seite die Bean mit den Formulardaten beschreibt. Aber wie kriege ich es hin, dass danach das Servlet angesprochen wird? Es wäre ja unschön, wenn ich erst das Servlet anspreche und über das Servlet die Bean befülle. Das wäre die unschönere Variante.


----------



## ms (17. Sep 2007)

HLX hat gesagt.:
			
		

> ...dass das Servlet deine Managed-Bean verwurstet.


Verwursten, ist das ein ein Design-Pattern?  :lol: 



			
				freez hat gesagt.:
			
		

> Es wäre ja unschön, wenn ich erst das Servlet anspreche und über das Servlet die Bean befülle. Das wäre die unschönere Variante.


Warum ist das unschön?

Was macht denn das Programm genau?

ms


----------



## HLX (17. Sep 2007)

freez hat gesagt.:
			
		

> Hm, das hört sich gut an. Nur habe ich gerade keine Vorstellung, wie ich das im detail mache.
> Die Bean ist im Session Scope. Ich kann mir vorstellen, dass die JSF Seite die Bean mit den Formulardaten beschreibt. Aber wie kriege ich es hin, dass danach das Servlet angesprochen wird?



Du registrierst zum Servlet ein URL-Pattern in der 'web.xml'. Über dieses kannst du dein Servlet ansprechen.



			
				ms hat gesagt.:
			
		

> Verwursten, ist das ein ein Design-Pattern?


Für einen Metzger schon.


----------



## freez (17. Sep 2007)

Hm, danke schon mal für die Antworten.

Also, wie ich ein Servlet in der web.xml konfiguriere ist mir schon klar. Aber zuerst muss doch das facesServlet von der JSF Seite angesprochen werden, damit dieses automatisiert die bean(s) mit den Formulardaten befüllt. Daneben habe ich mein zweites Servlet, welches den Proxy gestartet hat. Nun sollen irgendwie die Daten von der Bean in das zweite, ich sage mal ProxyServlet dazu, transferiert werden, damit ich zur Laufzeit Daten in dem proxyDienst verändern kann oder auch abholen kann (Anzahl der Zugriffe, Auslastung usw.)

Mal konkret gefragt: Mein Servlet ist mit einem bestimmten Pattern in der web.xml registriert. Weiterhin habe ich noch das FacesServlet. Wie kann ich es nun anstellen, das zuerst meine SessionBean angesprochen wird und dann mein ProxyServlet um sich die Daten zu holen.

Oder ist mein ganzer Ansatz einfach verkehrt? Gibt es noch andere Möglichkeiten zwischen dem ProxyDienst und der SessionBean Daten auszutauschen? Im Endeffekt müssen die Daten ja sowieso noch in einer Datenbank gepflegt werden (einmal zur Speicherung der Konfiguration und für Logs). Aber ich habe auch da das problem, dass ich dem ProxyDienst sagen muss, dass es Änderungen an der Konfiguration gibt. Ich brauche ne einfache Schnittstelle zwischen den beiden Java Klassen Bean und ProxyDienst, egal, wo ich diesen Dienst laufen habe (im Tomcat oder separat im System)


----------



## HLX (17. Sep 2007)

Also mir ist die Funktion des Proxy noch nicht ganz klar. Muss das Ding wirklich permant irgendwo im Hintergrund laufen?

Warum können die Methoden deines "Proxy" nicht direkt aus der JSF-Anwendung verwendet werden, sozusagen als BL deines Programms?


----------



## freez (18. Sep 2007)

Hallo HLX

was ist denn BL?

Und ja, es muss permanent im Hintergrund laufen. Stelle dir ein HTTP Proxy vor. Der ist ja auch nicht nur ab und zu verfügbar. Den lässt du doch auch permanent laufen. Deinen Proxy kannst du über einfache Konfig Files konfigurieren. Diesen Zugang kann ich leider nicht bieten. Also brauche ich eine GUI, über die dieser Dienst konfigurierbar ist. Dies will ich mit JSF machen. Was ich mir gerne ausreden lasse, ist das ich den Dienst im Tomcat lasse. Rein aus dem Gefühl herraus gehört er nicht unbedingt dort rein. Aber mein Problem ist immer noch der Datenaustausch. Ich hoffe ja immernoch, das mir jemand ein schönes Stichwort nennt, welches mir bei der Suche im Web behilflich ist. Oder vielleicht hat ja jemand so etwas schon einmal gemacht.


----------



## ms (18. Sep 2007)

freez hat gesagt.:
			
		

> was ist denn BL?


Businesslogik

Erklär doch bitte mal wie dein Proxy funktioniert.
Ist das ursprünglich ein eigenständiges Programm das auf einem Port lauscht?
Wie greift es derzeit auf die Konfiguration zu?
Und hast du die Möglichkeit das Programm zu verändern? Z.B. den Zugriff zur Konfiguration, wenn diese in einer
Datenbank liegen soll.

ms


----------



## freez (18. Sep 2007)

Hallo ms,

danke für die Info.

Stellen wir uns einen einfachen HTTP Proxy vor, den ich selbst in Java entwickelt habe (es ist zwar kein HTTP Proxy, aber vom Prinzip her funktioniert es ähnlich). Die Konfiguration ist aktuell noch hart codiert im Programm soll aber später konfigurierbar sein. Ich selbst habe Zugriff auf alles. Aber der User später wird lediglich einen Browser haben und auf die Kiste per http zugreifen um Konfigurationen zu ändern. Weitere Zugriffe wie Filesystem und Datenbank werden von aussen nicht erlaubt. -> Deswegen JSF und Tomcat. Die Konfiguration kann in einem Textfile liegen oder auch in einer Datenbank (Wie auch die Logs). Da bin ich noch überzeugbar.

Also habe ich ein eigenständiges Programm, welches auf einem Port lauscht und Tomcat mit ein paar JSF Seiten. Wichtig ist mir der Punkt, dass relativ zeitnahe Daten von dem Programm in der JSF Seite angezeigt werden können. Und wenn ich Änderungen an der Konfiguration habe, sollen die natürlich sofort wirken.

Die große Frage ist nun, wie kann ich meine JSF Applikation und das Programm dazu bringen miteinander zu kommunizieren. Es wäre natürlich schön, wenn ich das so einfach wie es möglich ist implementieren könnte.


----------



## ms (18. Sep 2007)

Also ich würde die Applikation um ein Steuerport erweitern. Lauscht also noch zusätzlich an einem Port um von der JSF-Anwendung über Konfigurationsänderungen benachrichtigt zu werden. Eventuell können auch darüber die von dir erwähnten Daten abgefragt werden.

Ich würde das Programm wohl eher eigenständig laufen lassen, also nicht im Tomcat.

ms


----------



## HLX (18. Sep 2007)

Mir fällt zu deiner Beschreibung zunächst nur das Stichwort Web Services ein. Habe hier allerdings keine praktische Erfahrung.

Hier mal ein Link zu Web Services mit SOAP


----------



## freez (18. Sep 2007)

Hallo HLX, Hallo ms,

beide Ideen sind mir heute auch gekommen. Allerdings scheint mir die implementierung eines eigenen Netzwerkprotokolls etwas umständlich zu sein.

Webservices habe ich mir heute auch angeschaut. Per WSDL habe ich auch schon ein paar Sachen ausprobiert, nur leider bis jetzt nur an kleinen Beispiel. Mir fehlt momentan noch die Information, wie ich mein Programm so gestallten kann, das es per Webservice erreichbar wäre. Also wo starte ich bei einem Webservice mein Programm, damit es auf einem Port zu lauschen beginnt?


----------



## freez (20. Sep 2007)

Oh man. Manchmal sieht man die einfachsten Sachen nicht!

Ich habe meinen Proxy nun um folgenden Code erweitert:

```
private static Proxy proxy = null;
	
	public static Proxy getProxy() {
		return proxy;
	}

	public static void setProxy(Proxy proxy) {
		Proxy.proxy = proxy;
	}
```

und im Servlet mache ich beim init() ein:

```
Proxy p = new Proxy();
Proxy.setProxy(p);
```

und in der Bean hole ich ihn mir mit:

```
Proxy.getProxy()
```

Somit habe ich von der Bean direkten Zugriff auf meinen Proxy. das geht natürlich nur, solange es nur einen Proxy dieser Art gibt, bzw. es kein zweites Servlet gestartet wird.


----------

