从Apache Camel中的当前路由返回并继续路由

83qze16e  于 2022-11-07  发布在  Apache
关注(0)|答案(4)|浏览(249)

假设我们有两个路由ABA路由在某个点调用路由B。我希望在B路由中在特定条件下返回到A并仅继续A路由,因此stop()不适合我的情况。我希望保留我的路由,而不进行严重的重构

tyg4sfes

tyg4sfes1#

您可以使用窃听来实现这一点。在这种情况下,您的逻辑必须更改:

  • 路由B被拆分为B-common和B-cont,其中B-cont包含在将结果返回到A之后必须处理的逻辑
  • 逻辑必须从“在特定条件下返回到A并继续处理B”更改为“在反向的特定条件下窃听到B-控制”

有关窃听的详细信息,请访问:http://camel.apache.org/wire-tap.html
配置示例:

<route>
    <from uri="direct:A"/>
    <log message="B is starting"/>
    <to uri="direct:B"/>
    <log message="B is finished"/>
</route>
<route>
    <from uri="direct:B"/>
    <!-- Common B logic here -->
    <log message="Common B logic finished"/>
    <choice>
        <when>
            <!-- your condition inverted -->
            <wireTap uri="direct:B-cont"/>
        </when>
    </choice>
    <!-- Remaining B logic if needed to prepare required response for A -->
    <log message="Response to A prepared"/>
</route>
<route>
    <from uri="direct:B-cont"/>
    <log message="B processing after returning response to A"/>
    <!-- remaining B logic -->
</route>

此类路由的日志输出如下所示:

B is starting
Common B logic finished
Response to A prepared
B is finished
B processing after returning response to A

或:

B is starting
Common B logic finished
Response to A prepared
B processing after returning response to A
B is finished

或:

B is starting
Common B logic finished
B processing after returning response to A
Response to A prepared
B is finished

正如您所看到的,“窃听”路由将(在大多数情况下)与其被调用的路由的其余部分并行运行。

quhf5bfb

quhf5bfb2#

我想你是直接连接到路由B,你能简单地在你的路由B中设置一个报头(当条件满足时),当它返回到路由A时,过滤掉没有设置这个报头的交换机吗?如果不清楚,请告诉我,我会给你一个例子。
R.

iyr7buue

iyr7buue3#

从由direct组件连接的多条路由中选择路由A。在路由B中,在特定条件下使用to("direct:partRouteA")调用路由A的所需部分

k5ifujac

k5ifujac4#

事实上,stop()确实完全停止路由,而不是当前路由中的returnbreak。我还没有测试过它,但是在路由B中的filter(false)如何?这应该会使交换在路由A上恢复。

相关问题