为什么 ConfigurationAdmin 规范使用自己的事件机制,而不是 EventAdmin?



我想理解为什么 ConfigurationAdmin 规范定义了自己的调度事件机制,而不是使用 EventAdmin 规范,该规范也在 OSGi Compendium 中定义。

ConfigurationAdmin 规范提到它将 ConfigurationEvents 发送到在服务注册表中注册的 ConfigurationListeners。

配置事件的侦听器。触发配置事件时,它将异步传递 到所有配置侦听器。

配置侦听器对象在框架服务注册表中注册并收到通知 触发事件时使用配置事件对象。 ConfigurationListener 对象可以检查收到的 ConfigurationEvent。

这似乎是 EventAdmin 的一个很好的候选者,因为 ConfigurationEvent 的属性都是原始的。

val event: Event = Event(Hashtable(mapOf<String, Any>(
"type" to CM_UPDATED,
"service.factoryPid" to "someFactoryPid.guid",
"service.pid" to "somePid.guid"
)))
@Component
class ConfigurationListener : EventHandler {
override fun handleEvent(event: Event) {
// ...
}
}

我正在设计一些利用某种事件处理机制的服务。我认为我的选择是使用EventAdmin(在纲要中提供),并滚动我自己的(如ConfigurationAdmin)。

我想知道是什么设计决策导致OSGi联盟为ConfigurationAdmin创建了一个单独的事件机制,而不是由EventAdmin提供的已经创建的事件机制,以及我在选择事件机制时是否需要考虑相同的因素。

这似乎是重复的工作。

事件
  • 管理员可以同步或异步发送事件(sendEventpostEvent),并且已经提供了一个响应事件的接口(EventHandler)。
  • ConfigurationAdmin 以
  • 异步或同步方式发送 ConfigurationEvents,具体取决于用于响应事件的接口(ConfigurationListenerSynchronousConfigurationListener),而不是调用的方法。

我考虑过的一种可能性是,OSGi联盟不想使纲要中定义的服务依赖于其他纲要服务,基于配置管理员没有问题的事实依赖于核心中定义的服务注册表。

这似乎与服务不能保证在运行时存在的理解相一致;因此,让 ConfigurationAdmin 依赖于 EventAdmin 等同于"你不能使用此可选服务 (ConfigurationAdmin),除非这个其他可选服务 (EventAdmin) 也保证在运行时中",这有点矛盾。

有几个原因:

  • 配置管理员是在事件管理之前设计的
  • 类型安全事件接口(如配置管理员)比使用属性更易于使用
  • 正如您所发现的,如果服务相互依赖,那就不好了。实现应该能够自由选择服务,而不是人为地限制。

最新更新