int:request-handler-advice-chain
サービスアクティベーターと一緒に使用しています。正しく動作していますが、サービスアクティベーターによってスローされた例外に基づいて、異なる回数の再試行を許可するためorg.springframework.retry.policy.SimpleRetryPolicy
に使用したいと考えています。org.springframework.retry.policy.ExceptionClassifierRetryPolicy
私が抱えている問題は、例外ExceptionClassifierRetryPolicy
が
org.springframework.integration.MessageHandlingException
MessageHandlingException
で利用可能になったものから原因(つまり、私の例外)を取得するための最良のアプローチについてアドバイスできますExceptionClassifierRetryPolicy
か?
以下のArtemの提案による解決策:
MessagingException の場合に原因を返す SubclassClassifier のサブクラスを作成する
public class MessagingCauseExtractingSubclassClassifier extends SubclassClassifier<Throwable, RetryPolicy> {
private static final Logger LOG = LoggerFactory.getLogger(MessagingCauseExtractingSubclassClassifier.class);
public MessagingCauseExtractingSubclassClassifier(final Map<Class<? extends Throwable>, RetryPolicy> policyMap, final RetryPolicy retryPolicy) {
super(policyMap, retryPolicy);
}
@Override
public RetryPolicy classify(final Throwable throwable) {
Throwable t = throwable;
if (t instanceof MessagingException) {
t = t.getCause();
LOG.debug("Throwable is instanceof MessagingException so classifying cause type: {}", t.getClass());
}
return super.classify(t);
}
}
次に、新しい分類子と policyMap を使用する新しい ExceptionClassifierRetryPolicy サブクラス
public class MessasgeCauseExtractingExceptionClassifierRetryPolicy extends ExceptionClassifierRetryPolicy {
@Override
public void setPolicyMap(final Map<Class<? extends Throwable>, RetryPolicy> policyMap) {
final MessagingCauseExtractingSubclassClassifier classifier = new MessagingCauseExtractingSubclassClassifier(
policyMap, new NeverRetryPolicy());
setExceptionClassifier(classifier);
}
}
現在、これは MessagingException での retying をサポートしていませんが、これは私たちのユース ケースでは問題ありません。それ以外の場合は完全に機能します。