2017-03-28 4 views
0

以下のシナリオ:私は@RabbitListenerがRabbitMQからのメッセージを受け取っています。関連するビジネスオブジェクトが見つからないため、メッセージがエラーになることがあります。この場合、私は送信者に返信する可能性がないので、一定の再試行後にこのメッセージを無視したいだけです。ビジネスエラーベストプラクティスでAMQP @RabbitListenerカスタムを再試行します

私の解決策:私の@RabbitListenerでは、ビジネスオブジェクトを見つけることができないときはいつでも、私はカスタムランタイム例外をスローします。私の設定では、私はRetryOperationsInterceptorと最大の試みとカスタムリカバリーを持っています。

このようなケースを処理するためのベストプラクティスは何ですか? @RabbitListenerが複数ある場合、異なるリカバリー・クラスを構成できますか?

私configuraionを参照してください:

@Bean 
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() { 
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 
    factory.setMessageConverter(new CustomMessageConverter()); 
    factory.setConnectionFactory(connectionFactory()); 
    factory.setAcknowledgeMode(AcknowledgeMode.AUTO); 
    factory.setConcurrentConsumers(1); 
    factory.setMaxConcurrentConsumers(20); 

    Advice[] adviceChain = new Advice[] { interceptor() }; 
    factory.setAdviceChain(adviceChain); 
    return factory; 
} 

@Bean 
RetryOperationsInterceptor interceptor() { 
    return RetryInterceptorBuilder.stateless() 
      .maxAttempts(5) 
      .recoverer(new CustomRejectAndRecoverer()) 
      .build(); 
} 

そして、これは私のCustomRejectAndRecovererです:

public class CustomRejectAndRecoverer implements MessageRecoverer { 

    @Override 
    public void recover(Message message, Throwable cause) { 
     if (ExceptionUtils.getRootCause(cause) instanceof BusinessObjectNotFoundRuntimeException) { 
      throw new ListenerExecutionFailedException("Retry Policy Exhausted", 
        new AmqpRejectAndDontRequeueException(cause), message); 
     } 
    } 
} 

答えて

0

あなたは現在、それぞれ異なる再試行の設定のための別のコンテナ工場を必要としています。

2.0では、新しいerrorHandler属性を注釈に追加して、作成されたコンテナファクトリに関係なく、各リスナーにカスタマイズされたエラーハンドラを持たせることができます。

これはfirst milestone releaseにありました。現在のマイルストーンはM2であり、M3はまもなく終了する予定です。 GAリリースは6月に予定されています。

+0

Thxは大きな改善のようです。コンシューマ向けの属性を追加することも検討しましたか?消費者の数が違うリスナーを欲しがるときは、複数のコンテナ工場を持たなければなりません。 – stritzi

+0

「改善」[JIRA Issue](https://jira.spring.io/browse/AMQP)を開いてください。もちろん、[貢献は常に歓迎です](https://github.com/spring-projects /spring-amqp/blob/master/CONTRIBUTING.adoc)。 –

0

共有SimpleRabbitListenerContainerFactoryから共通ロジックが@RabbitListener特定の要件に適合しない場合は、あなたが宣言する必要が新しいもの、それらのカスタムオプション、例えばこの問題に関する新しいMessageRecovererそのために

@RabbitListenerが属性を持っている:

/** 
* The bean name of the {@link org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory} 
* to use to create the message listener container responsible to serve this endpoint. 
* <p>If not specified, the default container factory is used, if any. 
* @return the {@link org.springframework.amqp.rabbit.listener.RabbitListenerContainerFactory} 
* bean name. 
*/ 
String containerFactory() default ""; 
関連する問題