Apache camel 2.16 enrich - JUnit中端点上没有消费者可用

时间:2016-06-28 15:14:54

标签: java junit apache-camel

我升级到骆驼2.16并且其中一条路线单元测试开始失败。

这是我的路线定义:

public class Route extends RouteBuilder{

    @Override
    public void configure() throws Exception {

        from(start).enrich("second");

        from("direct:second")
          .log(LoggingLevel.DEBUG, "foo", "Route [direct:second] started.");

    }
}

这是我的测试:

@RunWith(MockitoJUnitRunner.class)
public class RouteTest extends CamelTestSupport  {

    private Route builder;

    @Produce(uri = "direct:start")
    protected ProducerTemplate template;

    @Before
    public void config() {
        BasicConfigurator.configure();
    }

    @Override
    protected RouteBuilder createRouteBuilder() {
        builder = new Route();
        return builder;
    }

    @Override
    protected CamelContext createCamelContext() throws Exception {
        SimpleRegistry registry = new SimpleRegistry();
        return new DefaultCamelContext(registry);
    }

    @Test
    public void testPrimeRouteForSubscriptionId() {
        Exchange exchange = ExchangeBuilder.anExchange(new DefaultCamelContext()).build();
        exchange.getIn().setBody(new String("test"));
        template.send(exchange);
    }
}

我在运行测试时得到的错误是:

org.apache.camel.component.direct.DirectConsumerNotAvailableException: No consumers available on endpoint: Endpoint[direct://second]. Exchange[][Message: test]

值得注意的是骆驼2.16中的以下内容: http://camel.apache.org/camel-2160-release.html

已删除了resourceUri和resourceRef属性,因为它们现在支持从表达式计算的动态uris。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

交换订单,以便在充实之前开始直接路线。 http://camel.apache.org/configuring-route-startup-ordering-and-autostartup.html

或者在单元测试中使用seda而不是direct:http://camel.apache.org/seda

或者在直接uri中使用?block=true告诉Camel阻止并等待消费者在向其发送消息之前启动并准备就绪:http://camel.apache.org/direct

答案 1 :(得分:0)

蓝图测试不断抛出异常,没有消费者可用。

我的情况是我有一个 osgi svc ,它公开了一个可以从任何其他 osgi svc 调用的方法。

因此,暴露的 svc 方法调用直接:

@EndpointInject(uri = "direct-vm:toRestCall")
    ProducerTemplate toRestCall;

svcMethod(Exchange xch){
exchange.setOut(
        toRestCall.send("seda:toDirectCall", xch -> {
            try{
                xch.getIn().setBody("abc");
            }catch (Exception ex){
                ex.getMessage();
            }
          }
        }).getIn());

当我测试它调用的direct时,JUnit的Blueprint建议过去常常抛出以下异常:

  

org.apache.camel.component.direct.DirectConsumerNotAvailableException:   端点上没有可用的消费者:端点。交流[消息:{..........

答案 2 :(得分:0)

这是一个有点老的问题,但是由于我昨晚抽出了大部分头发,试图找出为什么可以使用to("direct:myEndpoint")而不是enrich("direct:myEndpoint")的原因,我将发布无论如何,答案-也许可以避免其他人发秃顶;-)

事实证明这是一个测试问题。对于Direct终结点,Frich在将Exchange传递给上下文之前检查上下文中是否存在运行的路由,但这是通过查看当前正在处理的Exchange所拥有的CamelContext来进行的。自从您通过ProducerTemplate通过Exchange交换了使用new DefaultCamelContext()创建的内容以来,它没有可用的“ direct:second”路由。

幸运的是,有两个简单的解决方案。使用来自CamelTestSupport的CamelContext创建Exchange,或者改用ProducerTemplate sendBody(...)方法:

@Test
public void testWithSendBody() {
    template.sendBody(new String("test"));
}

@Test
public void testPrimeRouteForSubscriptionId() {
    Exchange exchange = ExchangeBuilder.anExchange(context()).build();
    exchange.getIn().setBody(new String("test"));
    template.send(exchange);
}