Czy klasy w bibliotece JRE obsługują obserwowalne i / lub asynchroniczne odczyty ze zbiorów zewnętrznych / innych niż JRE?

12

Jak mogę zaimplementować bibliotekę między platformami (np. W środowisku JRE), aby działała w sposób bezpieczny dla wątków w odniesieniu do odwołań do obiektów, aby natywne interfejsy na innych platformach mogły obserwować obiekt i korzystać z obserwowalnych wzorców?

Trochę tła - istnieje koncepcja wiązania danych używana w większości frameworków. W języku C # i Javie jest to związane z cechą Obserwowalną, która daje klasie możliwość wyzwalania zdarzeń w przypadku zmian, które mogą subskrybować wiele kontrolek lub „obserwatorów”. W ten sposób obserwatorzy nie muszą sondować / czytać zasobu, porównując aktualizacje.

Chcę pracować nad silnikiem analizy, który z czasem wprowadza zmiany w listach danych. Byłoby miło, gdyby front-end mógł obserwować te listy podczas analizy. Wydaje mi się, że wymagałoby to od frontonu możliwości przekazania obiektu do silnika analizy, zapisanego w bibliotece, która, mam nadzieję, jest wieloplatformowa, i umożliwienia bezpiecznego odczytu wątków tego obiektu. Albo biblioteka powinna spełniać umowy dotyczące obserwowalności.

Sposób obsługiwany w starszych silnikach CLI w stylu uniksowym polega na użyciu stdin / stdout / stderr i regularnym aktualizowaniu postu silnika. Wymaga to standardowego narzutu i analizowania tekstu, którego wolałbym raczej unikać, jeśli to możliwe.

Brandon Arnold
źródło
2
Zasadniczo najlepiej jest nieco zawęzić podstawowe pytanie niż „Czy X jest możliwe?”, Ponieważ poprawną odpowiedzią na to pytanie jest prawie zawsze „Tak, jeśli spróbujesz wystarczająco mocno”. Wygląda na to, że naprawdę chcesz zapytać: „Jak mogę zrobić X bez narzutu standardowego / standardowego?” W takim przypadku, dlaczego po prostu nie skorzystać ze statycznie lub dynamicznie połączonej biblioteki? Czy z jakiegoś powodu potrzebujesz tej biblioteki, aby była oddzielnym programem od interfejsu użytkownika?
Ixrec,
Dzięki, Ixrec. Myślisz, że sformułowałem to tak, jak sugerujesz w moim tytule? Powodem, dla którego chciałbym, aby biblioteka była przenośna, a interfejs jest natywny, jest to, że myślę, że natywne frameworki interfejsu użytkownika generalnie działają lepiej (alert opinii!), Ale nie chcę pisać logiki silnika dwa razy .
Brandon Arnold,
Dlaczego statycznie lub dynamicznie połączona biblioteka nie może być przenośna? Re: Tytuł, to podręcznikowy przykład „zbyt szerokiego” pytania; Nie skupiłem się na tym, ponieważ w pozostałej części pytania pojawiły się bardziej szczegółowe pytania.
Ixrec,
@Ixrec Może. Pytanie zakłada, że ​​jest to biblioteka, która obejmuje te możliwości. Chciałbym tylko upewnić się, że wszystkie aplikacje korzystające z tej biblioteki będą mogły obserwować odniesienia do obiektów, które są do niej przekazywane asynchronicznie podczas działania.
Brandon Arnold,
1
@Ixrec Zaktualizowałem tytuł, aby był mniej szeroki
Brandon Arnold,

Odpowiedzi:

1

Możesz utworzyć warstwę integracji na podstawie modelu biblioteki, używając (na przykład) struktury integracji wielbłąda Apache. Komponent Netty prawdopodobnie pasuje do twoich potrzeb. Za pomocą obserwowalnego wzorca warstwa integracji powinna przekształcić otrzymane zmiany w modelu i powiadomić o nich subskrybentów frontonu. Innym podobnym sposobem interpretacji wymagań jest myślenie o architekturze sterowanej zdarzeniami, w której gdy model się zmienia, nasłuchiwanie obserwatorów w warstwie integracji publikuje komunikat w temacie JMS, dzięki czemu połączone subskrybery na frontonach je otrzymają.

AlexCG
źródło
0

Napisałem zupełnie inną odpowiedź, sugerując, że twój wydawca pisze aktualizacje do kolejki lub potoku - ale potem ponownie czytam pytanie.

Jeśli dobrze rozumiem, twoje ogólne pytanie brzmi: chcesz napisać bibliotekę do działania w środowisku JRE, w której natywny interfejs może sprawdzać stan obiektów Java w sposób bezpieczny dla wątków.

Jest to niezwykle szerokie, ponieważ istnieją setki sposobów, w jakie fronton może współdziałać z kodem biblioteki działającym w środowisku JRE - JNI, EJB RPC, interfejsy HTTP w stylu RPC, odpowiedzi na żądania w kolejkach komunikatów itp.

Niezależnie od tego, co wybierzesz, w pewnym momencie łańcucha powinno być wywołanie metody Java i tam możesz przejąć kontrolę nad bezpieczeństwem wątków. Tam masz cały arsenał narzędzi do zabezpieczania gwintów. Możesz synchronizować, możesz zwracać kopie obronne, pracować z buforowanymi danymi itp.

Zastanów się jednak, czy to model, który chcesz zastosować. Przejście do modelu „nie pytaj mnie, powiem” może być łatwiejsze, w którym Twoja biblioteka wypycha aktualizacje do interfejsu użytkownika, zawierające wystarczającą ilość informacji, że nie musi wysyłać zapytań do obiektów.

szczupły
źródło
Dodatkowy komentarz - czy zastanawiałeś się nad użyciem Redis (lub podobnego) jako pośrednika między frontem a tyłem?
szczupły