我们在项目中使用了骆驼重试。当交易次数/期间很小时,它可以正常工作。
我们的事务是一个ftp进程-有时我们遇到连接问题(服务器已关闭等)-因此我们已配置了特定数量的重试/延迟-之后流量将流向错误处理器。
当有大量事务(例如> 25)失败并且都在同一时间重试循环时-每个事务的重试周期都增加了...每个事务到达都需要更多时间到错误处理器。
我们已经配置了一个重新交付处理器以收集时间统计信息-到目前为止,我们了解的是-
a)每次将其他失败的事务添加到队列中时,事务就会越走越远,等待重试。
b)重试触发每秒发生一次。我们添加了一个Scheduledexecutor服务(为deadletterChannel构建器添加了10个线程)-但是,线程数量并没有增加重试的频率-由于有许多事务在等待重试-期望尽快进行重试交易可以重试,而不必每1秒重试一次。
下面是此蓝图片段
<bean class='org.apache.camel.builder.DeadLetterChannelBuilder" id="myDeadLetterErrorHandler'>
<property name="deadLetterUri" value="direct:deadletter"/>
<property name="redeliveryPolicy" ref="myRedeliveryPolicyConfig"/>
<property name="executorServiceRef" value="redeliveryThreadPool"/>
<property name="onRedelivery" ref="redelProcessor"/> <!-- we have used this for getting statistics of the retry --->
</bean>
<bean class="org.apache.camel.processor.RedeliveryPolicy" id="myRedeliveryPolicyConfig">
<property name="maximumRedeliveries" value="${maximum.Redeliveries}"/>
<property name="redeliveryDelay" value="${redelivery.Delay}"/>
<property name="asyncDelayedRedelivery" value="true"/>
<property name="maximumRedeliveryDelay" value="${maximum.RedeliveryDelay}"/>
<property name="backOffMultiplier" value="0"/>
</bean>
<bean class="java.util.concurrent.ScheduledThreadPoolExecutor" id="redeliveryThreadPool">
<argument type="int" value="${int}"/>
<property name="maximumPoolSize" value="${maximum.PoolSize}"/>
</bean
需要输入/建议以在短时间内大量失败的事务处理时如何限制重试延迟