8.18. 动态路由器


动态路由器

Dynamic Router 模式(如 图 8.12 “动态路由器模式” 所示)可让您通过一系列处理步骤来连续路由消息,其中在设计时不知道步骤序列。在运行时 动态计算消息应通过的端点列表。每次消息从端点返回时,在 bean 上重新调用动态路由器,以发现路由中的下一个端点。

图 8.12. 动态路由器模式

动态路由器

Camel 2.5 中,我们在 DSL 中引入了一个 dynamicRouter,它类似于一个动态 第 8.7 节 “路由片段”,用于评估 slip on-fly

beware

您必须确保用于 dynamicRouter (如 bean)的表达式返回 null 以指示结束。否则,dynamicRouter 将继续处于无限循环中。

Camel 2.5 中的动态路由器以后

在 Camel 2.5 中,第 8.18 节 “动态路由器” 更新交换属性 Exchange.SLIP_ENDPOINT,其当前端点通过 slip 进行了改进。这可让您了解交换通过 slip 进行的进展。(它是一个 slip,因为 第 8.18 节 “动态路由器” 实现基于 第 8.7 节 “路由片段”)。

Java DSL

在 Java DSL 中,您可以使用 dynamicRouter,如下所示:

from("direct:start")
    // use a bean as the dynamic router
    .dynamicRouter(bean(DynamicRouterTest.class, "slip"));

这将利用 bean 集成来计算 slip on-fly,其实施如下:

// Java
/**
 * Use this method to compute dynamic where we should route next.
 *
 * @param body the message body
 * @return endpoints to go, or <tt>null</tt> to indicate the end
 */
public String slip(String body) {
    bodies.add(body);
    invoked++;

    if (invoked == 1) {
        return "mock:a";
    } else if (invoked == 2) {
        return "mock:b,mock:c";
    } else if (invoked == 3) {
        return "direct:foo";
    } else if (invoked == 4) {
        return "mock:result";
    }

    // no more so return null
    return null;
    }
注意

前面的示例 不是 线程安全。您必须将状态存储在 Exchange 上,以确保线程安全。

Spring XML

Spring XML 中的相同例子是:

<bean id="mySlip" class="org.apache.camel.processor.DynamicRouterTest"/>

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="direct:start"/>
        <dynamicRouter>
            <!-- use a method call on a bean as dynamic router -->
            <method ref="mySlip" method="slip"/>
        </dynamicRouter>
    </route>

    <route>
        <from uri="direct:foo"/>
        <transform><constant>Bye World</constant></transform>
        <to uri="mock:foo"/>
    </route>

</camelContext>

选项

dynamicRouter DSL 命令支持以下选项:

Name

默认值

描述

uriDelimiter

,

如果 第 II 部分 “路由表达式和 predicates 语言” 返回多个端点,则使用分隔符。

ignoreInvalidEndpoints

false

如果无法解析端点 uri,则它应该被忽略。否则 Camel 将抛出一个例外,表示端点 uri 无效。

@DynamicRouter 注释

您还可以使用 @DynamicRouter 注释。例如:

// Java
public class MyDynamicRouter {

    @Consume(uri = "activemq:foo")
    @DynamicRouter
    public String route(@XPath("/customer/id") String customerId, @Header("Location") String location, Document body) {
        // query a database to find the best match of the endpoint based on the input parameteres
        // return the next endpoint uri, where to go. Return null to indicate the end.
    }
}

路由 方法通过 slip 重复作为消息进度调用。其理念是返回下一个目的地的端点 URI。返回 null 以指示结束。就像 第 8.7 节 “路由片段” 一样,您可以返回多个端点,其中每个端点都由分隔符分开。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.