2011-11-04 78 views
6

我有我的路線重複圖案 - 某個處理器需要同樣的3頭設置每次我把它的時間,所以我有我的路下面的代碼約10+次數:駱駝 - 擴展Java DSL?

.whatever() 
.setHeader("foo1", "bar1") 
.setHeader("foo2", "bar2") 
.setHeader("foo3", "bar3") 
.processRef("processorBazThatNeedsHeaders") 
.whatever() 

標題是每次填充不同,所以這個抽象出成subroute並沒有真正買我什​​麼。

我喜歡什麼,能夠做的是子類RouteDefinition有在我的DSL的另一種方法,讓我做到這一點:

.whatever() 
.bazProcessor("bar1", "bar2", "bar3") 
.whatever() 

,並在「bazProcessor」,設置的標頭,並調用處理器。

我試過這樣做,但它似乎只可能與一些嚴重的可能未來不了的手術,並且似乎others have had similar luck

我需要他們被設置爲與直接將它們作爲參數提供給處理器,因爲這些值的處理器進行路由後也用標頭。

有一些隱藏的設備來實現這樣的事情?

回答

6

通過繼承RouteDefinition你的擴展才可以看到直接from(...)後。這可能是一個限制,如果你想在DSL的後面使用DSL擴展。

一個更簡單的方法是將某處封裝邏輯,和在實現org.apache.camel.Processor接口的類使用它,然後調用的.process(...)過載,或bean(...)在路由使用的邏輯。如果Processor實例或方法使用有意義的名稱,則返回Processor實例,否則實際上您將對DSL擴展非常封閉。這是一個example of the suggested approach。最後,你的代碼可能是這樣的:

.whatever()
.process(setTheHeadersForBaz
.whatever()

僅供參考:如果你真的需要做一個DSL,有一個擴展Camel DSL based on Groovy的項目。我猜想基於Camel Scala DSL的Scala方法也是一種選擇。

+0

這是一個好主意。我需要的是*略有不同,但我認爲這是一個好的開始。我會給它一個迴應。 –

+0

你能詳細解答你的答案嗎?我不明白它:( – Edmondo1984

1

所以,你是因爲你想要的處理器能夠訪問這些值只設置標題?

如果是這樣那麼使用工廠一個簡單的例子看起來是這樣的:

whatever() 
    .process(BazProcessorFactory.instance("bar1", "bar2", "bar3")) 
    .whatever() 

凡BazProcessorFactory只是在你的處理器的包裝:

public class BazProcessorFactory { 
    public Processor instance(final String...vals) { 
    return new Processor() { 
     @Override 
     public void process(Exchange exchange) throws Exception { 
     //access your array of values here 
     System.out.println("Foo1 = "+vals[0]); 
     } 
    } 
    } 
} 
+0

感謝達莫 - 我確實需要將它們設置爲標題 - 它們被處理器使用,但它們也在處理器之後用於處理某些路由。我將其添加爲對原始問題的說明 –

1

雖然稍不相關的,下面是一個擴展Scala DSL的例子。

我們可以通過隱類中創建一個隱含的方法來DSL特質。

object DSLImplicits { 
    implicit class RichDSL(val dsl: DSL) { 
    def get = dsl.setHeader(Exchange.HTTP_METHOD, _ => HttpMethods.GET.name) 

    def post = dsl.setHeader(Exchange.HTTP_METHOD, _ => HttpMethods.POST.name) 
    } 
} 

並且像這樣使用它。

import DSLImplicits.RichDSL 
//---------------------------- 
from("someWhere") 
    //Do some processing 
    .get.to("http://somewhere.com") 

更多細節@ http://siliconsenthil.in/blog/2013/07/11/apache-camel-with-scala-extending-dsl/

+0

@kleopatra:謝謝..完成。:) – siliconsenthil