enhancement
major
minor
defect
critical
major
minor
major
#30088
Ebene anzeigen: Dokumentieren Sie, wie eine „ChannelSource“ einen Monitor am Laufen hält, während dessen Ansicht ausgeblendet ist, und ihn mit dem Fenster beendet.
Weiterverfolgung von #29814 und #29869, beobachtet mit 8.0.0-alpha12 in E-Home (haumacher/ehome, Gruppe „monitor projects/monitor.view.xml“, de.haumacher.ehome.monitor.MonitorSource).
Ein <source-channel> abonniert seine ChannelSource nur, solange die Ansicht, in der er deklariert ist, angezeigt wird; das Ausblenden der Ansicht (Auswahl eines anderen Reiters) beendet das Abonnement. Einige Quellen müssen einen Prozess am Laufen halten, während die Ansicht ausgeblendet ist: beispielsweise ein KNX-Gruppenmonitor, der den Bus protokolliert, oder ein Datenbankmonitor, der die Abfragen der Anwendung aufzeichnet (wie es der Monitor der klassischen Benutzeroberfläche tat, der über seine Ansicht gestartet und gestoppt wurde), damit das vollständige Protokoll angezeigt wird, wenn die Registerkarte wieder eingeblendet wird. Eine solche Quelle muss wissen, wann die Aufzeichnung spätestens beendet werden muss: wenn das Fenster geschlossen wird (#29869: der Client bleibt weg) oder die Sitzung endet. Die Dokumentation zu ChannelSource enthielt keine Angaben zu diesem Fall, daher abgefragt E-Homes MonitorSource alle 60 Sekunden die ReactWindowRegistry, um festzustellen, ob sein Fenster noch registriert war.
Lösung
Es ist keine neue API erforderlich: Die Lebensdauer eines solchen Monitors entspricht der Sub-Session des Fensters. In der React-Benutzeroberfläche verfügt jedes Fenster über eine eigene Sub-Session, und „subscribe“ wird auf einem Anforderungsthread des Fensters ausgeführt, sodass TLContextManager.getSubSession() diese zurückgibt. TLSubSessionContext.addUnboundListener(SubSessionListener) informiert die Quelle, wenn die Untersitzung entfernt wird – sowohl beim Schließen des Fensters (ReactWindowRegistry.windowClosed) als auch beim Ende der Sitzung. Die Indizierung des Monitors anhand der Untersitzung anstelle des ` ViewContext ` ermöglicht es zudem den im selben Fenster neu erstellten View-Instanzen (nach einer Anmeldung im Fenster oder einem Neuladen der Ansicht), den laufenden Monitor wiederzufinden.
Die JavaDoc zu ChannelSource und der Artikel „view-layer/channels“ beschreiben dieses Muster: Das Abonnement bezieht sich auf die Zeit, in der die Ansicht angezeigt wird, nicht auf die Lebensdauer dessen, was dahinter läuft; alles, was weiterlaufen muss, während die Ansicht ausgeblendet ist, wird an die Sub-Session des Fensters gebunden und endet mit deren Entbindungsbenachrichtigung.
Anpassung in E-Home
MonitorSource registriert einen SubSessionListener für die Untersitzung des abonnierenden Fensters und stoppt den Monitor, sobald eine Benachrichtigung eingeht, anstatt die ReactWindowRegistry abzufragen.