首页 文章

试图基于过滤器停止Camel交换处理

提问于
浏览
2

我的问题与_1088213非常相似,但那里的解决方案对我不起作用 - 我正在尝试使用过滤器EIP来丢弃选定的交换 . 我的路线看起来像(为清晰起见而编辑):

from("{{fromSource}}")
 .convertBodyTo(RequestInterface.class)
 .enrich(INVOKE_BACKEND_URI, combiner)
 .to("{{toDestination}}");

from(INVOKE_BACKEND_URI)
 .to(backendUri)
 .filter().method(DiscardResponse.class).log(LoggingLevel.INFO, "Discarding undesired response").stop().end()
 .convertBodyTo(BodyInterface.class);

当过滤器没有选择消息时,一切都很好 - 不显示log(),消息转到convertBodyTo()然后返回主路径 .

但是,当过滤器选择消息时,会显示log()文本,但交换仍然继续到convertBodyTo(),在那里它会抛出异常,因为它是一条不应该存在的消息 . stop()似乎没有被执行或没有任何影响 .

有谁能建议解决这个问题?

2 回答

  • 1

    可以在处理器内执行此操作以停止交换:

    exchange.setProperty(Exchange.ROUTE_STOP, Boolean.TRUE);
    

    由于我不习惯使用Java DSL编写我的路由,我不知道该选项是否可以直接在路由中的交换机上使用,但它可能是 .

  • 0

    我猜一种方法可能是:

    from(INVOKE_BACKEND_URI)
     .to(backendUri)
     .filter().method(DiscardResponse.class).log(LoggingLevel.INFO, "Discarding undesired response")
    .choice()
      .when(simple("${property.Exchange.FILTER_MATCHED}=true")
       .stop()
    .end()
     .convertBodyTo(BodyInterface.class);
    

    看看这里的文档底部:http://camel.apache.org/message-filter.html

相关问题