HTTP重试建议在抛出异常时不重试



我有抛出数据库异常的服务激活器方法,我正在捕获该异常并将ResponseEntity发送到输出通道。我在服务激活器上配置了重试建议,但它没有重试(我假设这是因为我正在捕获它并将自定义异常发送到输出通道),我希望它先重试4次,然后发送自定义异常。请问我怎么才能做到呢?

<int:chain id="a1-chain" input-channel="dRequestInputChannel" output-channel="dIntermediateChannel">
<int:service-activator ref="dAdapterController" method="dPersist">
<int:request-handler-advice-chain>
<int:retry-advice max-attempts="4" recovery-channel="dRetryChannel">
<int:exponential-back-off initial="1000" multiplier="5.0" maximum="60000" />
</int:retry-advice>
</int:request-handler-advice-chain>
</int:service-activator>
</int:chain>
<int:transformer input-channel="dRetryChannel" expression="payload.getFailedMessage()"/>

在此之后有一些代码,其中我有一个链,其输入通道为dIntermediateChannel和一个路由器等,工作良好!我的意思是说流工作得很好,不需要重试!

你自己说的:

我正在捕获该异常并将ResponseEntity发送到输出通道。

不清楚是什么让你认为重试必须在这种情况下工作:如果没有异常从用户代码抛出,那么重试拦截器中的catch没有任何内容,因此没有触发启动重试策略。

请不要混淆你自己和我们。我们不知道你的代码是什么,但是你说:

然后发送自定义异常

那么,送它是ResponseEntity的一部分还是扔?我想说,在第一种情况下,它只是自定义回复,不管它的主体是什么。只要它不引起throws,它就不是catch的例外。

如果你想重试,然后回退,那么看看一个逻辑,你不自己catch异常,但让它由retry-advice完成。

要进行自定义回复,需要查看注入到RequestHandlerRetryAdvice中的RecoveryCallback。不幸的是,int:retry-advice并没有暴露RecoveryCallback。现有的recovery-channel不期望从发布中产生回复。

另一种方法是在此重试周围使用ExpressionEvaluatingRequestHandlerAdvice来捕获最终异常并产生一些补偿。

最新更新