Laden...

Webservice Jobqueue abarbeiten

Erstellt von realProg vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.962 Views
R
realProg Themenstarter:in
95 Beiträge seit 2010
vor 11 Jahren
Webservice Jobqueue abarbeiten

Hallo,

ich stehe vor der Aufgabe, Excelvorlagen mit Werten zu befüllen und diese anschließend wieder abzuspeichern. Alles kein Problem soweit.

Das Ganze wird von einem Webservice gesteuert, da die Daten an dieses gesendet werden und so der Aufruf für die Befüllung gegeben wird.

Nun möchte ich jedoch aus Sicherheitsgründen eine Art Warteschlange einbauen, in der nicht erfolgreich erstellte Dokumente abgelegt werden und in einem bestimmten Zeitintervall die Erstellung wiederholt wird.

Meine Frage: Wie erstelle ich eine Warteschleife in Webservices, die jede Minute überprüft ob noch Jobs abgearbeitet werden müssen und wenn ja, diese abgearbeitet werden?

Danke im Voraus und LG

16.807 Beiträge seit 2008
vor 11 Jahren

Eine klassische Frage, die man mit "viele Wege führen nach Rom" beantworten kann.

Stacks, Queue-Collection, Producer / Consumer oder auch SyncQueue <T> - Eine praktische Job-Queue .. gibt unzählige Möglichkeiten - letzten Endes bleibt es also irgendwie Geschmackssache.

R
realProg Themenstarter:in
95 Beiträge seit 2010
vor 11 Jahren

Ja gut, über die Möglichkeiten bin ich mir schon bewusst. Es geht mir viel mehr um das dahinterliegende Konzept, eben aus der Tatsache heraus, dass es sich um ein Webservice handelt.

D.h. der Behälter dahinter ist unrelevant, viel mehr geht es um das wie gestalte ich so eine Jobqueue in einem Webservice...

16.807 Beiträge seit 2008
vor 11 Jahren

Nicht anders, als in einer anderen Anwendung auch.
Die Besonderheit in diesem Fall ist nur, dass der IIS - sofern Du ihn darauf betreiben willst - jegliche Webanwendungen (Website, WebService) nach einer gewissen IdleTime schlafen legt und ihn wieder weckt, sobald eine Anfrage kommt.
Dies musst Du in der Queue beachten.

Da wie bei einer Website auch bei einem WebService jede Anfrage ein eigener Thread (über den ThreadPool) ist, muss eine ständig aktive Queue - wie in einer anderen Anwendung ebenfalls - autark, im optimalen Fall in einem eigenen, ständig aktiven Thread laufen.

R
realProg Themenstarter:in
95 Beiträge seit 2010
vor 11 Jahren

Danke für die Antwort!

Wo starte ich diesen Thread im optimalen Fall, damit es nicht dazu kommt, dass dieser beendet wird, bzw. gestalte ich diese autarke Queue?

Gibt es Erfahrungen bezüglich dem von dir erwähnten Punkt: Webanwendungen nach einer gewissen IdleTime schlafen legen?

Danke.

16.807 Beiträge seit 2008
vor 11 Jahren

Naja die IdleTime anfassen (in der Konfiguration auf 0 setzen) würde ich nur, wenn der Webserver sonst nicht von Dir genutzt wird, da er indirekt andere Anwendungen ebenfalls beeinflusst.
So wird ein Web-Prozess in den Schlafmodus gelegt, wenn er nicht gebraucht wird, die IdleTime noch nicht erreicht wird, aber die sonstigen Ressourcen des Servers von anderen Anwendungen besser verwendet werden können.

Den Thread für die Queue startet man nicht von einem Request-Thread aus, da sich dieser sonst auch als Parent-Element nicht (unbedingt) beendet.

Ich würde das ganze daher also als eigenständigen Nested Singleton laufen lassen, und ihn entweder nach Bedarf, wenn er tatsächlich von einem Request benötigt wird, starten - oder direkt in der Global.asax starten.

R
realProg Themenstarter:in
95 Beiträge seit 2010
vor 11 Jahren

Okay,

d.h. zusammengefasst:
Ich erstell mir eine Klasse, die Aufträge entgegennimmt und diese in die SyncQueue steckt.
In der Global.asax starte ich einen Thread, der in einer Endlosschleife Elemente aus der SyncQueue abruft und jedes einzelne Element abarbeitet, wobei ich bei dieser Abarbeitung Zugriffe auf meine nicht threadsicheren Klassen wiederum locken muss.

Stimmt das so?

T
2.219 Beiträge seit 2008
vor 11 Jahren

Was spricht dagegen die Aufträge in einer DB zu sammeln und per Task jede Minute abzuarbeiten?
Wäre wahrscheinlich der einfachere Weg oder?

Für mich klingt die Lösung mit dem extra Thread des Webs auch stark nach Tricksen als nach einer anständigen Lösung.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.807 Beiträge seit 2008
vor 11 Jahren

Für mich klingt die Lösung mit dem extra Thread des Webs auch stark nach Tricksen als nach einer anständigen Lösung.

Falls das "auch" auf mich bezogen ist, so möchte ich dies verneinen.
Ich sehe das nicht als Tricksen; nutze selbst auch in gewissen Bereichen eine Queue - zum Beispiel beim Überwachen von Shares, Directories und Files.

Eine Datenhaltung ist in meinen Augen richtig, wenn kein Auftrag zu keiner Zeit verloren gehen darf; zB aufgrund eines unerwarteten Systemausfalls o.ä.
Aber selbst hier brauchst Du immer noch eine Lösung, um das Polling der Datenbank umzusetzen. Ein Timer löst zwar das Grundproblem in diesem Fall - einen extra Thread brauchst Du aufgrund der WebService Plattform aber dennoch.

Es spielt also bei der Frage der Grund-Architektur keine Rolle, ob die Informationen in einer Queue oder in einer Datenbank liegen.

691 Beiträge seit 2007
vor 11 Jahren

Hier eine Alternativlösung:

Mache deinen Windowsservice zu einer WCF self-hosted application. D.h. im Service ist quasi der Servicelistener der entsprechend die Verbindungen verwaltet.

Das ist im Grunde sehr einfach und lässt sich gut googlen. Solltest du das ganze über HTTPS laufen lassen wollen, wirds entsprechend aufwändiger bzw. so aufwändig, wie halt die Konfiguration von WCF Services mit HTTPS ist.

mit freundlichen Grüßen,
Tomot

Projekte: www.gesellschaftsspieler-gesucht.de