2009-03-09 21 views
11

Ich habe eine eigenständige Java-Anwendung geschrieben, die ich in eine JAR-Datei gepackt habe, die einige Befehlszeilenargumente übernimmt, einige hardcore Berechnungen durchführt und dann das Ergebnis in eine Datei schreibt Ausgabe an den Standard-Ausgabestream, der auf die Datei mit den Ergebnissen zeigt.Ausführen von Java auf einem Webserver

Ich möchte jetzt eine Website rund um diese Technologie erstellen. Die Idee ist, dass der Benutzer ein HTML-Formular ausfüllen und auf einer Webseite veröffentlichen kann, die dann die Java-Anwendung aufruft, die Ergebnisse aus der Java-App analysiert und sie dem Benutzer anzeigt.

Derzeit bin ich ein wenig von PHP unter Verwendung der Daten aus der Post-Anforderung zu sammeln, und dann nur ein exec-Aufruf:

java -jar -Xmx128m myapplication.jar command-line-arguments

dies schlecht ist?

Ich habe jeden Tag mehrere tausend Besuche auf meiner Website und jede Ausführung der Java-Anwendung kann mehr als 30 Sekunden bis zu einer Minute dauern, also möchte ich nicht übermäßig ineffizient sein. Es scheint, als gäbe es eine bessere Lösung, als Java für jede Anfrage direkt aufrufen zu müssen.

Ich höre Dinge wie Java-Servlets, Bohnen, Kater, Glassfish, etc., aber ich verstehe nicht, was sie sind und wie sie mir nützen würden. Was bringen mich diese? Schnellere Ergebnisse, weil die Java JVM nicht jedes Mal neu erstellt werden muss, wenn ich die Anwendung ausführe? Weniger Speicherverbrauch? Ich möchte natürlich, dass es so schnell wie möglich mit möglichst wenig Speicherbedarf läuft.

Also, was ist der beste Ansatz, den ich hier nehmen kann? Ich möchte meine Anwendung nicht ernsthaft umschreiben, da es viel Code gibt (daher ist es nicht möglich, sie in C oder C++ umzuwandeln).


Danke.

Antwort

12

Ok, Servlets sind kleine Anwendungen, die innerhalb eines Containers laufen. Sie stellen einen Erweiterungspunkt dar, an dem Sie Ihren Java-Code entweder in einen einfachen Servlet-Container wie Tomcat oder einen umfassenderen Anwendungsserver wie Glassfish einfügen können.Sie möchten dies tun, weil der Anwendungsserver den Umgang mit der HTTP-Interaktion erheblich vereinfacht und weitere Funktionen wie Sicherheit, Protokollierung, Sitzungsverwaltung, Fehlerbehandlung und mehr bietet (siehe servlet specification).

Wenn Sie Ihre Anwendung innerhalb eines Anwendungscontrollers (Webserver mit all diesen zusätzlichen Funktionen) live schalten, können Sie auch den Lebenszyklus Ihrer Anwendung besser verwalten. Sie können die Anwendung starten und stoppen, ohne den Webserver herunterzufahren, neu zu implementieren, mehr Instanzen zu starten, usw. Außerdem, wenn Sie diese großartige zweite Anwendung finden, ist es einfach, sie direkt neben der ersten einzufügen . Oder Sie können mehrere Maschinen für einfache Redundanz und Lastverteilung zusammenfassen, Features des Anwendungsservers.

Dies ist nur ein Anfang, es gibt viele weitere Funktionen, Technologien und Frameworks, die Ihnen dabei helfen, containerbasierte Anwendungen zu erstellen. Servlet tutorial.

0

Sie möchten wahrscheinlich nicht die Java-App direkt von der Website aufrufen. Wie du schon sagtest, wenn der Java-Prozess 30 Sekunden dauert, wird dein Webserver ziemlich durcheinander geraten, besonders wenn deine Seite gehämmert wird.

Sie können in Web-Dienste (und möglicherweise eine Nachrichtenwarteschlange) für die Verarbeitung von Back-End-Verarbeitungsanforderungen suchen. Die PHP-Seite könnte den Web-Service auf dem Server aufrufen, der dann eine Verarbeitungsanfrage in eine Warteschlange stellen oder die Java-App nur asynchron starten könnte. Sie möchten nicht, dass die HTTP-Anforderung auf die Beendigung der Java-App wartet, da der Benutzer während der Verarbeitung nur einen blockierten Browser hat und die HTTP-Anforderung möglicherweise eine Zeitüberschreitung aufweist.

Sobald die Java-App beendet ist, könnte sie eine Datenbanktabelle aktualisieren, auf die der Benutzer dann über die Website zugreifen kann.

2

[Erhalten diese mich] "Schnellere Ergebnisse, weil die Java JVM nicht jedes Mal erstellt werden muss, wenn ich die Anwendung ausführen?"

Ja.

Und - Bonus - Sie können PHP ersetzen, so dass Ihre gesamte Website in einer einzigen Sprache ist: Java.

Außerdem können Sie Ihre Anwendungsfälle überarbeiten, so dass es keine schmerzhaften 30-60 Sekunden in einer Aufnahme gibt, sondern vielleicht eine Reihe von schnelleren Schritten, die interaktiv mit dem Benutzer ausgeführt werden.

2

Führen Sie Ihren Code in einem Servlet-Container aus.

Angenommen, Sie müssen Ihre Website in PHP behalten und bereits Java auf Ihrem Computer installiert haben, installieren Sie einfach einen kostenlosen Servlet-Container (z. B. Apache Tomcat oder Jetty). Konfigurieren Sie, dass der Servlet-Container auf einem nicht verwendeten Port ausgeführt wird. (8080) ist ihre Standardeinstellung.

Diese Servlet-Container sind wirklich Java-basierte Webserver, genau wie Apache, jedoch spezialisiert auf Java-Code.

Der offensichtlichste Vorteil der Verwendung eines Java-Webservers anstelle eines neuen java.exe-Aufrufs für jede Anforderung ist, dass Ihre Java Virtual Machine (jvm) immer "heiß" und betriebsbereit ist. Jeder neue Start der java.exe (jvm) wird Ihnen zusätzliche Sekunden verschwenden.

Der zweite Vorteil der Verwendung eines Servlet-Containers besteht darin, dass der Container Ihren Code für jede neue Anforderung in einem neuen Thread im jvm ausführen lässt. Sie werden kein Problem haben, Ihren Tausenden von Benutzern jeden Tag einen Service zu bieten. Höchstwahrscheinlich stürzt Ihre Maschine ab, wenn Sie Hunderte von Java-Instanzen anstelle von einer starten.

Platzieren Sie Ihren Code in einem Servlet. Es ist wirklich einfach für einen Neuling. Sie sprechen mit dem Servlet über HTTP (Methoden doGet oder doPost des Servlets). Übergeben Sie das PHP-Anfrageformular an dieses Servlet und lassen Sie sich vom Servlet alles zurückgeben: eine Seite, ein JSON-Objekt, XML oder einfacher Text.

0

Am einfachsten wäre es, einen Webserver in Ihre Anwendung einzubetten. Schauen Sie sich Jetty an.

Verwandte Themen