【问题标题】:Felix: deployed bundle starts twiceFelix:部署的包启动两次
【发布时间】:2023-03-22 18:20:01
【问题描述】:

我正在使用 Maven(但与 Felix Web 控制台相同的问题)和 maven-sling-plugin 进行部署,我看到它启动了两次:

*INFO* [qtp1462409406-40] logs/access.log 127.0.0.1 - admin 25/Feb/2016:11:18:31 +0100 "POST /dev/system/console/install HTTP/1.1" 200 - "-" "Jakarta Commons-HttpClient/3.1"
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install2994913564032148892.tmp] com.as.test.content BundleEvent INSTALLED
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install2994913564032148892.tmp] com.as.test.content BundleEvent RESOLVED
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install2994913564032148892.tmp] com.as.test.content BundleEvent STARTING
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install2994913564032148892.tmp] com.as.test.content BundleEvent STARTED
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install2994913564032148892.tmp] com.as.test.content Service [com.as.test.jcr.service.NodeFinderImpl,374] ServiceEvent REGISTERED
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install2994913564032148892.tmp] com.as.test.content Service [com.as.test.jcr.service.NodeSorterImpl,375] ServiceEvent REGISTERED
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install2994913564032148892.tmp] com.as.test.content Service [com.as.test.jcr.service.UserProcessorImpl,376] ServiceEvent REGISTERED

====> Starts executing code: creates users, sets permissions and sort nodes with the JCR API
[...]
*ERROR* [pool-7-thread-1] com.as.test.content [com.as.test.jcr.service.ContentInitializerImpl(173)] Failed creating the component instance; see log for reason
*INFO* [FelixFrameworkWiring] com.as.test.content BundleEvent STOPPING
*INFO* [FelixFrameworkWiring] com.as.test.content Service [com.as.test.jcr.service.ContentInitializerImpl,383] ServiceEvent UNREGISTERING
*INFO* [FelixFrameworkWiring] com.as.test.content Service [com.as.test.jcr.service.NodeSorterImpl,375] ServiceEvent UNREGISTERING
*INFO* [FelixFrameworkWiring] com.as.test.content Service [com.as.test.jcr.service.UserProcessorImpl,376] ServiceEvent UNREGISTERING
*INFO* [FelixFrameworkWiring] com.as.test.content Service [com.as.test.jcr.service.NodeFinderImpl,374] ServiceEvent UNREGISTERING
*INFO* [FelixFrameworkWiring] com.as.test.content BundleEvent STOPPED
*INFO* [FelixFrameworkWiring] com.as.test.content BundleEvent UNRESOLVED
*INFO* [FelixFrameworkWiring] com.as.test.content BundleEvent RESOLVED
*INFO* [FelixFrameworkWiring] com.as.test.content BundleEvent STARTING
*INFO* [FelixFrameworkWiring] org.apache.sling.jcr.contentloader.internal.Loader Content of bundle already loaded com.as.test.content.
*INFO* [FelixFrameworkWiring] com.as.test.content BundleEvent STARTED
*INFO* [FelixFrameworkWiring] com.as.test.content Service [com.as.test.jcr.service.NodeFinderImpl,384] ServiceEvent REGISTERED
*INFO* [FelixFrameworkWiring] com.as.test.content Service [com.as.test.jcr.service.NodeSorterImpl,385] ServiceEvent REGISTERED
*INFO* [FelixFrameworkWiring] com.as.test.content Service [com.as.test.jcr.service.ContentInitializerImpl,387] ServiceEvent REGISTERED
*INFO* [FelixFrameworkWiring] com.as.test.jcr.service.ContentInitializerImpl Initializing Sling content
====> Starts (again) executing code: creates users, sets permissions and sort nodes with the JCR API

我在bundle的启动时执行了一些代码,它在中间停止,然后重新启动,我找不到原因。

我尝试过使用 Sling 启动板 7 和 8,分别使用 org.apache.felix.framework 4.4.1 和 5.2.0

编辑:堆栈跟踪

1. Starts from background install
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install3836459285044407564.tmp] com.as.test.Activator   java.lang.Thread.getAllStackTraces(Thread.java:1640)
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install3836459285044407564.tmp] com.as.test.Activator   com.as.test.Activator.printStrackTraces(Activator.java:33)
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install3836459285044407564.tmp] com.as.test.Activator   com.as.test.Activator.start(Activator.java:23)
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install3836459285044407564.tmp] com.as.test.Activator   org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install3836459285044407564.tmp] com.as.test.Activator   org.apache.felix.framework.Felix.activateBundle(Felix.java:2154)
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install3836459285044407564.tmp] com.as.test.Activator   org.apache.felix.framework.Felix.startBundle(Felix.java:2072)
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install3836459285044407564.tmp] com.as.test.Activator   org.apache.felix.framework.BundleImpl.start(BundleImpl.java:976)
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install3836459285044407564.tmp] com.as.test.Activator   org.apache.felix.framework.BundleImpl.start(BundleImpl.java:963)
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install3836459285044407564.tmp] com.as.test.Activator   org.apache.felix.webconsole.internal.core.InstallHelper.doRun(InstallHelper.java:67)
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install3836459285044407564.tmp] com.as.test.Activator   org.apache.felix.webconsole.internal.core.BaseUpdateInstallHelper.doRun(    BaseUpdateInstallHelper.java:89)
*INFO* [Background Install /var/folders/v0/gh9_k3ld5vx43sn057mg6h3c0000gn/T/install3836459285044407564.tmp] com.as.test.Activator   org.apache.felix.webconsole.internal.core.BaseUpdateInstallHelper.run(    BaseUpdateInstallHelper.java:121)

