2009-01-31 14 views
5

Ich habe derzeit einen Tomcat-Container - Servlet läuft auf sie für Anfragen hören. Ich benötige das Ergebnis einer HTTP-Anfrage als Vorlage an eine Job-Queue, die dann asynchron verarbeitet wird. Ich möchte, dass jeder "Job" in einer Datenbank in einer Datenbank für das Tracking und für die Wiederherstellung im Falle eines Fehlers persistiert wird. Ich habe viel gelesen. Hier sind meine Optionen (ich muss Open-Source-Sachen für alles verwenden).Asynchrone Verarbeitung in Java von einem Servlet

1) JMS - verwenden ActiveMQ (aber wer ist der Verbraucher der Arbeit in diesem Fall ein anderes Servlet)

2) Habe meiner Anfrage im DB eine Reihe hier. Haben Sie ein separates Servlet in meinem Tomcat-Container, der immer ausgeführt wird - es verwendet Quartz Scheduler oder Dienstprogramme, die in java.util.concurrent zur Verfügung stehen, um die Zeilen kontinuierlich als Jobs zu verarbeiten (verwendet Thread-Pooling).

Ich lehne mich dem letzteren zu, weil das Betrachten der JMS-Dokumentation mir Kopfschmerzen bereitet und obwohl ich eine robustere Lösung kenne, muss ich das relativ schnell implementieren. Ich erwarte in den frühen Tagen der Bereitstellung dieses Servers in keinem Fall große Mengen an Last.

Viele Leute sagen, dass Frühling für entweder 1 oder 2 gut sein könnte. Jedoch habe ich Frühling nie benutzt und ich würde nicht einmal wissen, wie ich anfange, ihn zu benutzen, um dieses Problem zu lösen. Irgendwelche Hinweise, wie man eintaucht, ohne mein gesamtes Projekt neu schreiben zu müssen, wäre nützlich.

Andernfalls, wenn Sie auf Option 1 oder 2 wiegen könnten, wäre das auch nützlich.

Klarstellung: Der asynchrone Prozess würde Bildschirm eine Website von Drittanbietern scrape scannen und eine Nachrichtenbenachrichtigung an den ursprünglichen Anforderer senden. Die Website des Drittanbieters ist ein wenig flockig und langsam und deshalb wird es als ein asynchroner Prozess behandelt (mehrere Wiederholungsversuche eingebaut). Ich werde auch Dateien von dieser Site ziehen und sie in S3 speichern.

Antwort

4

Ihr Quartz-Job muss kein Servlet sein! Sie können eingehende Jobs in der Datenbank beibehalten und Quartz beim Starten des Haupt-Servlets starten. Der Quartz-Job kann ein einfacher POJO sein und die Datenbank regelmäßig nach Jobs durchsuchen.

Allerdings würde ich vorschlagen, einen Blick auf Spring zu werfen. Es ist nicht schwer zu lernen und easy to setup within Tomcat. Sie können viele gute Informationen in der Spring reference documentation finden. Es hat Quarz-Integration, die viel einfacher ist, als es manuell zu tun.

+0

Ich empfehle Frühling auch sowohl für Quarz-Scheduling und JMS-Messaging. Es wird den Code viel einfacher machen. – kgiannakakis

1

Eine geeignete Lösung, die nicht viel Design und Programmierung erfordert, besteht darin, das Objekt, das später im Servlet benötigt wird, zu erstellen und es in ein Byte-Array zu serialisieren. Dann lege das in ein BLOB-Feld in der Datenbank und mach damit fertig.

Dann kann Ihr Verarbeitungsthread nur den Inhalt lesen, deserialisieren und mit dem neu aufgerichteten Objekt arbeiten.

Aber, können Sie bessere Antworten erhalten, indem die beschreiben, was Sie Ihr System zu tun :) eigentlich

+0

Das ist eine ziemlich gute Idee. Dies würde wahrscheinlich für mich funktionieren, da das Objekt, das ich in der Datenbank speichern würde, einfach Informationen enthält, wie man auf die Zielseite eines Dritten zugreift und eine eindeutige ID hat, so dass ich es zurück zum Benutzer leiten kann. – Ish

Verwandte Themen