2016-04-19 29 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