java 如何重试一次camel直接路由?

a2mppw5e  于 2023-03-16  发布在  Java
关注(0)|答案(2)|浏览(206)

使用camel,我想发送一个HTTP请求,如果失败,采取一些纠正措施并再试一次。
发送请求被封装在direct路由中,并且需要生成一个唯一的令牌,除此之外,请求应该完全相同。如果请求第二次失败,它应该以“正常”的方式失败。
我希望发送逻辑在它自己的路由中,因为有时我不想重试就调用它。
我如何使用camel DSL设置这个场景呢?我尝试了onException和errorHandler的各种组合,但它似乎都无法捕获异常。
示例(不起作用):

from("direct:send-request-no-retry")
  .setHeader("token").exchange(this::generateToken)
  .to("http://example.com");

from("direct:fix-the-error")
  // ...
  ;

from("direct:send-request")
  .onException(HttpOperationFailedException.class)
    .to("direct:fix-the-error")
    .maximumRedeliveries(1)
    .useOriginalMessage()
    .end()
  .to("direct:send-request-no-retry");
qacovj5a

qacovj5a1#

我主要使用onException()子句作为一个全局异常处理器。在快速测试中,当直接放入路由时,它实际上并没有捕获异常。我想到的几个选项是:
第一选项尝试条款:

from("direct:send-request")
            .doTry()
                .to("direct:send-request-no-retry")
            .doCatch(HttpOperationFailedException.class)
                .to("direct:fix-the-error")
                .to("direct:send-request-no-retry")
            .doFinally()
                .whatevs()
            .endDoTry();

但是这有点麻烦,因为你必须从doCatch子句中再次处理异常。另一个方法是从“send-request-no-retry”中抛出自定义异常。

from("direct:send-request-no-retry")
            .setHeader("token").exchange(this::generateToken)
            .doTry()
                .to("http://example.com")
            .doCatch(HttpOperationFailedException.class)
                .throwException(new CustomExceptionThatExtendsRunTimeException())
            .doFinally();

onException(CustomExceptionThatExtendsRunTimeException.class)
        .handled(true)
        .to("direct:fix-the-error")
        .maximumRedeliveries(1)
        .useOriginalMessage()
        .to("direct:send-request-no-retry")
        .end();

我没有测试过这个,所以我不确定这是否会产生一个无限反馈循环,或者maximumReddeliveries是否会切断它。如果是这样,你可以实现另一个“direct:send-request-no-retry”路由,它不抛出customException,只是静默地失败,或者抛出HttpOperationFailedException并从onException()传递请求。或者设置retryAmount为一个头,并在onException处理程序中检查该头,看看我们是否想再试一次。
customException是为了让onException()子句捕获来自指定类型的每个路由的所有异常,我认为您不希望将每个失败的http请求传递给您的retryroute。

aydmsdu9

aydmsdu92#

你可以在toD的时候doTry(),抛出你喜欢的任何异常,并且根据异常类你可以设置最大重试次数。OnException()仍然是全局的,但是你有更多的控制权。
没有errorHandler()的全局onException()会让我毫无问题地抓住HttpFailedOperationException()
此外,您可以执行onException().onWhen()来检查一些交换属性。另一种添加更精细控制的方法。您在onWhen()中使用simple()表达式。如果它为true,则设置最大重试次数。全局定义另一个onWhen()来处理属性为false的情况。

相关问题