2012-12-15 4 views
5

Ich verwende derzeit SignalR in und ASP.Net MVC 4 Anwendung. Ich nehme Nachrichten von RabbitMQ und muss im Wesentlichen über SignalR senden, wenn eine neue Nachricht in die Warteschlange kommt. Problem ist unter normalen Umständen, es gibt keinen Ort, an dem ein langlebiges Objekt in IIS leben kann. Ich bekomme ungefähr 1000 Nachrichten pro Sekunde, also würde der Standardansatz, die Nachricht in IIS zu schicken, indem ich eine Anfrage von einem externen Warteschlangenüberwachungsdienst/einer App stelle, meinen IIS ziemlich umbringen.Wie erstelle ich ein langlebiges Objekt innerhalb des IIS/ASP.Net?

Ich habe eine allgemeine Idee zum Erstellen einer Singleton-Instanz in einem Hintergrund-Thread. Nicht sicher, was der beste Weg ist, dies in iis zu tun, würde das Singleton automatisch neu erstellt werden, wenn die Anwendung stirbt.

+0

IoC-Container wie Autofac können Sie bestimmte Abhängigkeiten als Singletons konfigurieren - es wird eine einzelne Instanz in Ihrer AppDomain beibehalten und Sie können darauf zugreifen, wo immer Sie möchten. – blaster

Antwort

1

Denken Sie, Sie hätten etwas in einem Hintergrund-Thread, der immer wieder nach Nachrichten sucht?

Ich habe quartz.net verwendet, um geplante Jobs in der Vergangenheit zu erstellen. Sie sind ziemlich einfach einzurichten. Sie können im Grunde nur sagen, führen Sie diesen Job jedes x-Intervall ab y-Zeit aus. Mit welcher Lösung Sie auch immer gehen, Sie müssen wahrscheinlich eine Fehlerbehandlung hinzufügen. Ich denke, Ihr Quarz-Job würde weiterhin versuchen, jedes x-Intervall auszuführen, selbst wenn es eine Ausnahme auslöst, aber Sie müssen sicherstellen, dass Sie alles beseitigen, was die Ausnahme verursacht hat. Ansonsten wird es jedes Mal fehlschlagen, wenn es läuft. I.E. als ob etwas mit deiner Nachricht nicht in Ordnung ist, so dass es jedes Mal einen Fehler gibt, wenn du versuchst, es zu senden.

Achten Sie auf IdleTimeout Ihrer Anwendung. Wenn IIS Ihre Webanwendung in den Ruhezustand versetzt, wird Ihr Singleton in Ihrem Hintergrund-Worker/Quartz-Job ebenfalls in den Ruhezustand versetzt. Wenn Sie IdleTimeout auf 0 setzen, wird Ihre Anwendung nicht schlafen.

Wenn Sie Ihren Job/Mitarbeiter in Global.asax.cs Application_Start() starten, wird Ihr Job immer gestartet, wenn Ihre Webanwendung dies tut.

Wenn Sie Ihre App zum ersten Mal bereitstellen oder aktualisieren oder neu starten, müssen Sie sicherstellen, dass Ihre App ausgeführt wird. Nicht sicher, ob in IIS eine Einstellung dafür vorhanden ist. Normalerweise wird Ihre Anwendung jedoch nicht gestartet, bis eine Anforderung an sie gesendet wird. Viel Glück. Lassen Sie es mich wissen, wenn Sie eine Lösung dafür finden.

Gleicher Deal, wenn Sie App aus einem anderen Grund abstürzt. Sie benötigen etwas, um Ihre Web App neu zu starten.

Hoffe, dass hilft!

Verwandte Themen