Java 强制重新加载OSGi服务

Java 强制重新加载OSGi服务,java,osgi,Java,Osgi,假设我有2个OSGi服务。其中之一是数据库记录的内存缓存。另一个服务是对这些DB记录的一组操作。在修改期间,我希望重建现有缓存。一个服务如何强制修改另一个?类似于发送org.osgi.framework.servicevent.MODIFIEDevent的内容 (请注意,这是真实业务案例的简化示例,我并没有真正将缓存作为一种服务来放置) 更新使问题更清楚-我需要与ServiceRegistration#setProperties提供的功能完全相同的功能。不幸的是,ServiceRegistrat

假设我有2个OSGi服务。其中之一是数据库记录的内存缓存。另一个服务是对这些DB记录的一组操作。在修改期间,我希望重建现有缓存。一个服务如何强制修改另一个?类似于发送
org.osgi.framework.servicevent.MODIFIED
event的内容

(请注意,这是真实业务案例的简化示例,我并没有真正将缓存作为一种服务来放置)


更新使问题更清楚-我需要与
ServiceRegistration#setProperties
提供的功能完全相同的功能。不幸的是,
ServiceRegistration
不应离开捆绑包的边界

请,请不要尝试这样做

只有服务的提供者包知道它背后的实现是什么。。。这就是为什么只有提供商可以访问注册详细信息


缓存提供程序应自行检测基础数据是否已更改,并适当刷新缓存。没有其他捆绑包可以这样做,因为他们不知道缓存提供程序从何处获取数据,他们只能看到公共服务接口。

为什么要使用服务解决此问题


只需使用CRUD包中的EventAdmin发送一个事件,该事件表示数据已修改。因此缓存可以侦听这些事件并相应地采取行动。事件解决方案的优点是crud服务实际上不必知道有缓存,它只需将事件发送给感兴趣的人。

在OSGi服务接口中提供一个操作来重建缓存?这与OSGi没有太大关系-您的组件有一个内部缓存,所以您希望在接口中提供一种方法来重建它。好吧,如果我真的使用缓存作为服务-那么是的。但我刚刚解决了问题-一个服务需要强制修改另一个(在OSGI术语中)对我来说听起来像是代码气味,一个OSGI服务不应该代表另一个发送注册事件。@eis完全同意OSGI不合适,但场景真的很灵活-DB被更改,需要就此通知捆绑包/服务。那么,您的建议是什么来避免“代码气味”?“应该自行检测底层数据是否已更改”-所以您提出了看门狗模式?不,显然存在更好的解决方案-一些事件总线。Writer会在发生更改时通知缓存,而且速度快且可靠。但不幸的是,这个解决方案不是OSGi的一部分。在另一种情况下,缓存提供程序服务可以有一个其他人可以调用的方法来请求重建缓存。