2016-04-19 37 views
1

我写了一个简单的apache camel项目,最终将其部署在FUSE容器中。目前,我只是试图获得基本的单元测试工作。我以示例here为起点。Bundle正在等待命名空间处理程序[http://camel.apache.org/schema/blueprint]

我已经写单元测试它的工作,但是当我有一个蓝图文件,我得到测试输出输入以下内容:

Bundle TestMainRoute is waiting for namespace handlers [http://camel.apache.org/schema/blueprint]

并导致测试失败与以下堆栈跟踪:

java.lang.RuntimeException: Gave up waiting for service (objectClass=org.apache.camel.CamelContext) 
at org.apache.camel.test.blueprint.CamelBlueprintHelper.getOsgiService(CamelBlueprintHelper.java:240) 
at org.apache.camel.test.blueprint.CamelBlueprintHelper.getOsgiService(CamelBlueprintHelper.java:202) 
at org.apache.camel.test.blueprint.CamelBlueprintTestSupport.createCamelContext(CamelBlueprintTestSupport.java:352) 
at org.apache.camel.test.junit4.CamelTestSupport.doSetUp(CamelTestSupport.java:247) 
at org.apache.camel.test.junit4.CamelTestSupport.setUp(CamelTestSupport.java:217) 
at org.apache.camel.test.blueprint.CamelBlueprintTestSupport.setUp(CamelBlueprintTestSupport.java:183) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
at org.junit.rules.TestWatcher$1.evaluate(TestWatcher.java:55) 
at org.junit.rules.RunRules.evaluate(RunRules.java:20) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

我的XML是非常简单的:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> 
    <routeContext id="validationRoute" xmlns="http://camel.apache.org/schema/blueprint" > 

    <route id="validation"> 
     <from uri="direct:validation" /> 
     <log message="validating..." /> 
    </route> 
</routeContext> 

由于是代码:

public class RouteTest extends CamelBlueprintTestSupport { 

    @Test 
    public void testValidationRoute() throws Exception { 
    DefaultExchange r1 = new DefaultExchange(context); 
    r1.getIn().setBody(""); 
    Exchange response1 = template.send("direct:validation", r1); 
    } 

    protected String getBlueprintDescriptor() { 
    return "OSGI-INF/blueprint/blueprint.xml"; 
  1. 列表项

} }

NB验证路由是由我的主要骆驼的上下文中引用:

public class IntegrationFramework extends RouteBuilder { 

public void configure() { 

    from("netty-http:http://localhost:8457/broker/router.jsp").convertBodyTo(String.class) 
    .log("http router "+simple("${body}").getText()) 
    .to("direct:validation"); 
} 

我有其他的单元测试和记录,表明这部分工作。

+0

您没有安装的骆驼蓝图功能,是不是? – Ralf

+0

你的确切的骆驼和JBoss保险丝版本是什么? –

+0

RouteBuilder必须在CamelContext中引用,RouteBuilder不是CamelContext。 你有任何CamelContext? –

回答

-1

原来,routeContext只存在于xml dsl的上下文中,并且不能从Java DSL引用。这在我看来是一个错误,因为它限制了混合xml和java配置的灵活性。

通过将routeContext更改为camelContext,解决了这个问题。

也看到这个问题:Camel: importing routeContext into an external camelContext

而且相关:https://issues.apache.org/jira/browse/CAMEL-5717

+0

根据http://camel.apache.org/configuring-camel.html:另请注意,您可以混合搭配,在CamelContext中有路由,并且也可以在RouteContext中进行外部化处理。 – rkosegi

+0

感谢downvote。我没有看到链接中的内容与我在答案中所说的内容相抵触。如果你可以在java中引用routeContext,请告诉我如何让我的例子工作。 – mdarwin