Unterstützen Klassen in einer JRE-Bibliothek beobachtbare und / oder asynchrone Lesevorgänge von externen / Nicht-JRE-Assemblys?


12

Wie kann ich meine plattformübergreifende Bibliothek (z. B. auf JRE) implementieren, um auf Objektreferenzen threadsicher zu arbeiten, sodass native Front-Ends auf anderen Plattformen das Objekt beobachten und Observable-Muster nutzen können?

Ein kleiner Hintergrund - es gibt ein Konzept der Datenbindung, das in den meisten Front-End-Frameworks verwendet wird. In C # und Java bezieht sich dies auf das Merkmal Observable, mit dem eine Klasse Ereignisse auslösen kann, wenn Änderungen auftreten, die von mehreren Steuerelementen oder "Beobachtern" abonniert werden können. Auf diese Weise müssen die Beobachter die Ressource nicht ständig abfragen / lesen, um nach Updates zu suchen.

Ich möchte an einer Analyse-Engine arbeiten, die im Laufe der Zeit Änderungen an Datenlisten vornimmt. Es wäre schön, wenn das Front-End diese Listen beobachten könnte, während die Analyse ausgeführt wird. Es scheint mir, dies würde erfordern, dass das Front-End in der Lage ist, ein Objekt an die Analyse-Engine zu übergeben, die in einer Bibliothek geschrieben ist, die hoffentlich plattformübergreifend ist, und in der Lage ist, thread-sichere Lesevorgänge für dieses Objekt durchzuführen. Oder lassen Sie die Bibliothek Beobachtbarkeitsverträge erfüllen.

Bei älteren CLI-Engines im Unix-Stil wird stdin / stdout / stderr verwendet und die Engine wird in regelmäßigen Abständen aktualisiert. Dies erfordert standardmäßigen Overhead und Textanalyse, die ich nach Möglichkeit lieber vermeiden würde.


2
Im Allgemeinen ist es am besten, die Kernfrage etwas enger zu machen als "Ist X möglich?", Da die richtige Antwort darauf fast immer "Ja, wenn Sie sich genug anstrengen" lautet. Es hört sich so an, als ob Sie wirklich fragen möchten: "Wie kann ich X ohne den Overhead von stdin / stdout ausführen?" In welchem ​​Fall können Sie einfach eine statisch oder dynamisch verknüpfte Bibliothek verwenden? Muss diese Bibliothek aus irgendeinem Grund ein von der Benutzeroberfläche getrenntes Programm sein?
Ixrec

Danke, Ixrec. Glaubst du, ich habe es so formuliert, wie du es in meinem Titel vorgeschlagen hast? Der Grund, warum ich möchte, dass die Bibliothek portabel und das Front-End nativ ist, ist, dass ich denke, dass native UI-Frameworks im Allgemeinen besser funktionieren (Meinungsalarm!), Aber ich möchte die Logik der Engine nicht zweimal schreiben .
Brandon Arnold

Warum kann eine statisch oder dynamisch verknüpfte Bibliothek nicht portiert werden? Betreff: Der Titel, das ist ein Lehrbuchbeispiel für eine "zu breite" Frage; Ich habe mich nicht darauf konzentriert, weil es im Rest Ihrer Frage spezifischere Fragen zu geben schien.
Ixrec

@Ixrec Es kann. Die Frage geht davon aus, dass es sich um eine Bibliothek handelt, die diese Möglichkeiten beinhaltet. Ich möchte nur sicherstellen, dass alle Anwendungen, die diese Bibliothek verwenden, Verweise auf Objekte beobachten können, die asynchron an sie übergeben werden, während sie bearbeitet werden.
Brandon Arnold

1
@Ixrec Ich habe den Titel aktualisiert, um weniger breit zu sein
Brandon Arnold

Antworten:


1

Sie können eine Integrationsstufe über dem Modell Ihrer Bibliothek erstellen, indem Sie beispielsweise das Apache Camel-Integrationsframework verwenden. Die Netty-Komponente könnte wahrscheinlich Ihren Anforderungen entsprechen. Mit einem beobachtbaren Muster sollte Ihre Integrationsstufe die empfangenen Änderungen Ihres Modells transformieren und sie den Front-End-Abonnenten mitteilen. Eine andere ähnliche Möglichkeit, Ihre Anforderung zu interpretieren, besteht darin, sich eine ereignisgesteuerte Architektur vorzustellen, bei der die Beobachterlistener in Ihrer Integrationsebene eine Nachricht in einem JMS-Thema veröffentlichen, damit verbundene Subskriptoren in den Front-Ends diese erhalten.


0

Ich habe eine ganz andere Antwort geschrieben und vorgeschlagen, dass Ihr Publisher Aktualisierungen in eine Warteschlange oder eine Pipe schreibt - aber dann habe ich die Frage erneut gelesen.

Wenn ich richtig verstanden habe, ist Ihre allgemeine Frage, dass Sie eine Bibliothek für die Ausführung in der JRE schreiben möchten, in der ein natives Front-End den Status von Java-Objekten threadsicher abfragen kann.

Dies ist unglaublich weitreichend, da es Hunderte von Möglichkeiten gibt, wie ein Front-End mit Bibliothekscode interagieren kann, der in einer JRE ausgeführt wird - JNI, EJB RPC, HTTP-Schnittstellen im RPC-Stil, Anforderungsantwort über Nachrichtenwarteschlangen usw.

Was auch immer Sie wählen, irgendwann in der Kette sollte es einen Java-Methodenaufruf geben, und hier können Sie die Kontrolle über die Threadsicherheit übernehmen. Dort steht Ihnen das gesamte Arsenal an Gewindesicherheitswerkzeugen zur Verfügung. Sie können synchronisieren, defensive Kopien zurückgeben, mit zwischengespeicherten Daten arbeiten usw.

Überlegen Sie jedoch, ob dies das Modell ist, dem Sie folgen möchten. Es ist möglicherweise übersichtlicher, zu einem Modell zu wechseln, bei dem Ihre Bibliothek Aktualisierungen an das Front-End überträgt, die ausreichende Informationen enthalten, damit die Objekte nicht abgefragt werden müssen.


Zusätzlicher Kommentar - Haben Sie darüber nachgedacht, Redis (oder ähnliches) als Vermittler zwischen Ihrem Frontend und Ihrem Backend zu verwenden?
Slim
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.