Service OSGi:当导入的服务在运行时停止时会发生什么

Service OSGi:当导入的服务在运行时停止时会发生什么,service,osgi,declarative-services,Service,Osgi,Declarative Services,假设我使用的是另一个服务B中导入的服务a。当B正常运行时(当然A处于活动状态),将发生的情况是服务A在服务B仍在运行时卸载? 服务A->服务B 如果我正在使用ServiceReference,ServiceTracker和DS,会有什么不同的场景?当在OSGi中取消发布服务时,会向当前使用该服务的所有捆绑包发送一个事件,告诉他们应该停止使用该服务 如果您使用的是DS,将调用unbind方法。呼叫时,您应尽最大努力尽快停止使用该服务。但最终OSGi是一个协作系统,它不能强迫您发布服务。但是,如果不

假设我使用的是另一个
服务B
中导入的
服务a
。当
B
正常运行时(当然
A
处于活动状态),将发生的情况是
服务A
服务B
仍在运行时卸载?
服务A->服务B


如果我正在使用
ServiceReference
ServiceTracker
DS
,会有什么不同的场景?

当在OSGi中取消发布服务时,会向当前使用该服务的所有捆绑包发送一个事件,告诉他们应该停止使用该服务

如果您使用的是DS,将调用unbind方法。呼叫时,您应尽最大努力尽快停止使用该服务。但最终OSGi是一个协作系统,它不能强迫您发布服务。但是,如果不这样做,则可能会导致问题,例如,服务发布服务器将不会被完全垃圾收集。最终会破坏OSGi平台的动态,可能会造成内存泄漏等等

如果您使用的是
ServiceTracker
,则将调用
removedService
方法,您需要以相同的方式进行响应。但我不是在另一个问题中告诉过你不要使用
ServiceTracker
??;-)


如果您使用的是
ServiceReference
,则需要显式注册
servicerencer
,以便接收这些事件。这就是为什么你真的不应该使用这个低级API,除非你获得了更多的经验(一旦你有了经验,你无论如何也不会想使用它!)。

当一个服务在OSGi中被取消发布时,一个事件被发送到当前使用该服务的所有捆绑包,告诉他们应该停止使用它

如果您使用的是DS,将调用unbind方法。呼叫时,您应尽最大努力尽快停止使用该服务。但最终OSGi是一个协作系统,它不能强迫您发布服务。但是,如果不这样做,则可能会导致问题,例如,服务发布服务器将不会被完全垃圾收集。最终会破坏OSGi平台的动态,可能会造成内存泄漏等等

如果您使用的是
ServiceTracker
,则将调用
removedService
方法,您需要以相同的方式进行响应。但我不是在另一个问题中告诉过你不要使用
ServiceTracker
??;-)


如果您使用的是
ServiceReference
,则需要显式注册
servicerencer
,以便接收这些事件。这就是为什么在你获得更多经验之前,你真的不应该使用这种低级API的原因(一旦你有了这种经验,你无论如何也不会想使用它!)。

首先:OSGi的优点之一是,框架和标准服务的行为都是明确指定的。这些规范可以从下载,或者,如果您不喜欢阅读PDF,可以订购打印。这些规范完美地回答了您提出的问题

总之,也就是说:当服务未注册时:

  • ServiceReference
    对象保持原样。但是,调用
    ServiceReference.getService()
    将返回null。请注意,当使用
    ServiceReference
    s时,您应该释放通过
    getService()
    检索到的对实际服务对象的任何引用,这通常需要对服务进行某种跟踪
  • 对于
    ServiceTracker
    ServiceTracker.remove
    被调用。这通常会导致调用
    ServiceTracker
    或定义的
    ServiceTrackerCustomizer
    上的
    removedService()
  • 对于DS,调用所引用服务的已定义的
    unbind
    方法(如果指定)。此外,如果所使用的服务的基数指示该服务是强制性的,则还可以取消注册正在使用的服务,甚至可能停用该服务,或者根据替代服务的可用性和为该服务定义的策略激活新实例

首先:OSGi的优点之一是框架和标准服务的行为都有明确的规定。这些规范可以从下载,或者,如果您不喜欢阅读PDF,可以订购打印。这些规范完美地回答了您提出的问题

总之,也就是说:当服务未注册时:

  • ServiceReference
    对象保持原样。但是,调用
    ServiceReference.getService()
    将返回null。请注意,当使用
    ServiceReference
    s时,您应该释放通过
    getService()
    检索到的对实际服务对象的任何引用,这通常需要对服务进行某种跟踪
  • 对于
    ServiceTracker
    ServiceTracker.remove
    被调用。这通常会导致调用
    ServiceTracker
    或定义的
    ServiceTrackerCustomizer
    上的
    removedService()
  • 对于DS,调用所引用服务的已定义的
    unbind
    方法(如果指定)。此外,如果所使用的服务的基数指示该服务是强制性的,则还可以取消注册正在使用的服务,甚至可能停用该服务,或者根据替代服务的可用性和为该服务定义的策略激活新实例
哈哈哇!:)是的,你告诉过我尼尔。解释得很好,谢谢。顺便说一句,我学到的是版权由你:)路要走!!!哈哈哇!:)是的,你告诉过我尼尔。解释得很好,谢谢。顺便说一句,我学到的是版权由你:)路要走!!!