Osgi 费利克斯:部署的包启动两次

Osgi 费利克斯:部署的包启动两次,osgi,apache-felix,sling,Osgi,Apache Felix,Sling,我正在部署Maven(但Felix web控制台也有同样的问题)和Maven sling插件,我看到它启动了两次: *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

我正在部署Maven(但Felix web控制台也有同样的问题)和Maven sling插件,我看到它启动了两次:

*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

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

我分别使用org.apache.felix.framework 4.4.1和5.2.0尝试了Sling launchpad 7和8

编辑:堆栈跟踪

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)    


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

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

如果我是你,我会编写一个捆绑包激活器,然后简单地从start和stop方法将stacktrace打印到控制台。从stacktraces中,您可以了解发生了什么。可能是一些神奇的编织技术,但也可能有其他原因。我认为您的pom.xml在其中起到了作用,您能检查一下吗?我将尝试激活器并打印stacktrace。我应该在pom中检查什么?我已经在我的问题中添加了来自激活器的stacktraces。我真的不知道该怎么办,我看到涉及到两个过程,后台安装和FelixFrameworkWiring,但我不知道为什么它们都启动我的捆绑包。我猜您的捆绑包首先启动,然后一些捆绑包被删除/安装,然后调用refresh,因为您的捆绑包被重新连接到其他软件包。布线的区别(如果有)可能很有趣。现在,我将在activate函数中写出以下结果,并查看是否有任何更改:bundleContext.getBundle().adapt(BundleWiring.class).getRequiredWires(null);如果我是你,我会编写一个Bundle Activator,并简单地从start和stop方法将stacktrace从这些方法打印到控制台。从stacktraces中,您可以了解发生了什么。可能是一些神奇的编织技术,但也可能有其他原因。我认为您的pom.xml在其中起到了作用,您能检查一下吗?我将尝试激活器并打印stacktrace。我应该在pom中检查什么?我已经在我的问题中添加了来自激活器的stacktraces。我真的不知道该怎么办,我看到涉及到两个过程,后台安装和FelixFrameworkWiring,但我不知道为什么它们都启动我的捆绑包。我猜您的捆绑包首先启动,然后一些捆绑包被删除/安装,然后调用refresh,因为您的捆绑包被重新连接到其他软件包。布线的区别(如果有)可能很有趣。现在,我将在activate函数中写出以下结果,并查看是否有任何更改:bundleContext.getBundle().adapt(BundleWiring.class).getRequiredWires(null);谢谢伯特兰的意见。我真的不知道该怎么做,因为它在我的代码执行的中间重新启动(通常使用JCR API的设置权限,如这里所说),因此,对我的节点查找器服务的引用是空的,并且我不知道我应该用什么来处理这种情况。每次使用API时,我都添加了空校验。(主要是Jackrabbit API)所以它不会抛出NullPointerException,只需在没有异常的情况下重新启动,但我想知道,当您使用引用时是否必须始终这样做,以及您所谓的“为这种情况做好准备”的意思是什么。我可能必须了解OSGi:)您是否看到通过@Reference获得的服务变为null?从理论上讲,这种情况不会发生,您应该停用组件。如果你能把你的例子简化为最简单的失败例子,我们也许能解释原因。是的,我在调用通过@Reference获得的服务时,会在某个时候获取NullPointerException。我曾试图创建一个小捆绑包来复制这种行为,但我没有做到这一点。基本上,我在真正的bundle中所做的是查找页面类型的资源,按照它们的父资源(即文档)对它们进行分组,然后使用JCR API在属性上对它们进行排序。在此期间,捆绑包将重新启动,我用来查询JCR的服务将在代码仍在执行时变为null。在组件的deactivate方法中添加日志记录(或者在需要时添加这样的方法),以检查在引用变为null之前它是否已被停用,这可能会很有趣。理论上应该是这样的,这将是一种检测组件应该停止执行任何操作的方法。感谢Bertrand的输入。我真的不知道该怎么做,因为它在我的代码执行的中间重新启动(通常使用JCR API的设置权限,如这里所说),因此,对我的节点查找器服务的引用是空的,并且我不知道我应该用什么来处理这种情况。每次使用API时,我都添加了空校验。(主要是Jackrabbit API)所以它不会抛出NullPointerException,只需在没有异常的情况下重新启动,但我想知道,当您使用引用时是否必须始终这样做,以及您所谓的“为这种情况做好准备”的意思是什么。我可能必须了解OSGi:)您是否看到通过@Reference获得的服务变为null?从理论上讲,这种情况不会发生,您应该停用组件。如果你能把你的例子简化为最简单的失败例子,我们也许能解释原因。是的,我在调用通过@Reference获得的服务时,会在某个时候获取NullPointerException。我曾试图创建一个小捆绑包来复制这种行为,但我没有做到这一点。基本上,我在真正的bundle中所做的是查找页面类型的资源,按照它们的父资源(即文档)对它们进行分组,然后使用JCR API在属性上对它们进行排序。在此期间,bundle将重新启动,我用来查询t的服务也将重新启动