当前位置: 首页 > 知识库问答 >
问题:

调试OSGi组件激活/停用问题

伍耀
2023-03-14

我试图调试一个问题,这个问题似乎是由我的一个OSGi组件在框架关闭期间的奇怪行为引起的。

当我试图通过调用

context.getBundle(0).shutdown()

我的组件被停用,但由于某种原因,它被重新激活,然后再次停用。第二个激活/停用周期会导致一些奇怪的行为,因为组件注册了一个“UI容器”,这会导致应用程序的UI在关闭期间闪烁。

我的问题是什么会导致第二个激活/停用周期?

我正在使用声明性服务Maven、ApacheFelix和SCR插件。

下面的链接指向停用/重新激活/停用方法的堆栈跟踪,这些方法在下面的回答中有要求:

停用堆栈跟踪

重新激活堆栈跟踪

停用堆栈跟踪

共有1个答案

史飞尘
2023-03-14

我写一个答案,因为它比评论长(它可能是答案):

  • ConfigAdmin在DS和包含组件的捆绑包之前停止
  • 当ConfigAdmin停止时,它会触发一个事件,说明配置不再可用
  • 您的组件是以不需要配置的方式配置的,因此它会由于现有配置消失而停止,并在组件不需要配置时重新激活

若要了解是否存在这种情况,请在激活和停用功能中插入以下内容:

Thread.dumpStack();

然后将堆栈跟踪复制到您的问题中。

如果是这种情况,可以通过在组件上设置所需的配置策略来解决。

使现代化

我做了什么(你也可以做什么)来比较停用和重新激活的堆栈跟踪。你会在差异开始的地方找到有用的信息。

基于上传的堆栈跟踪:提供间接引用服务的组件被停用,然后再次激活。原因:

它的一个依赖项(引用消失),但另一个满足组件。

重新激活堆栈跟踪的有趣部分如下:

at org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:972)
at org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:134)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:1024)
at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:818)
at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.removedService(DependencyManager.java:946)
at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.removedService(DependencyManager.java:871)
at org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1503)

如果可以,请为您的组件的激活功能添加断点。在重新激活期间,请参阅堆栈跟踪并执行以下操作:

at org.apache.felix.scr.impl.manager.DependencyManager$SingleStaticCustomizer.removedService(DependencyManager.java:946)

请查看为什么源代码中的重新激活标志具有true值和RemvedService函数的serviceInformation参数的值。还可以在调试视图中找到,在堆栈跟踪的这一点上,您处于哪个组件中。因此,您将知道,哪个组件被重新激活,以及基于哪个服务引用。您可以将组件重新配置为仅连接唯一的服务引用。

我还将考虑编写邮件到FeliX邮件列表,以计算如果系统束处于停止状态,则不应重新激活组件的方式来重新激活标志。

 类似资料:
  • 我对这个(OSGI)真的是新手,试图做简单的例子。我不能让懒惰的修辞奏效。我知道有一些解决这些问题的蓝图,但在开始之前,我认为学习一些基础知识是很好的。 好吧,我已经改变了我的代码,但仍然没有运气。 外部应用程序,install bundles,启动framework,然后只启动DataServiceClient Bundle。不能访问任何bundle类。 以下是DataServiceClient

  • 我试图实现一个优雅的关闭钩子到我的OSGi的应用程序。我在一个捆绑包中实现它,因为我没有直接访问启动器源。 下面是课堂: 但无论何时启动它,它都会返回一个错误: 错误:[Shutdown HookActivator(8)]激活方法[start]未找到;组件将失败 但是当我从start方法中删除参数时,一切都正常了。所以现在我很困惑,我看到了@Activate方法的参数由OSGi框架自动注入的例子(

  • 我已经用声明性服务(DS)组件定义定义了一个OSGi包(),指定了一个导出的服务、一个激活方法和一个停用方法。 在Activate方法的主体中,我需要访问一个文件,该文件不在文件系统中,但绑定在OSGi捆绑包中。在activate方法期间,使用。 这基本上是可行的,但有一种情况是不可行的。在我的应用程序中,

  • 在我的场景中,我有两个excel电子表格(sheet1和sheet2),其中包含两个单独的决策表。在表1中,规则如下所示: 因此,如果a==1,b==2,将d设置为1,则设置d的命令是:<代码>修改(输入){setD(1)} Sheet2如下所示: 两个文件具有相同的ACTIVATION-GROUP(激活1)和相同的AGENDA-GROUP(议程1) 我使用的输入: 我希望为这两条规则中的每一条创

  • 问题内容: 当我使用OSGi声明式服务在片段内创建组件时,该组件未激活,但主机捆绑包中的组件被激活。我想念什么吗?我的片段具有用于主机捆绑包符号名称的正确文件条目。 我以这种方式宣布一个伴侣 问题答案: 因为从不启动捆绑包片段,所以永远不会激活其中的仅已解析声明式服务组件。该规范特别指出片段中的Service- Component标头(将注释转换为标头)将被忽略。 您可以使声明性服务适用于片段,但

  • 当实例的试用期结束时,Navicat Monitor 需要令牌以继续监控该实例。令牌可以作为永久许可证或订阅购买。若要管理你的令牌并许可你的实例,请前往“配置”->“激活令牌密钥和许可实例”。 【注意】永久许可证和订阅方案不能在同一个 Navicat Monitor 上使用。在更改激活方法之前,你需要取消激活令牌密钥或退出你的 Navicat ID。 永久许可证 如果你购买了永久许可证,你将收到一