gpt4 book ai didi

timeout - Camel中如何实现超时重试?

转载 作者:行者123 更新时间:2023-12-02 21:08:50 29 4
gpt4 key购买 nike

我应该如何实现Camel路线来实现以下目标?

  1. 通过向 JMS 代理发出请求来调用外部服务
  2. 在另一个线程上等待其响应,因此原始线程不会被阻塞
  3. 如果请求超时,则重新从第2步开始(这部分可以通过轮询来完成);否则继续
  4. 处理响应

我的测试路线实现

// Simulate receiving message from upstream
from("direct:jmsStart")
.setExchangePattern(ExchangePattern.InOnly)
.validate(new TestValidator("Some basic validation"))
.to("seda:sell");

// Sell Flow Starts
from("seda:sell")
.transform(new TestTransformer("Convert to internal data structure"))
.validate(new TestValidator("ValidateSellStatus"))
.process(new TestProcessor("Prepare request to external system"))
.process(new TestProcessor("Persist the request to DB")) // <== Any better persistence suggestion??
.to("seda:jmsRequestToExternal");

// Simulate External System Processing
from("seda:jmsRequestToExternal")
.log(LoggingLevel.INFO, LOGGER, "External System Processing...")
.delay(1000).to("seda:jmsReplyFromExternal");

// External System response received
from("seda:jmsReplyFromExternal")
.process(new TestProcessor("Mark Complete"))
.log(LoggingLevel.INFO, LOGGER, "Send reply to upstream");

// Trigger retry - resend those requests without a response
from("timer://poller?period=30000")
.process(new TestProcessor("Get pending requests from DB")) // <== Any better persistence suggestion??
.to("seda:jmsRequestToExternal");

为了实现低延迟,所有路由/子路由不应互相阻塞。想了解是否有更好的实现可以达到同样的效果?据我了解,Camel 上的重新传递机制似乎依赖于阻塞超时或异常机制,这可能不适合低延迟应用程序。

最佳答案

您需要使用带有重新传递策略的异常处理程序,在 Camel 中也称为 RedeliveryErrorHandler。例如,此错误处理程序将允许您设置重试次数,还可以设置重试之间的延迟等内容。

以下属性可用于 RedeliveryErrorHandler

  • MaximumRedeliveries:允许的最大重新投递尝试次数。 0 用于禁用重新投递,-1 将永远尝试重新投递,直到成功。

  • RedeliveryDelay:修复了每次重新投递尝试之间的延迟(以毫秒为单位)。

  • MaximumRedeliveryDelay:重新传递延迟的上限(以毫秒为单位)。当您指定非固定延迟(例如指数退避)时,可以使用此选项,以避免延迟变得太大。使用带有重新传递的错误处理程序

  • AsyncDelayedRedelivery:指示 Camel 是否应使用异步延迟重新传递。当计划在将来重新交付时,Camel 通常必须阻塞当前线程,直到重新交付的时间为止。通过启用此选项,您可以让 Camel 使用调度程序,以便异步线程执行重新传递。这可确保在等待重新传递时不会阻塞任何线程。

  • BackOffMultiplier:指数退避乘数,用于乘以每个后续延迟。RedeliveryDelay 是起始延迟。默认情况下禁用指数退避。

  • CollisionAvoidanceFactor:计算随机延迟偏移时使用的百分比(以避免在下次尝试时使用相同的延迟)。将以 RedeliveryDelay 作为起始延迟开始。默认情况下禁用碰撞避免。

  • DelayPattern:用于计算延迟的模式。该模式允许您为间隔组指定固定延迟。例如,模式“0:1000;5:5000;10:30000”将为尝试 0 到 4 使用 1 秒延迟,为尝试 5 到 9 和 30 使用 5 秒延迟后续尝试的秒数。

  • RetryAttemptedLogLevel:执行重新传递尝试时使用的日志级别。

  • RetriesExhaustedLogLevel:所有重新传递尝试失败时使用的日志级别。

  • LogStackTrace boolean true 指定当所有重新传递尝试失败时是否应记录堆栈跟踪。

  • LogRetryStackTrace:指定传递失败时是否应记录堆栈跟踪。

  • LogRetryAttempted:指定是否应记录重新传递尝试。

  • LogExhausted:指定是否已耗尽重新传递尝试(当所有重新传递尝试尝试失败)应该被记录。

  • LogHandled:指定是否应记录已处理的异常。

在 Java 中使用它很简单,您可以使用以下代码:

errorHandler(defaultErrorHandler()
.maximumRedeliveries(3)
.backOffMultiplier(4)
.retryAttemptedLogLevel(LoggingLevel.WARN));

或者如果你想使用 Spring XML DSL:

<errorHandler id="myErrorHandler" type="DefaultErrorHandler"
<redeliveryPolicy maximumRedeliveries="5"
retryAttemptedLogLevel="WARN"
backOffMultiplier="2"
useExponentialBackOff="true"/>
</errorHandler>

您可以使用它来重试 Web 服务调用一定次数,然后如果在 5 次重试尝试后仍无法连接,则抛出异常。

关于timeout - Camel中如何实现超时重试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26838086/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com