我试图重写以前使用spring上下文来使用蓝图上下文和CamelBlueprintTestSupport
的单元测试。我在不同的执行过程中看到了不同的错误,并且在尝试使其工作的过程中,我将camel-test-blueprint
更新为版本2.15.3
。现在它总是以相同的错误失败:
java.lang.RuntimeException: Gave up waiting for service (objectClass=org.apache.camel.CamelContext)
根本问题是无法解析属性占位符:
Caused by: java.lang.IllegalArgumentException: Property placeholder key: xyz not found
at org.apache.camel.blueprint.BlueprintPropertiesParser.parseProperty(BlueprintPropertiesParser.java:164) ~[camel-blueprint-2.15.3.jar:2.15.3]
我们在驼峰上下文和路由定义中使用蓝图属性占位符。我认为没有什么特别之处。
我尝试创建一个简单的测试项目来重现问题并实际设法在该测试项目中启动上下文,但是对我的实际项目应用相同的步骤并不能解决问题。
在我的测试项目中,我有以下简单的设置:
blueprint.xml
<cm:property-placeholder id="appConfig" persistent-id="app" update-strategy="reload" />
<camelContext id="demoContext" xmlns="http://camel.apache.org/schema/blueprint" autoStartup="{{demo.sync}}" >
<route id="demoRoute" autoStartup="{{demo.route.startup}}">
<from uri="timer:test" />
<to uri="log:test" />
</route>
</camelContext>
测试类
public class RouteTest extends CamelBlueprintTestSupport {
@Override
protected String getBlueprintDescriptor() {
return "OSGI-INF/blueprint/blueprint.xml";
}
@Override
protected Properties useOverridePropertiesWithPropertiesComponent() {
Properties props = new Properties();
props.put("demo.sync", Boolean.TRUE.toString());
return props;
}
@Override
protected String[] loadConfigAdminConfigurationFile() {
URL cfg = this.getClass().getClassLoader().getResource("app.cfg");
return new String[] { cfg.getPath(), "app" };
}
我发现如果没有覆盖useOverridePropertiesWithPropertiesComponent
来为camelContext
上的占位符返回一些内容,它将无法正常工作。
通过覆盖loadConfigAdminConfigurationFile
我得到它来加载实际属性来替换第二个占位符。
我不确定我做错了什么或是否有竞争条件所以我想知道是否有人让蓝图属性占位符与CamelBlueprintTestSupport
合作并且可以给我一些指示?
答案 0 :(得分:0)
看看克劳斯易卜生提供的这个测试课程。它应该为您提供有关如何解决问题的提示。 https://github.com/apache/camel/blob/master/components/camel-test-blueprint/src/test/java/org/apache/camel/test/blueprint/ConfigAdminLoadConfigurationFileTest.java
答案 1 :(得分:0)
我已经使用protected String useOverridePropertiesWithConfigAdmin(Dictionary props)
成功覆盖蓝图中的属性,您尝试过使用它吗?例如:
protected String useOverridePropertiesWithConfigAdmin(Dictionary props) {
props.put("demo.sync", true); //Add your properties in
return "app"; //return pid
}