2015-11-24 2 views
1

У меня есть следующий тест:шаблон тест Camel использует другой обмен, чем тот, я посылаю

public class MyTest extends CamelSpringTestSupport { 

    @Override 
    protected AbstractXmlApplicationContext createApplicationContext() { 
     return new ClassPathXmlApplicationContext(new String[] { 
       "classpath:my-config.xml", 
       }); 
    } 

    @Test 
    public void testSomething() throws Exception { 

     Exchange exchange = new DefaultExchange(context); 
     exchange.getIn().setHeader("myId", "1234"); 
     MessageContentsList parameters = new MessageContentsList(); 
     parameters.add(0, ""); 
     parameters.add(1, "1234"); 
     exchange.getIn().setBody(parameters); 

     System.out.println("exchange before = " + System.identityHashCode(exchange)); //1657040467 

     template.send("direct:myRoute", exchange); 

     Object object = exchange.getOut().getBody(); 

     System.out.println("result = " + object); //null 
     System.out.println("exchange after = " + System.identityHashCode(exchange)); //1657040467 

     assertFalse(exchange.isFailed()); 
    } 
} 

Вот последний шаг в пути «прямой: MyRoute»:

public void doSomething(Exchange exchange) 
{ 
    System.out.println("exchange within = " + System.identityHashCode(exchange)); //1649140180 

    exchange.getOut().setBody(1); 
} 

Мои маршруты определяются RouteBuilder классов и загружаю их

<camelContext id="mainContext" xmlns="http://camel.apache.org/schema/spring"> 

    <packageScan> 
     <package>com.my.route</package> 
    </packageScan> 

</camelContext> 

, а также динамически по коду:

((CamelContext) applicationContext.getBean("mainContext")).addRoutes(routeBuilder); 

Как вы можете видеть, я не могу получить выход на маршрут, когда я звоню маршрут из теста, так как в тесте по какой-то причине он является другим объектом обмена (однако, оригинальные заголовки обмена и свойства каким-то образом скопированы на биржу в пределах маршрута). Эта проблема не возникает, когда я определяю маршруты по XML.

Почему это и как я могу получить результат маршрута, когда я его вызываю из теста?

ответ

2

Я не уверен на 100%, но я не думаю, что вы можете написать вот так.

template.send("direct:myRoute", exchange); 
Object object = exchange.getOut().getBody(); 

Это должно быть идеально:

Exchange out=null; 
    out=template.requestBody("direct:myRoute", exchange); 
    String body=out.getOut().getBody(); 

Для этого, чтобы работать, вы должны установить шаблон обмена на InOut. Подробнее о шаблонах: https://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/ProducerTemplate.html

+0

Вы имели в виду 'out = template.send (...)'? В противном случае вы не сможете скомпилировать. В любом случае 'out.getOut(). GetBody()' по-прежнему 'null'. Я думаю, что способ, которым я его использовал, все еще работает, потому что он фактически возвращает входной обмен. Но это детали реализации, поэтому, конечно, лучше сделать это так, как вы упомянули. Но это все еще не работает. Я не вижу никаких данных об обмене выводами. – rapt

+0

Вы изменили шаблон обмена на InOut? –

+0

Кстати, вы можете скомпилировать, но вы должны изменить на out = template.requestBody («direct: myRoute», «requestBody», Exchange.class); –

Смежные вопросы