2016-08-30 70 views
1

我很困惑從駱駝中的to()調用的子路由返回「主體」。從我發現的直接路由中,他們鼓勵路由重用,並用於邏輯分裂過度複雜的路由。但我似乎無法做一個簡單的「分裂」:來自直接路由的駱駝返回消息以供重用

from("jms:createRequestQueue") 
      .to("direct:createRequest") 

      // here the processing of the message fails, see below 

      .bean(processor) 

      .to("..."); 

    from("direct:createRequest") 
      .onException(Exception.class).bean(requestErrorHandler).stop() 
      .unmarshal().json(JsonLibrary.Jackson, MyModelRequest.class); 

類處理器實例如下:

public class RequestProcessor { 

    @Handler 
    public void update(@Body MyModelRequest request) { 
     // do stuff 
    } 

} 

的事情是,解編請求路由的結果(第二條路線)不會傳播回呼叫路線。拋出一個異常,說它不能將String(進入隊列的JSON)轉換爲MyModelRequest類。所以看起來第一個路由中的JSON主體並沒有被取消編組路由的結果所取代。這似乎是一個很好的路線重用,我希望。

我偶然發現了InOut消息,但文檔非常不清楚,我的實驗也以相同的方式失敗。

我需要做些什麼才能真正將部分路線提取到另一條路線以便重複使用?

回答

1

所以問題出在onException子句(被遺漏的原始問題,我認爲它不是問題)。我迷惑end()調用stop()調用,所以路由停止太快,返回String中未解析的JSON。正確的是:

from("direct:createRequest") 
     .onException(Exception.class).bean(requestErrorHandler).end() 
     .unmarshal().json(JsonLibrary.Jackson, MyModelRequest.class); 
+0

嗯,這就是它,我知道它不應該是'直接'的路線:) –

+0

是的,我也認爲它應該返回正文。謝謝你的幫助! – redhead

+0

你能接受這個答案,以便問題不會顯示爲未答覆?謝謝! –

0

沒有一個可運行的例子,reporoduces theerror它很難說什麼不順心,但它應該(和不上2.17.2以及2.15.3測試!)工作:

@Component 
public class DemoRouteBuilder extends RouteBuilder { 

    @Override 
    public void configure() throws Exception { 
    from("timer:sender?delay=10s&period=3s") 
     .setBody(constant("{\"title\":\"Lord of the Rings\",\"author\":\"J.R.R. Tolkien\"}")) 
     .to("direct:unmarshal") 
     .bean(new RequestProcessor()) 
     .log("${body}!"); 

    from("direct:unmarshal") 
     .unmarshal().json(JsonLibrary.Jackson, Book.class); 
    } 

    public static class RequestProcessor { 

    @Handler 
    public void update(@Body Book book) { 
     System.out.println("Got " + book); 
    } 

    } 

    public static class Book { 
    private final String title; 

    private final String author; 

    private Book() { 
     this(null, null); 
    } 

    public Book(String title, String author) { 
     this.title = title; 
     this.author = author; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public String getAuthor() { 
     return author; 
    } 
    @Override 
    public String toString() { 
     return "title='" + title + "', author='" + author + '\''; 
    } 

    } 
} 

下面是輸出:

2016年8月30日13:48:34.337 INFO 16240 --- [主要] com.example.DemoApplication:在5.859秒(JVM運行6.587)

得到標題='主發起者DemoApplication 'Rings',作者='JRR Tolkien'

2016-08-30 13:48:44.298 INFO 16240 --- [timer:// sender] route1:title ='指環王',作者='J.R.R。托爾金「!

Got title ='指環王',作者='J.R.R。 Tolkien'

2016-08-30 13:48:47.232 INFO 16240 --- [timer:// sender] route1:title ='指環王',作者='J.R.R。托爾金「!

+0

我可能只是在json方法調用中誤刪了一個參數。更新的問題。奇怪的是,這不適合我。它試圖將帶有JSON的String轉換爲@Body MyModelRequest類。版本是2.15.3。 – redhead

+0

沒有機會使用更新的版本?這可能是駱駝中的一個bug。 –

+0

在2.15.3試過,效果很好。你可以發佈你的代碼的可運行的例子,並給出示例JSON? –