2. Stops from FelixFrameworkWiring
*INFO* [FelixFrameworkWiring] com.as.test.Activator THREAD: Thread[FelixFrameworkWiring,5,main]
*INFO* [FelixFrameworkWiring] com.as.test.Activator   java.lang.Thread.dumpThreads(Native Method)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   java.lang.Thread.getAllStackTraces(Thread.java:1640)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   com.as.test.Activator.printStrackTraces(Activator.java:33)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   com.as.test.Activator.start(Activator.java:23)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   org.apache.felix.framework.Felix.activateBundle(Felix.java:2154)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   org.apache.felix.framework.Felix.startBundle(Felix.java:2072)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   org.apache.felix.framework.Felix$RefreshHelper.restart(Felix.java:4911)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   org.apache.felix.framework.Felix.refreshPackages(Felix.java:4148)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   org.apache.felix.framework.FrameworkWiringImpl.run(FrameworkWiringImpl.java:178)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   java.lang.Thread.run(Thread.java:745)

3. Restarts from FelixFrameworkWiring
*INFO* [FelixFrameworkWiring] com.as.test.Activator THREAD: Thread[FelixFrameworkWiring,5,main]
*INFO* [FelixFrameworkWiring] com.as.test.Activator   java.lang.Thread.dumpThreads(Native Method)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   java.lang.Thread.getAllStackTraces(Thread.java:1640)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   com.as.test.Activator.printStrackTraces(Activator.java:33)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   com.as.test.Activator.start(Activator.java:23)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:645)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   org.apache.felix.framework.Felix.activateBundle(Felix.java:2154)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   org.apache.felix.framework.Felix.startBundle(Felix.java:2072)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   org.apache.felix.framework.Felix$RefreshHelper.restart(Felix.java:4911)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   org.apache.felix.framework.Felix.refreshPackages(Felix.java:4148)
*INFO* [FelixFrameworkWiring] com.as.test.Activator   org.apache.felix.framework.FrameworkWiringImpl.run(FrameworkWiringImpl.java:178)    

【问题讨论】:

  • 如果我是你,我会写一个 Bundle Activator,然后简单地将 start 和 stop 方法的堆栈跟踪从这些方法打印到控制台。从堆栈跟踪中,您可以找出正在发生的事情。可能是某种神奇的技术可以编织,但也可能有其他原因。
  • 我认为你的 pom.xml 有这方面的作用,你能检查一下吗?
  • 我将尝试激活器并打印堆栈跟踪。我应该在 pom 中检查什么?
  • 我已将激活器的堆栈跟踪添加到我的问题中。我真的不知道该怎么办,我看到涉及两个进程,Background installed 和 FelixFrameworkWiring 但我不知道为什么它们都启动我的包。
  • 猜猜你的bundle是先启动的,然后一些bundle被移除/安装,然后刷新被调用,因为你的bundle被重新连接到其他包。接线的不同之处可能很有趣(如果有的话)。我现在在activate函数中写出下面的结果,看看有没有变化:bundleContext.getBundle().adapt(BundleWiring.class).getRequiredWires(null);

标签: osgi apache-felix sling


【解决方案1】:

最好是让您的捆绑包为这种情况做好准备。许多事情都可能导致捆绑包多次启动,这不应该是例外情况。

【讨论】:

  • 感谢 Bertrand 的意见。我真的不知道该怎么做,因为它在我的代码执行中间重新启动(通常使用 JCR API 设置权限,就像这里所说的 stackoverflow.com/questions/21380400/…)所以突然对我的节点查找服务的引用为空,并且我不知道我应该用什么来处理这种情况。
  • 每次我使用对 API 的引用(主要是 Jackrabbit API)时,我都添加了空值检查,因此它不会抛出 NullPointerException,并且只是在没有异常的情况下重新启动,但我想知道你是否必须当您使用引用时,请始终这样做,如果这就是您所说的“为这种情况做好准备”的意思。我可能必须了解 OSGi :)
  • 您是否看到通过@Reference 获得的服务变为空?理论上这不应该发生AFAIK,你的组件应该被停用。如果您可以将示例简化为最简单的失败案例,我们或许可以解释原因。
  • 是的,当调用通过@Reference 获得的服务时,我会在某些时候出现getNullPointerException。我试图创建一个小包来重现该行为,但我无法做到。基本上,我在真正的捆绑包中所做的是查找页面类型资源,按其父资源(即文档)对它们进行分组,然后使用 JCR API 在属性上对它们进行排序。在此期间,bundle 重新启动,我用来查询 JCR 的服务变为 null,而我的代码仍在执行。
  • 将日志记录添加到组件的 deactivate 方法(或在需要时添加这样的方法)以检查它是否在引用变为 null 之前被停用可能会很有趣。理论上它应该,这将是一种让您检测到组件应该停止执行它所做的任何事情的方法。
猜你喜欢
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 2016-06-06
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多