为何含Camel-ActiveMQ的OSGi Bundle处于宽限期?配置占位符异常
嘿,我仔细看了你的问题描述、Blueprint配置和调试日志,这就帮你拆解一下第二个OSGi Bundle卡在宽限期的原因,以及对应的解决办法:
核心问题定位
从日志里的关键信息就能看出端倪:
Retrieved property activemq.url value from defaults ${activemq.url}
你在Blueprint的默认属性里把activemq.url的默认值设成了占位符本身!这就导致了解析循环——当Configuration Admin(CM)里找不到对应配置时,默认值又指向了要解析的占位符,所以Blueprint扩展器会一直重复尝试解析,永远出不来。
另外,两个Bundle用了同一个persistent-id="com.mycompany.context",也可能存在配置加载优先级或者冲突的问题,导致第二个Bundle没法正确读取CM里的配置。
具体解决步骤
1. 修复默认属性的循环引用(最关键)
你当前的默认属性配置完全无效,甚至会引发解析循环,必须修改:
<!-- 错误的配置 --> <cm:property name="activemq.url" value="${activemq.url}" />
要么改成实际的默认值(比如本地ActiveMQ的默认地址),要么直接删掉这些默认属性(如果必须依赖CM提供配置的话):
<cm:default-properties> <!-- 示例:设置本地ActiveMQ的默认地址 --> <cm:property name="activemq.url" value="tcp://localhost:61616" /> <cm:property name="activemq.user" value="admin" /> <cm:property name="activemq.password" value="admin" /> </cm:default-properties>
2. 确认CM中已配置对应项
检查你的OSGi容器(比如Karaf)的Configuration Admin服务,是否已创建com.mycompany.context配置,且包含activemq.url、activemq.user、activemq.password三个属性。
如果用Karaf,可通过命令行快速检查:
config:list | grep com.mycompany.context
若未找到,手动创建配置:
config:edit com.mycompany.context config:propset activemq.url tcp://你的ActiveMQ地址:61616 config:propset activemq.user 你的用户名 config:propset activemq.password 你的密码 config:update
3. 调整Bundle的Blueprint依赖与启动顺序
第二个Bundle可能在CM配置加载完成前就开始解析Blueprint,导致拿不到配置:
- 在Bundle的
MANIFEST.MF中添加依赖,让它等待CM配置就绪:Require-Bundle: org.apache.aries.blueprint.cm Blueprint-Wait-for-Dependencies: true - 调整Bundle启动顺序,让第二个Bundle在第一个Bundle(或CM配置加载完成)之后启动。
4. 检查Bean的定义顺序
Blueprint中Bean的依赖关系是按定义顺序解析的,必须确保占位符的定义在所有依赖它的Bean之前:
<!-- 先定义占位符,这是基础 --> <cm:property-placeholder id="jms.placeholder" persistent-id="com.mycompany.context"> <!-- 修复后的默认属性 --> </cm:property-placeholder> <!-- 再定义依赖占位符的XA连接工厂 --> <bean id="xaConnectionFactory" class="org.apache.activemq.ActiveMQXAConnectionFactory"> <property name="brokerURL" value="${activemq.url}" /> ... </bean> <!-- 后面再定义其他依赖Bean --> ...
5. 检查组件版本兼容性
从日志看,你用的org.apache.aries.blueprint.cm是1.1.0版本,而org.apache.aries.blueprint.core是1.8.2版本,版本差距较大可能存在兼容性问题。建议将org.apache.aries.blueprint.cm升级到与core匹配的版本(比如1.8.x),避免解析逻辑bug。
验证方法
改完之后重启第二个Bundle,若日志出现类似以下内容,说明解析成功:
Retrieved property activemq.url value from configuration tcp://你的ActiveMQ地址:61616
内容的提问来源于stack exchange,提问作者anna

