【问题标题】:@Reference field injected osgi services randomly coming up "null"@Reference 字段注入的 osgi 服务随机出现“null”
【发布时间】:2019-05-15 06:44:08
【问题描述】:

我们有一个大小合适的 osgi 应用程序,其中包含大约 80 个自定义服务包,以及运行时额外的 20 到 30 个 3rd 方包依赖项(我们正在运行 R7 风格的 osgi)。当我们开始这个项目时,我们通常会使用带有 @Reference 注释的服务的字段注入并且完全没有问题,但是现在,我们越来越多地看到这些注入的依赖项有时会随机出现为空 - 我们的一种方式发现解决这个问题的方法是用服务的方法注入替换字段注入。

我注意到的是,注入服务通常为 null 的地方是在我们的组件服务中,这些服务实际上只是带有 @Component 注释的 Java 类,但没有实现“ProviderType”或“ ConsumerType”接口(我们的 REST 端点是这样的)。我们目前已经将这些组件的属性设置为“immediate=true”,但这似乎对注入的服务随机变为空没有任何影响。

当我们检查捆绑列表时 - 所有正确的捆绑似乎都处于活动状态,有时甚至服务似乎都很好(没有不满意的引用),这完全令人难以置信。

任何可能对为什么会发生这种情况有所了解的人?

一些持续的异常/可能的原因: 自项目开始以来,我们几乎所有的 REST 端点都看到了以下错误,但不知道框架为什么认为它看到重复的类和方法。 两者都有

fully.qualified.class.path.CustomServiceRest#doStuff 和 fully.qualified.class.path.CustomeServiceRest#doStuff 是处理当前请求的同等候选者,这可能导致不可预测的结果 2018 年 12 月 13 日下午 2:41:45 org.apache.cxf.jaxrs.model.OperationResourceInfoComparator 比较 警告:fully.qualified.class.path.CustomServiceRest#doSomeOtherStuff 和 fully.qualified.class.path.CustomServiceRest#doSomeOtherStuff 都是处理当前请求的同等候选者,这可能导致不可预测的结果

最近我们添加了一个 osgi WebSocket 服务,该服务需要添加另一个 Jetty 依赖包,并且有人担心这两个 Jetty 包在运行时组合中可以很好地发挥作用。

【问题讨论】:

  • 您能否将显示问题的示例放入 github 存储库中,或者该问题仅发生在您的真实系统中吗?如果您能够提供一个小例子来说明问题,那么诊断起来会容易得多。
  • 如果没有一些源代码或日志,真的不可能说任何有用的东西,最好两者兼而有之。

标签: osgi


【解决方案1】:

在解决这个问题之后,我们发现了——我们的每个 RestEndpoint 包都包含一个 JaxRsApp 类,该类扩展了 javax.ws.rs.core.Application 并且我们将每个 RestEndpoint 静态类添加到 Set> 集合中重写的 getClasses() 方法,然而,我们的每个 RestEntpoints 类都用 ​​@Component 注释,并且每个 @Component 的服务属性设置为相应的 endoints 类名,因此我们认为正在发生的事情是每个类都在注册了两次(一次由 JaxRsApp 注册,一次由带有 @Component 表示法的 SCR 注册),因此每当我们使用 Postman 测试或 UI 进行休息调用时,都会出现重复的警告消息。

此外,通过从 JaxRsApp 文件中删除静态注册(因此我们现在只使用 SCR 注册 restendpoint 组件),不仅警告消失了,而且空服务问题也得到了解决。所以我们认为,在更改之前,SCR 实际上是在注入依赖服务,但不知何故,由于“重复”服务端点,依赖服务被注入到 JaxRsApp 注册的服务类中?我不是 100% 确定,所以如果这里有人可以解释,将不胜感激。

无论如何,它现在可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2012-11-21
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    相关资源
    最近更新 更多