【发布时间】:2015-01-15 12:01:52
【问题描述】:
几周前我开始使用 OSGi,并且有一个关于 DS 的问题。
假设我有 2 个捆绑包,捆绑包 A 和捆绑包 B。两者都通过 DS / BND 注释注册服务。
Bundle A 引用了Bundle B 的服务,实现了所需的set 和unset 函数。
@Reference(dynamic = true, optional = true)
void setConnector(IDataBaseConnect connector) {
this.connector = connector;
doSomeStuff();
sysout("Connector SET"); <---- NOT called when doSomeStuff runs into an error
}
doSomeStuff() 遇到错误时永远不会调用它
void unsetConnector(IDataBaseConnect connector){
this.connector = null
}
如您所见,我希望引用是动态的和可选的,但是,如果连接器服务可用,我想在包 A 中做一些事情。
在我的例子中,Bundle B 有一些基本的数据库功能。 Bundle A 使用它从数据库中读取一些数据并将其缓存在一些 java 对象中。这些数据将被其他服务使用。
但是,我对这种方法有疑问。如果我的数据库服务引用设置为 Bundle A,我将在 setConnector 函数中启动我的数据库操作。只要一切顺利,我就没有问题。设置参考,数据变红,一切正常。但是如果 DB-Service 遇到异常(是的,它被捕获并处理),DS 似乎“忘记”了设置的引用,并且当我停止服务时它永远不会被删除。
我想我不应该调用 setConnector 函数中的任何函数,但如果是这样,我将如何实现一个仅在设置了新引用时才调用的方法?
【问题讨论】: