【发布时间】:2011-07-19 06:31:09
【问题描述】:
我正在使用 ServiceTracker 来定位我们 OSGi 环境中的注册服务。 我在 Bundle Activator 启动方法中得到了这段代码:
logger.debug("looking for MyService");
tracker = new ServiceTracker(ctx, MyService.class.getName(), null);
tracker.open();
MyService = ((MyService)tracker.getService());
if (MyService != null)
{
logger.debug("found MyService");
}
问题是这样的:
- 如果我安装并启动我的捆绑包 可以找到并使用服务。
- 如果我完全重启 OSGi MyService 不能 由我的捆绑包找到(即为 NULL),即使 我的捆绑包处于 ACTIVE 状态。
- 如果我停止/启动我的捆绑包 MyService 可以找到并再次使用。
我认为问题不在于托管 MyService 的捆绑包,因为它显然在那里,并且如果我的捆绑包重新启动,可以再次找到它。
看起来我的包在包含依赖服务的包之前加载,这就是为什么它在重新启动后找不到它,而在我重新启动我的包后可以找到它。
这表明如果我使用
列出可用服务ServiceReference[] ref = tracker.getServiceReferences();
在 OSGi 重新启动后它没有找到任何服务,但在我停止/启动我的包后它确实找到了 MyService。
我试图将 Require-Bundle 引用设置为托管 MyService 的包,希望 OSGi 框架能够识别依赖关系,但它没有帮助。
有什么想法吗...?
【问题讨论】:
标签: osgi