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