Fernabfrage in ManagedBean und Benachrichtigung der Client-Ansicht per Push

9

Ich habe eine jsf-Ansicht, die einige Daten von einer verwalteten Bean (viewscope) in einer Tabelle anzeigt, die remote abgerufen wird.
Momentan werden die Daten per Polling aus der Client-Ansicht mit Hilfe der Primefaces-Poll-Komponente aktualisiert.

Dies reicht nicht aus, da zu viel Datenverkehr an den Client gesendet wird und jetzt, dass serial-press servers unterstützt, ich die Daten nur neu laden und in die Client-Ansicht schieben möchte, wenn Daten geändert wurden.

Dies sollte durch Abfragen von der Web-Schicht zur Anwendungsebene realisiert werden, indem eine Methode wie hasChanged(...) aufgerufen wird. Wenn Daten geändert werden, sendet die Web-Schicht eine Benachrichtigung an den Client, um Daten neu zu laden.

Aktuelle Kundenumfrage

client & gt; & gt; Web-Tier & gt; & gt; App-Tier

Client fragt Web-Tier über Ajax nach Daten ab, die erneut nach einer App-Tier für Daten und Updates fragen

Gewünschte Umfrage in Web-Tiers und Push

client & lt; & lt; Web-Tier & gt; & gt; App-Tier

Web-Tier fragt App-Tier ab, wenn sich die Daten im Auftrag geändert haben und erneut geladen werden, und informiert (schiebt) den Client, um die Ansicht zu aktualisieren

Ansätze:

Was ist der beste Ansatz, um die Abfrage auf der Managed-Bean in der Web-Tier zu realisieren?

  1. TimerTask in der Managed-Bean-Methode Erstellen von Threads in einer JSF-verwalteten Bean für geplante Tasks mithilfe eines Timers
  2. Zusätzliches EJB mit Schedule Annotation
  3. Zusätzliches EJB mit TimerService
  4. andere?

Bearbeiten:

Architektur: (3-stufig)

  • Server1: Datenbank
  • Server2: App-Tier (EAR mit Remote EJB + Hibernate)
  • Server3: Web-Tier (WAR mit JSF 2.0 + Primefaces 3.4)
  • Client: Browser

    
djmj 25.10.2012, 01:26
quelle

1 Antwort

3

Aufgrund meiner Erfahrung kann ich zwei Routen empfehlen, Spring Integration und CDI Events. Ich würde die Frühjahrsroute empfehlen, aber basierend auf deinem aktuellen Stack denke ich, dass CDI-Events von dir abgedeckt wurden. Sie helfen Ihnen sauber das Observer / Observable-Muster zu erreichen und Sie können auch eine saubere Trennung der Ebenen vornehmen. Ich muss Sie jedoch warnen, dieser Ansatz ist nur für einen kleinen bis mittleren Anwendungsfall wirksam. Berücksichtigen Sie Folgendes:

  1. Entwerfen und implementieren Sie eine Event -Klasse, die alle Informationen kapselt, die an die Konsumenten geliefert werden müssen. Nennen wir es ein Ereignis FundsTransfer . Ihre Ereignisimplementierung sollte genügend Informationen enthalten, damit die Listener nur nach Ereignissen filtern, die von Interesse sind. Ein einfaches POJO

    %Vor%
  2. Implementieren Sie ein Business-Objekt auf der Business-Schicht, nennen Sie es Notifier . Die Funktion der Abfrage sollte an dieses Objekt delegiert werden. Es ist verantwortlich für die Erstellung und Veröffentlichung von Objekten des Typs event als Reaktion auf Änderungen auf der Serverseite. Je nach Ihren Anforderungen könnte dieses Objekt ein Singleton sein, der alle Event -Typen behandelt, oder Sie könnten eine Gruppe von Notifier -Typen für verschiedene Ereignisse abrufen lassen.

    %Vor%

    Im obigen Code habe ich ein Timer EJB als meinen Beobachter benutzt. Eine Einführung in die EJB-Timer finden Sie . Auch hier wird das Objekt Observer in der App-Ebene leben

  3. Die Client-Schicht hat jeweils Zugriff auf ein Listener-Objekt, das benachrichtigt wird, wenn ein interessierendes Ereignis eintritt (das von einem Notifier -Typ veröffentlicht wurde). Dann kann der Listener ein push basierend auf diesem Ereignis ausgeben. Ihr Listener-Objekt könnte ein POJO mit @Named CDI-Annotation sein. Implementieren Sie in Ihrem Listener-Objekt einfach eine Methode mit einer Annotation @Observes mit einem Parameter des Ereignistyps, an dem der Listener interessiert ist:

    %Vor%

    Die obige Filterung ist im Vergleich zu den Nachrichtenfilterungsoptionen, die CDI bereitstellt, immer noch ziemlich grob. Wie Sie dem Tutorial entnehmen können, auf das zuvor verwiesen wurde, könnten Sie CDI-Qualifizierer erstellen, die eine feinere Filterung von Nachrichten ermöglichen. Wie ich bereits erwähnt habe, ist dies für den Einsatz im großen Maßstab ein wenig schwer. In diesem Fall würde ich die Route der Frühjahrsintegration empfehlen, wenn Sie die Abhängigkeit nutzen wollen.

Zusammenfassend ist das Modell des Systems:

%Vor%     
kolossus 30.10.2012 05:32
quelle

Tags und Links