2017-04-13 77 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