JRE库中的类是否支持对外部/非JRE程序集的可观察和/或异步读取?


12

如何实现我的跨平台库(例如在JRE上)以对对象引用以线程安全的方式进行操作,以便其他平台上的本机前端可以观察对象并利用Observable模式?

有一点背景-大多数前端框架中都使用了数据绑定的概念。在C#和Java中,这与Observable特性有关,该特性使类能够在发生更改时触发事件,多个控件或“观察者”可以订阅该事件。这样,观察者就不必继续轮询/读取资源,进行更新比较。

我想研究一个分析引擎,该引擎会随着时间的推移对数据列表进行更改。能够让前端在分析运行时能够观察这些列表将是很好的。在我看来,这将要求前端能够将对象传递给分析引擎,并在希望跨平台的库中编写该对象,并且能够对该对象进行线程安全读取。否则,让图书馆满足可观察性合同。

在较旧的Unix风格的CLI引擎中处理此问题的方法是使用stdin / stdout / stderr,并使引擎定期更新更新。这需要标准的开销和文本解析,如果可能的话,我宁愿避免。


2
通常最好使核心问题比“ X可能吗?”窄一些,因为对此的正确答案几乎总是“是的,如果您努力尝试一下。” 听起来您真的想问“没有stdin / stdout的开销我怎么做X?” 在这种情况下,为什么不简单地使用静态或动态链接的库呢?由于某种原因,您是否需要将此库与UI分开作为单独的程序?
Ixrec

谢谢,Ixrec。您认为我用您在标题中建议的方式来表达它吗?我希望库是可移植的,前端是本机的原因是因为我认为本机UI框架通常可以更好地工作(opinion警报!),但是我不想重复编写引擎的逻辑。
布兰登·阿诺德

为什么静态或动态链接库不能移植?回复:标题,那是“太广泛”问题的教科书示例;我没有专注于此,因为在您的其余问题中似乎还有更具体的问题。
Ixrec

@Ixrec可以。该问题假定它是一个图书馆,其中包括那些可能性。我只想确保使用此库的所有应用程序都可以在操作对象时观察对异步传递给它的对象的引用。
布兰登·阿诺德

1
@Ixrec我已经更新了标题的标题
布兰登·阿诺德

Answers:


1

您可以使用(例如)Apache骆驼集成框架在您的图书馆模型上创建集成层。Netty组件可能适合您的需求。通过可观察的模式,您的集成层应该转换模型收到的更改并将其通知前端订户。解释需求的另一种类似方法是考虑事件驱动的体系结构,当模型发生更改时,集成层中的观察者侦听器会在JMS主题中发布消息,以便前端的连接下标可以接收它们。


0

我写了一个完全不同的答案,建议您的发布者将更新写到队列或管道中,但是随后我重新阅读了问题。

如果我理解正确,那么您的一般问题是要编写一个在JRE中运行的库,本机前端可以在该库中以线程安全的方式查询Java对象的状态。

这是非常广泛的,因为前端有数百种方法可以与JRE中运行的库代码进行交互-JNI,EJB RPC,RPC样式的HTTP接口,消息队列上的请求响应等。

但是,无论您选择哪种方法,都应该在链中的某个位置进行Java方法调用,这就是控制线程安全性的地方。在那里,您可以使用整个线程安全工具库。您可以同步,可以返回防御性副本,使用缓存的数据等。

但是,请考虑是否要使用此模型。转到“别问我,我告诉你”模型可能更干净一些,在该模型中,您的库将更新推送到前端,该更新包含不需要查询对象的足够信息。


额外评论-您是否考虑过将Redis(或类似产品)用作前端和后端之间的中介?
2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.