【发布时间】:2015-05-16 17:39:56
【问题描述】:
假设我在包 A 中有一个 EventGenerator 服务,在包 B 和 C 中有处理器(侦听器)。
A 对 B 和 C 一无所知,其中处理器在初始化时订阅 EventGenerator 事件。
可以在其他包 D、E 等中创建更多的侦听器。
在 Spring 应用程序中,我会在构造处理器时进行订阅,将 EventGenerator 作为构造函数参数传递。我会让 B 和 C 在逻辑上依赖于 A。在 @PostConstruct 上我会有工作系统,准备好处理事件。
如何将 A、B 和 C 初始化为 OSGi 应用程序?当 EventGenerator 开始工作并且处理器错过事件时,我遇到了问题,因为它们尚未初始化并订阅它们。
【问题讨论】:
-
如果你可以通过 ConfigAdmin 配置 EventGenerator 在发送第一个事件之前等待指定的处理器,我可以举个例子。
-
我认为 EventGenerator 从架构的角度了解它的听众是错误的。可以随时添加另一个捆绑侦听器。不应更改 EventGenerator 包。
-
我的意思是一个可配置的组件。这意味着只需要更改配置(通过 configadmin),而不需要更改 EventGenerator 捆绑包本身。在实践中:当您想要一个新的处理器时,您将捆绑包放入包含处理器的 OSGi 容器中,然后打开 Web 控制台并将新处理器添加到配置屏幕上的 EventGenerator(或者您进行配置更新如果您编写一些部署代码,则以编程方式)
-
你提出了类似控制器的东西,它应该知道 EventGenerator 和侦听器,它应该设法进行订阅并在完成时自行启动 EventGenerator。这肯定会奏效,但这种架构也很僵化。我正在寻找的是一种 @PostConstruct 回调,不仅是在当前包中构造的 Spring bean,而且在 OSGi 应用程序的所有包中。我会在 bean/服务构造上完成所有需要的订阅,并在 ProerptiesSet() 之后开始处理事件。这将只需要监听器对 EventGenerator 的逻辑依赖。
-
“但在 OSGi 应用程序的所有捆绑包中”:您无法不知道 OSGi 应用程序中有多少捆绑包。您无法知道捆绑包是否在运行时被替换。如果您使用 Spring,所有知识都在一个框架内,并且该框架只能作为一个单元重新部署。如果您使用 OSGi,您的应用程序是模块化的,并且这些模块有自己的生命周期。你不能在 OSGi 中拥有像 @PostConstruct 这样的功能,因为没有一切准备就绪和修复的状态。