Timeout 如何在Camel中实现超时重试?

Timeout 如何在Camel中实现超时重试?,timeout,apache-camel,Timeout,Apache Camel,我应该如何实施骆驼路线以实现以下目标 通过将请求放入JMS代理来调用外部服务 在另一个线程上等待其响应,这样原始线程就不会被阻塞 如果请求超时,则再次从步骤2开始(这部分可以通过轮询完成);否则继续 处理响应 我的测试路线实施 //模拟从上游接收消息 发件人(“直接:jmsStart”) .setExchangePattern(ExchangePattern.InOnly) .validate(新的TestValidator(“一些基本验证”)) 。向(“轿车:出售”); //销售流程开始 来自

我应该如何实施骆驼路线以实现以下目标

  • 通过将请求放入JMS代理来调用外部服务
  • 在另一个线程上等待其响应,这样原始线程就不会被阻塞
  • 如果请求超时,则再次从步骤2开始(这部分可以通过轮询完成);否则继续
  • 处理响应
  • 我的测试路线实施

    //模拟从上游接收消息
    发件人(“直接:jmsStart”)
    .setExchangePattern(ExchangePattern.InOnly)
    .validate(新的TestValidator(“一些基本验证”))
    。向(“轿车:出售”);
    //销售流程开始
    来自(“轿车:出售”)
    .transform(新的TestTransformer(“转换为内部数据结构”))
    .validate(新的TestValidator(“ValidateSellStatus”))
    .process(新的TestProcessor(“准备对外部系统的请求”))
    
    .process(新的TestProcessor(“将请求持久化到DB”)/您需要使用一个异常处理程序,该异常处理程序具有重新交付策略,在Camel中也称为
    RedeliveryErrorHandler
    。此错误处理程序允许您设置重试次数,例如,还可以设置重定时之间的延迟等

    以下属性可用于
    RedeliveryErrorHandler

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

    • 重新交付显示:修复了每次重新交付尝试之间的延迟(毫秒)

    • MaximumRedeliveryDelay:以毫秒为单位的重新交付延迟上限。在指定非固定延迟(如指数退避)时使用此选项,以避免延迟增长过大

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

    • 退避乘数:指数退避乘数,用于乘以每个后续延迟。重新交付延迟是开始延迟。默认情况下,指数退避被禁用

    • CollisionAvoidanceFactor:计算随机延迟偏移量时使用的百分比(以避免在下次尝试时使用相同的延迟)。将以重新交付显示作为启动延迟开始。默认情况下禁用碰撞避免

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

    • RetryAttemptedLogLevel:执行重新交付尝试时使用的日志级别

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

    • LogStackTrace布尔值true指定在所有重新交付尝试失败时是否应记录StackTrace

    • LogRetryStackTrace:指定在传递失败时是否应记录StackTrace

    • LogRetryAttempted:指定是否应记录重新交付尝试

    • LogExpended:指定是否用尽重新交付尝试(当所有重新交付 尝试失败)应记录

    • 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>
    

    你的意思是从第一步开始吗?否则,您将永远等待。如果正在读取JMS队列并使用队列消息调用web服务,您应该能够按照本文档中的描述配置队列以重试。如果超时不会引发异常,因为外部服务是通过JMS异步调用的(即非阻塞),该怎么办.那么你能在问题中提供更多细节吗?似乎有很多事情我都不知道。
    
    <errorHandler id="myErrorHandler" type="DefaultErrorHandler"
        <redeliveryPolicy maximumRedeliveries="5"
           retryAttemptedLogLevel="WARN"
           backOffMultiplier="2"
           useExponentialBackOff="true"/>
    </errorHandler>