4

有谁知道如何从骆驼URI中提取参数?我有这样定义的路线

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

我想像这样在“myMethod”中提取参数1和参数2(我在Grails中实现骆驼)

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

如果我理解正确,您正在尝试将参数传递给将要调用的方法。执行此操作的常用方法是在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
}

或者,如果您想花哨并使用 Camel 的 bean 绑定,

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

如果这有帮助,请记得投票。

于 2013-01-01T13:32:48.173 回答
1

val1 和 val2 是硬编码的值,还是应该是某种动态值,可能来自消息本身?

Camel bean 组件允许您定义绑定,并从消息中传入值或固定值。在以下位置查看更多详细信息:http ://camel.apache.org/bean-binding.html

您还需要查看方法签名中的参数数量,以及在 Camel bean 绑定 uri 中定义的参数数量。他们应该匹配。

于 2012-12-17T08:26:00.413 回答