【问题标题】:How to stop camel dynamic route on exception如何在异常时停止骆驼动态路由
【发布时间】:2020-10-21 11:25:00
【问题描述】:

出现异常时如何停止骆驼路线。我的动态路由正在消耗 jms 并发送到响应式端点。

camelContext.addRoutes(New GenerateRoute());

路由生成器类如下:

public class GenerateRoute extends RouteBuilder {

@Override
public void configure() {
    from("jms:queue:myQueue")
        .toF("reactive-streams:myStream").setId("myRoute");
}}

【问题讨论】:

  • @KavithakaranKanapathippillai 是的,我希望我的路线永久“停止”。

标签: apache-camel spring-camel


【解决方案1】:

试试这个

    from("jms:queue:myQueue")
            .routeId("myRoute")
            .doTry()
                .toF("reactive-streams:myStream")
            .doCatch(Exception.class)
                .process(exchange -> exchange.getFromEndpoint().stop())
            .end();

【讨论】:

  • 你的意思是 doCatch() 而不是 doFinally() 对吗?因为只有在出现异常时才需要停止路由。
  • 谢谢!另外,我相信这仍然会从 jms 队列中丢失一条消息,对吗?如果是,有没有办法添加“已交易”?
  • 好的,谢谢!还有一个问题...如果我想稍后再开始路线,.routeId 是否在正确的位置?
  • 如何在其中添加事务,使导致异常的消息不被消费并留在jms队列中?
  • 我在这里添加了后续问题stackoverflow.com/questions/62743621/…
【解决方案2】:

您可以使用handledcontinued。在onException 子句中。 “Continued 允许您在原始路由中处理和继续路由,就好像没有发生异常一样。”如果continued 为 false,则路由不会回到原来的路由。

DSL:

<onException>
    <exception>java.lang.IllegalArgumentException</exception>
    <continued><constant>false</constant></continued>
</onException>

Java:

onException(IllegalArgumentException.class).continued(fasle);

参考:https://camel.apache.org/manual/latest/exception-clause.html#

【讨论】:

  • 这会仅终止生成的路线正确吗?我用我拥有的代码更新了我的问题。这看起来像下面这样吗?
  • public class GenerateRoute extends RouteBuilder { onException(Exception.class).process(exchange -&gt; { System.out.println("handling ex"); }).continued(false); @Override public void configure() { from("jms:queue:myQueue") .toF("reactive-streams:myStream").setId("myRoute"); } }
  • 你的问题我不清楚。 continued 所做的是处理异常。如果您想将控件返回到路由,则 continue 为 true,否则您可以将其设置为 false。如果handled 为真,则发生的异常将在交换中删除,否则它将保留在交换中,您仍然可以使用以下命令从交换中检索它:Throwable caused = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class); 这些是
  • 我可以举个例子:如果从队列中读取消息并发送到另一个路由,如direct:enrich-message,它丰富了消息,然后从direct:enrich-message发送到direct:send-to-mysystem,你发送如果您在direct:send-to-mysystemonException 子句中有continued=truehandled=false,则将其发送到reactive-streams:myStream,则交换将被发送回direct:enrich-message 路由,并在交换中捕获异常。
  • 我正在寻找一种完全停止路由的方法,这样路由就不会再从 JMS 中消耗了。基本上是 context.getRoute("myRoute").getConsumer.stop()。据我了解,continuous(false) 仍将继续使用 JMS。在这种情况下交易会起作用吗?
猜你喜欢
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 2015-09-27
  • 1970-01-01
相关资源
最近更新 更多