OSGi声明式服务处于活动状态,但没有调用bind()

OSGi declarative service is active, but bind() is not called

我在 OSGi 上下文中遇到了一个我不理解的声明性服务问题。我试着解释一下:

我有一个需要 FooManagerService (1..1 static)FooServiceFooManagerService 引用 FooService,但它是可选的 (0..n dynamic)

目标是,如果 FooService 可用,它会在 FooManagerService 处注册(调用 bind() 方法),以便 FooManagerService 始终拥有系统中所有可用 FooService 实现的列表。

它在 Windows 上运行良好,但在 Linux 上我遇到了问题,即 FooService 变为活动状态(调用 activate() 方法),但 FooManagerService 无法识别(bind() 方法是不叫)。如果我在 OSGi 控制台上手动禁用和启用 FooService,它会被 FooManagerService.

识别

我不明白,为什么会这样。可以通过增加 FooServiceImpl 所在的包的起始级别来避免这种情况。但这感觉像是一个丑陋的解决方法,这就是为什么我想了解那里发生了什么。

我附上一张描述服务之间引用的图片。任何提示表示赞赏。提前致谢!

最好的问候

斯蒂菲

服务管理器图


这里有一个循环,按理论应该没问题。但是,在实践中存在许多问题。

首先,你的实现应该是immediate=true。这解决了一些问题,因为它防止了 DS 因为正在初始化而无法获得服务的讨厌问题。 IE。如果 FooManager 和 FooService impls 必须是即时的。这在 OSGi enRoute Cycles

中有描述

但是,还有一个问题 :-( Apache Felix DS 有一个错误,会导致您描述的影响。这个错误与捆绑排序有关。这在 Apache Felix JIRA 5618 中报告。

如果这个 DS 错误是问题所在,那么不幸的是只有一个可靠的解决方案。不幸的是,因为它需要你深入到 OSGi 的内部。解决办法是手动注册manager服务,并确保它没有被DS注册:

@Component(service={}, immediate=true )

public class FooManagerImpl implements FooManager {



 private ServiceRegistration<FooManager> registration;



 @Reference

 volatile List<FooService> foos;



 @Activate

 void activate( BundleContext context, Map<String,Object> properties ) {

  registration = context.registerService(FooManager.class, this, new Hashtable<String,Object>(properties));

 }



 @Deactivate

 void deactivate() {

   registration.unregister();

 }



 ...

}

这里的诀窍是 FooManager 在它被激活之前不会注册它的服务,而通常它是在它被激活之前注册的。

我知道 Apache Felix 正在研究它,但不知道他们有多远。

无论如何,循环总是很糟糕。可悲的是,它们并不总是可以预防的,但我肯定会尝试。

Note: registering a service manually will not create a capability. If you use Requirements/Capabilities you should add a service capability in the manifest to make the resolver work. If this line is gibberish to you, ignore it.


相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161