I've a blueprint with two managed service factories, like following:
<cm:managed-service-factory factory-pid="com.foo" interface="com.foo.FooService">
<cm:managed-component class="com.foo.impl.FooServiceImpl" init-method="init">
<cm:managed-properties persistent-id="" update-method="update" update-strategy="component-managed"/>
</cm:managed-component>
</cm:managed-service-factory>
<cm:managed-service-factory factory-pid="com.foo" interface="com.foo.BarService">
<cm:managed-component class="com.foo.impl.BarServiceImpl" init-method="init">
<cm:managed-properties persistent-id="" update-method="update" update-strategy="component-managed"/>
</cm:managed-component>
</cm:managed-service-factory>
When using above services in an integration test (OPS4j Pax Exam), occasionally, I'm having following exception:
org.osgi.service.blueprint.container.ComponentDefinitionException: Cound not create component instance for .component-1
at org.apache.aries.blueprint.container.BlueprintContainerImpl.getComponentInstance(BlueprintContainerImpl.java:751)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
at org.apache.aries.blueprint.compendium.cm.CmManagedServiceFactory.doCreate(CmManagedServiceFactory.java:204)[10:org.apache.aries.blueprint.cm:1.0.1.redhat-60024]
at org.apache.aries.blueprint.compendium.cm.BaseManagedServiceFactory.internalUpdate(BaseManagedServiceFactory.java:138)[10:org.apache.aries.blueprint.cm:1.0.1.redhat-60024]
at org.apache.aries.blueprint.compendium.cm.BaseManagedServiceFactory.access$000(BaseManagedServiceFactory.java:37)[10:org.apache.aries.blueprint.cm:1.0.1.redhat-60024]
at org.apache.aries.blueprint.compendium.cm.BaseManagedServiceFactory$1.run(BaseManagedServiceFactory.java:87)[10:org.apache.aries.blueprint.cm:1.0.1.redhat-60024]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)[:1.7.0_45]
at java.util.concurrent.FutureTask.run(FutureTask.java:262)[:1.7.0_45]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)[:1.7.0_45]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)[:1.7.0_45]
at java.lang.Thread.run(Thread.java:744)[:1.7.0_45]
Caused by: java.lang.IllegalArgumentException: com.foo.impl
at java.lang.ClassLoader.definePackage(ClassLoader.java:1627)[:1.7.0_45]
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2249)[org.apache.felix.framework-4.0.3.redhat-60024.jar:]
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1501)[org.apache.felix.framework-4.0.3.redhat-60024.jar:]
at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)[org.apache.felix.framework-4.0.3.redhat-60024.jar:]
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)[org.apache.felix.framework-4.0.3.redhat-60024.jar:]
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)[:1.7.0_45]
at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1862)[org.apache.felix.framework-4.0.3.redhat-60024.jar:]
at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:937)[org.apache.felix.framework-4.0.3.redhat-60024.jar:]
at org.apache.aries.blueprint.container.BlueprintContainerImpl.loadClass(BlueprintContainerImpl.java:419)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
at org.apache.aries.blueprint.container.BlueprintRepository.loadClass(BlueprintRepository.java:410)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
at org.apache.aries.blueprint.container.GenericType.parse(GenericType.java:113)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
at org.apache.aries.blueprint.di.AbstractRecipe.doLoadType(AbstractRecipe.java:168)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
at org.apache.aries.blueprint.di.AbstractRecipe.loadType(AbstractRecipe.java:161)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
at org.apache.aries.blueprint.container.BeanRecipe.loadClass(BeanRecipe.java:249)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
at org.apache.aries.blueprint.container.BeanRecipe.getType(BeanRecipe.java:895)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
at org.apache.aries.blueprint.container.BeanRecipe.getInstance(BeanRecipe.java:323)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
at org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:806)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
at org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:106)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
at org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:245)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
at org.apache.aries.blueprint.container.BlueprintRepository.createInstance(BlueprintRepository.java:230)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
at org.apache.aries.blueprint.container.BlueprintRepository.create(BlueprintRepository.java:145)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
at org.apache.aries.blueprint.container.BlueprintContainerImpl.getComponentInstance(BlueprintContainerImpl.java:745)[13:org.apache.aries.blueprint.core:1.0.1.redhat-60024]
... 9 more
It seems blueprint is trying to initialize service instances in two different threads and when the second thread reaches into OSGi container (Felix), facing this error. because the package is already loaded by first thread.
As I mentioned, this is not a permanent behavior and happening 10-20% of time.
Anyone has any idea about the cause and a potential solution?