gpt4 book ai didi

osgi - ServiceTracker 未找到现有服务

转载 作者:行者123 更新时间:2023-12-02 07:48:18 25 4
gpt4 key购买 nike

我正在使用 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 不能由我的 bundle 找到(即为 NULL),即使我的 bundle 处于事件状态。
  • 如果我停止/启动我的包 MyService可以找到并再次使用。

我不认为问题出在承载 MyService 的包中,因为它显然存在并且如果我的包重新启动可以再次找到。

看起来我的包在包含依赖服务的包之前加载,这就是为什么它在重新启动后找不到它但在我重新启动我的包后可以找到它的原因。

这表明如果我使用

列出可用服务
ServiceReference[] ref = tracker.getServiceReferences();

它在 OSGi 重新启动后找不到任何服务,但在我停止/启动我的查找它的包后它确实找到了 MyService。

我试图将 Require-Bundle 引用设置为托管 MyService 的包,希望 OSGi 框架能够识别依赖关系,但它没有帮助。

任何想法...?

最佳答案

如果您使用 BundleActivator 中的 ServiceTracker,您会有效地卡住整个框架(因此,不能同时启动其他 bundle)。如果提供您服务的 bundle 在带有跟踪器的 bundle 之后启动,您将看不到该服务。这解释了为什么稍后停止和启动您的 bundle 会为您提供服务。

现在,如果您想跟踪和使用该服务,我会生成一个新线程来执行此操作,并使用 waitForService 代替 getService

关于osgi - ServiceTracker 未找到现有服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5371110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com