- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我应该如何实现Camel路线来实现以下目标?
我的测试路线实现
// 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/
是否可以重试网络客户端请求?在奇怪的情况下,我的应用程序在尝试连接到 xml Web 服务时会抛出错误,但如果我重试,它就可以正常工作。我希望它在抛出错误之前重试 2 次,除非有人有更好的解决方案:)
我在一本书中找到了这段代码片段: int ival; // read cin and test only for EOF; loop is executed even if there are oth
是否可以使用 for lop 来设置对象的条件。如果该条件未通过测试(if 语句),则更改条件直到它通过测试?这是我的伪代码尝试,但我怀疑它是否有效: for (int i = 0; i < myAr
我有以下问题。我的主要 Activity 由一个 ListView 组成,其中填充了从 Web 服务获得的数据。首次加载主要 Activity 时,以防无法从网络检索数据,我想显示一个带有 2 个按钮
我有微服务应用程序。为了协作,每个服务都使用异步消息传递。我知道,spring data jpa 默认使用乐观锁。但是如果这种锁定不是由用户调用,而是由另一个服务调用的方法(在我的示例中有验证服务,可
我希望能够在 F# 中编写一个计算表达式,如果它抛出异常,它将能够重试操作。现在我的代码看起来像: let x = retry (fun() -> GetResourceX()) let y = re
是否可以在 NServiceBus 版本 3.2.2 中禁用重试? 使用以下配置,可以禁用重试: 但当线程数设置为 20 时则不会。在这种情况下,消息会重试两次: 这看起来很像
我在 failed_jobs 上有多个失败的作业。我尝试重新排队 MaxAttemptsExceededException 但总是失败。如何重试那里的工作类型? 注意:每次我通过 php artisa
下面的 sproc 尝试向表中插入一行并生成一个随机 ID,用于在相应表上进行 PK。与随机生成的 ID 的冲突在 catch 块中处理,在那里再次重试/调用该过程。现在,这需要很长时间并导致死锁,因
我试图实现代码以使用“mocha-retry”重试失败的测试以下是示例。 describe(retries,' retries-',function () { var self = this;
我正在尝试通过 Azure 数据工厂将数据从 Azure 数据湖存储插入到 Azure 表。 Azure Data Lake 文件中的数据与最终 Azure 表接收器的架构相同。 ADF 管道包含从
是http.RoundTripper在 Go 中基于 HTTP 状态代码(例如 429)实现 http GET 请求重试机制的正确位置? 它在某种程度上“感觉正确”( Go Playground )并
使用 spring reactive WebClient,我使用了一个 API,如果响应状态为 500,我需要使用指数退避重试。但是在 Mono 类中,我没有看到任何以 Predicate 作为输入参
我一直在尝试编写 react native 的快速入门指南,但一直收到此错误 There appears to be trouble with your network connection. Ret
我正在尝试使用从我们心爱的堆栈溢出中获取的 Retry Monad: type RetryBuilder(max, sleep : TimeSpan) = member x.Return(
使用 spring reactive WebClient,我使用了一个 API,如果响应状态为 500,我需要使用指数退避重试。但是在 Mono 类中,我没有看到任何以 Predicate 作为输入参
我有一个由 C#.NET 4.0 开发的两层 Windows 窗体应用程序。在这个应用程序中,我读取文件内容并在数据访问层中创建实体列表,并将其返回到 GUI 层以在 GridView 中显示。在我当
如果有人问过这个问题,我深表歉意,但我已经做了很多搜索,但还没有找到与我的问题类似的问题。 在我的应用程序中,我有一个密码更改页面,如果某人是新用户或重置了他/她的密码,该页面就会触发。 问题是,一旦
想知道为什么我的 promise 正在解决但试图重试。 var getResultsStream = url => Rx.Observable.onErrorResumeNext( Rx.O
假设我有以下 Promise 链: var result = Promise.resolve(filename) .then(unpackDataFromFile) .then(tra
我是一名优秀的程序员,十分优秀!