2013-01-22 10 views
7

Ich möchte fragen, was ist der beste Ansatz, um einen langen Prozess von einem Java-Servlet auszuführen. Ich habe eine Webapp und wenn der Client eine Anfrage macht, führt er ein Servlet aus. Dieses Servlet sollte einige Parameter von der Anfrage erhalten und dann einen Prozess ausführen. Dieser Prozess kann lange dauern, daher muss ich ihn separat ausführen. Wenn dieser Prozess beendet wurde, sendet er eine E-Mail mit den Ergebnissen.Was ist der beste Ansatz, um einen langen Prozess von einem Java-Servlet aus auszuführen?

Vielen Dank im Voraus.

Antwort

5

Verwenden Sie einen Thread-Pool. Erstellen Sie bei jeder Anforderung eine Anforderung, und senden Sie sie an den Thread-Pool. Dies stellt sicher, dass zu viele Anfragen den Server nicht in die Knie zwingen, da Sie steuern können, wie viele gleichzeitige Threads Sie haben können und wie viele Tasks in der Warteschlange wartender Tasks des Thread-Pools warten können.

Siehe die Javadoc für Executors und ThreadPoolExecutor.

1

Ich sehe zwei Möglichkeiten, dies zu tun:

  1. Erstellen Sie einen separaten Thread für jede Aufgabe (Thread-Pool-Ansatz). Dies ist möglich, kann jedoch möglicherweise zu einem Leistungsproblem führen.
  2. Erstellen Sie eine zweite Anwendung. Zum Beispiel können Sie Parameter in der DB speichern. Die zweite Anwendung wird diese Datenbank mit einem gewissen Intervall überwachen und etwas tun. Stattdessen DB Sie einige Message Queue-Manager wie WebSphere MQ

Zweiter Ansatz nutzen können haben den Vorteil: wenn App nicht in der Lage aus irgendeinem Grund die Anforderung jetzt zu verarbeiten, die App zu ihm zurückkehren können später

2

Obwohl diese Klänge Ein bisschen gefährlich, dass der Aufruf eines Servlets einen Prozess hervorbringt (ohne dass die richtigen Drosselungsfunktionen vorhanden sind), Sie können einen Prozess unter Verwendung von Runtime.getRuntime().exec() spawnen. Viel besser wäre es, ProcessBuilder zu verwenden, um die Prozessargumente vorzubereiten und sie zu erzeugen.

2

Normalerweise wird diese Art von Aktivitäten an einen anderen Typ von Anwendungsmodul wie eine Message-Driven-Bean delegiert und dies scheint die sauberste und standardkonforme Lösung für mich zu sein. Obwohl sich die meisten Server nicht beschweren, wenn Sie eigene Threads erstellen (was vom Standard verboten ist, aber selten durchgesetzt wird), ist die Menge an Management, die zum Einrichten einer eigenen Jobwarteschlange und einer gepoolten Ausführungsumgebung erforderlich ist, meiner Meinung nach nicht wirklich wert.

Verwandte Themen