¿Las clases en una biblioteca JRE admiten lecturas observables y / o asíncronas de ensamblajes externos / no JRE?

12

¿Cómo puedo implementar mi biblioteca multiplataforma (por ejemplo, en JRE) para que funcione de manera segura en las referencias de objetos, de modo que los front-end nativos en otras plataformas puedan observar el objeto y aprovechar los patrones Observables?

Un poco de historia: hay un concepto de enlace de datos utilizado en la mayoría de los marcos de aplicaciones para usuario. En C # y Java esto está relacionado con el rasgo Observable que le da a una clase la capacidad de disparar eventos cuando ocurren cambios, a los que pueden suscribirse múltiples controles u "observadores". De esta manera, los observadores no tienen que seguir sondeando / leyendo el recurso, comparando las actualizaciones.

Quiero trabajar en un motor de análisis que realice cambios en las listas de datos a lo largo del tiempo. Sería bueno poder hacer que el front-end pueda observar estas listas mientras se ejecuta el análisis. Me parece que esto requeriría que el front-end pueda pasar un objeto al motor de análisis, escrito en una biblioteca que, con suerte, es multiplataforma, y ​​poder realizar lecturas seguras de ese objeto. O bien, haga que la biblioteca satisfaga los contratos de observabilidad.

La forma en que esto se maneja en los motores CLI de estilo Unix más antiguos es usar stdin / stdout / stderr, y hacer que el motor publique actualizaciones en intervalos regulares. Esto requiere gastos generales estándar y análisis de texto que preferiría evitar, si es posible.

Brandon Arnold
fuente
2
En general, es mejor hacer que la pregunta central sea un poco más estrecha que "¿Es posible X?", Ya que la respuesta correcta es casi siempre "Sí, si se esfuerza lo suficiente". Parece que realmente quieres preguntar "¿Cómo puedo hacer X sin la sobrecarga de stdin / stdout?" En ese caso, ¿por qué no simplemente usar una biblioteca vinculada estática o dinámicamente? ¿Necesita esta biblioteca para ser un programa separado de la interfaz de usuario por alguna razón?
Ixrec
Gracias Ixrec. ¿Crees que lo he expresado de la manera que sugieres en mi título? La razón por la que me gustaría que la biblioteca sea portátil, y que el front-end sea nativo, es porque creo que los marcos de interfaz de usuario nativos generalmente funcionan mejor (¡alerta de opinión!), Pero no quiero escribir la lógica del motor dos veces .
Brandon Arnold
¿Por qué una biblioteca enlazada estática o dinámicamente no puede ser portátil? Re: El título, ese es un ejemplo de libro de texto de una pregunta "demasiado amplia"; No me concentré en eso porque parecía haber preguntas más específicas en el resto de su pregunta.
Ixrec
@ Ixrec puede. La pregunta supone que es una biblioteca, que incluye esas posibilidades. Solo me gustaría asegurarme de que cualquier aplicación que consuma esta biblioteca podrá observar referencias a objetos que se le pasan de forma asíncrona, mientras están siendo operados.
Brandon Arnold
1
@Ixrec He actualizado el título para que sea menos amplio
Brandon Arnold

Respuestas:

1

Puede crear un nivel de integración sobre el modelo de su biblioteca utilizando (por ejemplo) el marco de integración apache camel. El componente Netty probablemente podría satisfacer sus necesidades. Con un patrón observable, su nivel de integración debe transformar los cambios recibidos de su modelo y notificarlos a los suscriptores front-end. Otra forma similar de interpretar su requerimiento es pensar en una arquitectura basada en eventos donde, cuando cambia su modelo, los oyentes observadores en su nivel de integración publican un mensaje en un tema JMS para que los suscriptores conectados en los front-end los reciban.

AlexCG
fuente
0

Escribí una respuesta completamente diferente, sugiriendo que su editor escriba actualizaciones en una cola o una tubería, pero luego releí la pregunta.

Si entiendo bien, su pregunta general es que desea escribir una biblioteca para ejecutar en el JRE, en la que un front-end nativo puede consultar el estado de los objetos Java de una manera segura para subprocesos.

Esto es increíblemente amplio porque hay cientos de formas en que un front-end puede interactuar con el código de la biblioteca que se ejecuta en un JRE: JNI, EJB RPC, interfaces HTTP de estilo RPC, solicitud-respuesta sobre colas de mensajes, etc.

Sin embargo, cualquiera que elija, en algún momento de la cadena, debería haber una llamada al método Java, y ahí es donde puede tomar el control de la seguridad de los subprocesos. Allí, tiene todo el arsenal de herramientas de seguridad de hilos a su disposición. Puede sincronizar, puede devolver copias defensivas, trabajar con datos en caché, etc.

Sin embargo, considere si este es el modelo que desea seguir. Puede ser más limpio pasar a un modelo de "no me preguntes, te lo diré", en el que tu biblioteca envía actualizaciones al front-end que contiene información suficiente que no necesita consultar los objetos.

Delgado
fuente
Comentario adicional: ¿ha considerado usar Redis (o similar) como intermediario entre sus extremos delantero y trasero?
delgado