2017-04-13 117 views
0

我检查骆驼在行动2章 - 9例子,搜索这previous questionthis user-group thread,但仍停留...骆驼replaceFromWith和模拟JMS目的地 - 春天引导

我使用的春季 - 引导和骆驼2.18.x 我想这两个examples from Camel sample code合并成一个:以mockEndpoint也replaceFrom

工作场景:

  1. 我创建了一个考试路线直接 - > SEDA
  2. 我用Advicewith,并模拟所有端点
  3. 我的测试工作正常

工作场景:

  1. 我改变了目的地,有直接 - > jms
  2. 我最后得到一个异常,并看到JMS无法创建会话。

后市展望:我认为JMS将由模拟来代替,并且日志似乎表明如此。不知道为什么JMSProducer仍然被调用。这是预期的行为?

样品路线:

from("direct:start") 
      .id("testroute") 
      .log("${body}") 
      //.to("seda:finish") //This works okay 
      .to("jms:XYZ_Q") 
    ; 

单元测试类:

@RunWith(CamelSpringBootRunner.class) 
@MockEndpoints 
@UseAdviceWith 
@SpringBootTest(classes = {UnitTestApplication.class, SampleTest.class}) 
public class SampleTest { 

    @Autowired 
    private CamelContext camelContext; 

    @Autowired 
    private ProducerTemplate producerTemplate; 

    @Test 
    public void test01() throws Exception { 
     RouteDefinition route = camelContext.getRouteDefinition("testroute"); 
     AdviceWithRouteBuilder adviceWithRB = new AdviceWithRouteBuilder() { 
      @Override 
      public void configure() throws Exception { 
       replaceFromWith("direct:renamed"); 
      } 
     }; 

     route.adviceWith(camelContext, adviceWithRB); 
     camelContext.start(); 

     producerTemplate.sendBody("direct:renamed", " 8888888820130601"); 
    } 
} 

我预计JMS组件将不会尝试做任何事情,但将通过模拟来代替。这是不正确的理解?

回答

2

我认为JMS将由模拟

  1. 都能跟得上更换,也不会被替换,因为replaceFromWith(..)一个新的端点URI替代路线的输入(from(..))。它应该在以下情况下工作(使用你的例子):

    from("jms:XYZ_Q") 
        .id("testroute") 
        .log("${body}"); 
        //.to("seda:finish") //This works okay 
        //.to("jms:XYZ_Q") 
    
  2. 如果你想嘲笑.to("jms:XYZ_Q")部分(从你的问题),那么你可以使用weaveByIdToString()weaveById()等功能。更多信息:http://camel.apache.org/advicewith.html#AdviceWith-UsingAdviceWithRouteBuilder