【发布时间】:2016-12-30 14:32:03
【问题描述】:
OSGi ConfigurationAdmin 规范提到ManagedService 和ManagedServiceFactory 的实现可能会通过抛出ConfigurationException 来表示无效的传入配置。然而,除了这个声明之外,规范没有说明各种参与者应该如何处理这种情况,最重要的是,在这种异常之后应该是什么环境状态。
例如,假设ManagedServiceFactory 当前有一个具有一组有效属性的服务实例(比如说 service.pid=example.12345);该服务实例由工厂发布到服务注册表中。然后,工厂被通知该服务实例的配置更新;但是,在验证时,更新方法确定传入的属性无效。因此,根据规范,工厂应该抛出一个ConfigurationException。
但是,如果什么都不做,环境仍然处于不稳定状态:现在注册表中有一个基于不再存在的配置的已发布服务;因此,每当ManagedServiceFactory 服务重新启动(例如,由于包更新或整个框架重新启动),将无法重新实例化该服务,它之前的有效配置已丢失。这打破了 Configuration Admin 子系统的持久性范式,并对某些 OSGi 环境的稳定性造成严重问题。
不幸的是,初始配置程序包没有简单的方法来检测其配置更改导致了 ConfigurationException,因此通常很难从该位置恢复稳定的配置。在我看来,在这种情况下,ConfigurationAdmin (持久地)恢复以前有效的配置会更合适,但不幸的是,规范中没有提到这种行为,我也看不到任何痕迹Felix 实现中的这种机制。
鉴于这些事实,似乎保持环境稳定性的唯一可能性是ManagedServiceFactory 实现首先取消注册并销毁它已收到无效配置属性的现有服务实例,并且只有在那之后,抛出强制的ConfigurationException。这将有效地导致与此时重新启动框架时相同的环境状态。同样,ManagedService 实现应该通过首先完全恢复其默认配置来处理无效配置,然后抛出 ConfigurationException。
那么,究竟应该如何处理ManagedService 和ManagedServiceFactories 配置更新中的错误呢?我的理解正确吗?从我在ManagedService 和ManagedServiceFactory 的示例/开源实现中看到的情况来看,大多数开发人员似乎完全忽略了这一方面。规范是否提供了有关该主题的任何说明?
【问题讨论】: