2011-11-04 12 views
6

私は私のルートで繰り返しパターンを持っている - 特定のプロセッサが、私はそれを呼び出すたびに設定し、同じ3つのヘッダを必要とするので、私は倍10+についての私のルートに次のコードを持っている:Camel - Java DSLを拡張しますか?

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

ヘッダーは毎回異なる方法で入力されるので、これをサブルーチンに抽象化しても実際には何も購入しません。

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

と「bazProcessor」で、ヘッダーを設定し、プロセッサを呼び出す:私が行うことができるように愛する何

は私がこれを行うにできるようになる私のDSL内の別の方法を持っているサブクラスRouteDefinitionです。

私はこれをやろうとしましたが、これはおそらく将来的ではない重大な手術でのみ可能と思われ、それはothers have had similar luckと思われます。

値をプロセッサの後にルーティングのために使用するため、パラメータをプロセッサに直接渡すのではなく、ヘッダーとして設定する必要があります。

このようなものを実現するための隠された機能はありますか?

答えて

6

RouteDefinitionをサブクラス化すると、拡張子はfrom(...)の直後にしか表示されません。たとえば、filter(...) 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

@

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

詳細これは良いアイデアです。私が必要とするのは少し違いますが、これは良いスタートだと思います。私はそれを打つと応答します。 –

+0

あなたの答えを詳細に教えてもらえますか?私はそれを理解しませんでした:( – Edmondo1984

1

プロセッサがこれらの値にアクセスできるようにするため、ヘッダーのみを設定しますか? BazProcessorFactoryがあなたのプロセッサ単なるラッパーである

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

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

ありがとうDamo - 私は実際にそれらをヘッダーとして設定する必要があります - 彼らはプロセッサで使用されていますが、彼らはまた、いくつかのルーティングを処理するためにプロセッサの後に使用されます。元の質問への注意。 –

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) 
    } 
} 

このように使用してください。 http://siliconsenthil.in/blog/2013/07/11/apache-camel-with-scala-extending-dsl/

+0

@kleopatra:ありがとう..できました:) – siliconsenthil

関連する問題