1

我正在尝试借助如下所示的 try catch 块来查找骆驼中是否存在直接路线。我正在寻找一个谓词来检查骆驼中是否存在路线。我找不到任何直接给我答案的东西,所以我采取了以下方法,

<doTry>
    <recipientList>
        <description>Check if a country specific handler is available</description> 
        <simple>direct:${header.operationName}${body.country}</simple> 
    </recipientList>
    <doCatch>
        <exception>org.apache.camel.component.direct.DirectConsumerNotAvailableException</exception> 
        <recipientList>
            <description>if a country specific handler is not available to to the base</description> 
            <simple>direct:${header.operationName}</simple> 
        </recipientList>
    </doCatch>
</doTry>

这意味着我被迫使用骆驼中的异常处理程序来捕获 DirectConsumerNotAvailableException 以确定路由是否存在。我正在寻找一种替代方法,我们可以使用如下所示的简单表达式

<choice>
    <when>
        <description>Check if a country specific handler is available</description>
        <simple>direct:${header.operationName}${body.country} exists</simple>
        <recipientList>
            <description>country specific handler is available</description>
            <simple>direct:${header.operationName}${body.country}</simple>
        </recipientList>
    </when>
    <otherwise>
        <recipientList>
            <description>country specific handler is not available then route to generic processing</description>
            <simple>direct:${header.operationName}</simple>
        </recipientList>
    </otherwise>
</choice>

请让我知道是否可以使用其他方式实现这样的目标。

4

2 回答 2

3

从 camel 2.11.x 开始,简单表达式有一个名为 camelContext 的新变量,可用于评估路由是否存在camelContext.hasEndpoint

<choice>
    <when>
        <description>Check if a country specific handler is available</description>
        <simple>${camelContext.hasEndpoint(direct:${header.operationName}${body[0].country})} != null</simple>
        <recipientList>
            <description>country specific handler is available</description>
            <simple>direct:${header.operationName}${body.country}</simple>
        </recipientList>
    </when>
    <otherwise>
        <recipientList>
            <description>country specific handler is not available then route to generic processing</description>
            <simple>direct:${header.operationName}</simple>
        </recipientList>
    </otherwise>
</choice>

对于那些使用像2.10.x这样的早期版本的 apache-camel 的人,您可以使用骆驼的上下文通过交换对象及其动态路由器检查路由是否存在

路线信息,

<dynamicRouter>
    <method ref="dynamicRouterService" method="route"/>
</dynamicRouter>

动态路由器,

public class DynamicRouterService {
    public String route(@Header("operationName") String operationName, @Properties Map<String, Object> properties, Exchange exchange, Country body) {
        //needed to end the iterative routing calls
        if (Boolean.valueOf((String)properties.get("SERVICE_INVOKED"))) {
            return null;
        }

        //indicate that the route has been invoked
        properties.put("SERVICE_INVOKED", "true");

        return this.orchestrateRoute(exchange, operationName, body.getcountry());
    }
    private String orchestrateRoute(Exchange exchange, String operationName, String country) {
        String uriBaseString = "direct:" + operationName;
        String uriCountryString = uriBaseString + country;
        Endpoint endpoint = exchange.getContext().hasEndpoint(uriCountryString);
        if (endpoint != null) {
            return uriCountryString;
        } else {
            return uriBaseString;
        }
    }
}

感谢克劳斯指出骆驼上下文

于 2013-10-08T13:12:56.970 回答
0

请参阅此关于动态 <to> 的常见问题解答 http://camel.apache.org/how-do-i-use-dynamic-uri-in-to.html

然后,您可以使用 bean 上的方法来计算端点。CamelContext 上有 API 来检查路由/端点是否存在。

于 2013-10-07T13:35:30.380 回答