2015-08-31 48 views
0

如何限制空體在一個公共場所進入多處理器。在下面的代碼中,我們如何在一個地方定義它,而不是在每個處理器上進行空體檢查?如何避免空體在多個步驟中進入下一個處理器

<choice> 
    <when> 
     <simple>${body} != null</simple> 
     <process ref="processor1" /> 
     <choice> 
      <when> 
       <simple>${body} != null</simple> 
       <process ref="processor2" /> 
       <!-- Splitter --> 
       <split> 
        <simple>body</simple> 
        <process ref="processor3" /> 
       </split> 
      </when> 
     </choice> 
    </when> 
</choice>  
+0

如果空消息是不適合給定的處理器,爲什麼不能在處理器定義它本身並忽略(重新發送)null? – piezol

+0

你可以給我一個例子如何在處理器中做到這一點? –

回答

3

我建議你把所有的根都放在一起,這樣就會導致進一步的空檢查過時。一個快速簡便的方法來阻止路由處理當前的郵件設置您exchange對象的Exchange.ROUTE_STOP財產和返回null

exchange.getProperty(Exchange.ROUTE_STOP, Boolean.TRUE) 
+1

我認爲你的意思是'exchange.setProperty(Exchange.ROUTE_STOP,Boolean.TRUE);' –

1

評論中的代碼將被非常顯示,所以我發佈了一個答案。 處理器做這是一個簡單的空檢查,沒有哲學

public class SomeProcessor implements Processor { 

    public void process(Exchange exchange) { 
     if(exchange.getIn().getBody() != null){ 
      // Your processing here 
      // Is only performed 
      // When body is not null 
      // Otherwise null body is being resent 
     } 
    } 

} 

編輯(回答評論): 不可能AFAIK,它不會做一個正確的方法。您已經使用的 Router應該如何執行。 如果你想扔掉你的消息,我覺得這可能是工作(我沒有檢查,雖然):

<choice> 
    <when> 
     <simple>${body} == null</simple> 
     #<stop /> 
     # OR 
     #<to uri="wherever-you-want-to-send-nonvalid-messages" /> 
    </when> 
    <otherwise> 
     <camel:process ref="processor1" /> 
     <camel:process ref="processor2" /> 
     <camel:process ref="processor3" /> 
     <to uri="where-you-want-to-send-valid-messages" /> 
    </otherwise> 

</choice> 

它將只檢查第一處理器,顯然之前空值,所以如果即第二個處理器給出空消息,它不會被拋出。

+0

看起來比在xml中放置多個空檢查更乾淨:-) –

+0

是的,但只有當null不是處理器的有效內體時才應該這樣做。 處理器應該是可重用的(例如在你的xml中的許多地方),所以如果你想指定,null在單個路由中不是一個正確的消息,原始帖子中的代碼就足夠好了。猜測。 – piezol

+0

如果屍體爲空,就從駱駝路線出來。是否有可能?我的意思是從處理器機身? –

相關問題