4

キャメルURIからパラメータを抽出する方法を知っている人はいますか? このように定義されたルートがあります

from("SOME_URI")
.to("SOME_URI")
.to("bean:myBean?method=myMethod&myParameter1=val1&myParameter2=val2")

このように「myMethod」でparameter1とparameter2を抽出したい(Grailsでcamelを実装しています)

def myMethod(def inBody, Exchange exchange){
 String parameter1 = extractParameter('myParameter1')
 String parameter2 = extractParameter('myParameter2')

 ...//rest of code

 return something
}

前もって感謝します!

4

3 に答える 3

2

主な回答

探しているものを交換から取得できます。

exchange.getFromEndpoint()

「SOME_URI」で定義されたエンドポイントを返します。

exchange.getFromEndpoint().getEndpointUri()

「SOME_URI」の文字列値を返します

コードが次のようになる可能性があることを意味します。

def myMethod(def inBody, Exchange exchange){
    def uri = exchange?.fromEndpoint?.endpointUri

    if(uri) {
        String parameter1 = extractParameter(uri, 'myParameter1')
        String parameter2 = extractParameter(uri, 'myParameter2')

       //...rest of code
    }

    return something
}

/*
 * do any kind of processing you want here to manipulate the string
 * and return the parameter. This code should work just fine in grails
 */
def extractParameter(String uri, String parameterName) {
    def m = uri =~ "${parameterName}=([^&]+)"
    return m.find() ? m[0][1] : null
}

同等の Java が優先される場合、これは同じことを行う必要があります。

private static String extractParameter(String uri, String parameterName) {
    Matcher m = Pattern.compile(parameterName + "=([^&]+)").matcher(uri);
    return m.find() ? m.group(1) : null
} 

また、何を達成しようとしているのかによっては、fromF DSL を使用してパラメータをルートに直接提供する方がよい場合もあります。そうすれば、コードでパラメーターを使用できるようになり、後でそれらを抽出することを心配する必要がなくなります。

以下のコード スニペットは、 FromF の Camel ドキュメントから取得したものです。

fromF("file://%s?include=%s", path, pattern).toF("mock:%s", result);
于 2012-12-14T21:08:23.427 に答える
1

val1 と val2 はハードコードされた値ですか、それとも何らかの動的な値である必要がありますか (おそらくメッセージ自体から)。

Camel Bean コンポーネントを使用すると、バインディングを定義し、メッセージからの値または固定値を渡すことができます。詳細については、http: //camel.apache.org/bean-binding.htmlを参照してください。

また、メソッド シグネチャのパラメータ数と、Camel Bean バインディング URI で定義したパラメータ数も確認する必要があります。それらは一致するはずです。

于 2012-12-17T08:26:00.413 に答える
1

私の理解が正しければ、呼び出されるメソッドにパラメーターを渡そうとしています。これを行う通常の方法はExchange、ルートを流れるオブジェクトを変更することです。

from("SOME_URI")
.to("SOME_URI")
.setHeader("myParameter1", constant("val1"))
.setHeader("myParameter2", constant("val2"))
.to("bean:myBean?method=myMethod")

メソッドでは、 のヘッダーにアクセスするだけですExchange

def myMethod(Exchange exchange) {
    String parameter1 = exchange.getHeader("myParameter1", String.class)
    String parameter2 = exchange.getHeader("myParameter2", String.class)
    //...rest of code
}

または、キャメルの Bean バインディングを使用したい場合は、

def myMethod(Exchange exchange, 
        @Header("myParameter1") String parameter1,
        @Header("myParameter2") String parameter2) {
    //...rest of code
}

これが役立つ場合は、忘れずに投票してください。

于 2013-01-01T13:32:48.173 に答える