Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
2.19.4, 2.20.2
-
None
-
Mac OSX, Karaf 4.2.5
Description
The error "name is already instanciated (sic) as null and cannot be removed" is thrown when configuring a component in Blueprint using property placeholders.
I noticed when trying to migrate my project to Camel 2.20.2 (from 2.17.4)
Example:
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/blueprint" xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0" xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0" xsi:schemaLocation=" http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd”> <cm:property-placeholder persistent-id="audit.log" update-strategy="reload” placeholder-prefix="#{" placeholder-suffix="}"> <cm:default-properties> <cm:property name="audit-log.reaper.cron" value="0 0/30 * * * ?" /> <cm:property name="startDelaySeconds" value="600" /> </cm:default-properties> </cm:property-placeholder> <bean id="audit-log-reaper-quartz" class="org.apache.camel.component.quartz2.QuartzComponent"> <property name="startDelayedSeconds" value="#{startDelaySeconds}" /> </bean>
The bean is referenced in a Camel route:
<route id="reaper-scheduler"> <from uri="[audit-log-reaper-quartz://reaper?cron=\{{cron}}]" />
Throws exception:
org.osgi.service.blueprint.container.ComponentDefinitionException: Name audit-log-reaper-quartz is already instanciated as null and cannot be removed.
at org.apache.aries.blueprint.container.BlueprintRepository.removeRecipe(BlueprintRepository.java:131) [38:org.apache.aries.blueprint.core:1.8.3]
at org.apache.aries.blueprint.container.BlueprintContainerImpl.updateUninstantiatedRecipes(BlueprintContainerImpl.java:572) [38:org.apache.aries.blueprint.core:1.8.3]
at org.apache.aries.blueprint.container.BlueprintContainerImpl.processProcessors(BlueprintContainerImpl.java:559) [38:org.apache.aries.blueprint.core:1.8.3]
at org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:394) [38:org.apache.aries.blueprint.core:1.8.3]
at org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:275) [38:org.apache.aries.blueprint.core:1.8.3]
Removing the property placeholder fixes the issue:
<bean id="audit-log-reaper-quartz" class="org.apache.camel.component.quartz2.QuartzComponent"> <property name="startDelayedSeconds" value="600" /> </bean>
According to Guillaume Nodet, this seems to have been introduced by this pull request:
https://github.com/apache/camel/commit/a4e94f036d02943814c84195d73837cf607c8c20
Solution proposed by Guillaume Nodet is to change line 1056 of /camel-blueprint/src/main/java/org/apache/camel/blueprint/handler/CamelNamespaceHandler.java
to
if (camelContext.getComponent(component, false) == null) {
I tested this change locally and it seems to work, however I don't know if this can cause other problems.
Attachments
Issue Links
- duplicates
-
CAMEL-12251 Do not hide (so much) blueprint.container.ComponentDefinitionException
- Resolved
- is broken by
-
CAMEL-10394 BlueprintCamelContext cannot find components created in RouteBuilder.configure method
- Resolved
- is related to
-
CAMEL-12251 Do not hide (so much) blueprint.container.ComponentDefinitionException
- Resolved