2017-02-03 5 views
0

質問:一定量の再試行後、メッセージをエラーキューに送信して元のキューから消費したいと思います。私は多くの異なるメッセージを扱うので、ジェネリックな解決策を見つけたいと思います。 maxRetriesの後にSpringがトリガーするようにRecoveryCallbackを設定するにはどうすればよいですか?春のRabbitTemplateのsetRetryTemplateとsetRecoveryCallbackが無視されました

は、私は現在、
を何私はRetryTemplateRecoveryCallbackを設定してみてください。 アプリケーションを実行してメッセージをtestキューに発行すると、EListener#receiveの処理が3回失敗し、次に設定されたRecoveryCallbackがトリガーされ、コンテキストに基づいてメッセージが特定のエラーキューにルーティングされます。実際には、実際に何が起こる をどうなり

は春ブーツは私のように構成RabbitTemplate Beanを使用していないため、RabbitTemplate、自身の持つRabbitAdminオブジェクトを初期化していることです。

私は次のディレクトリ構造を持っている:

rabbit 
    |___ EListener.java 
    |___ Rabbit.java 
test 
    |___ Test.java 

私はRabbit.java

に次のコードを持って
@Configuration 
public class Rabbit { 

    @Autowired 
    ConnectionFactory connectionFactory; 

    @Bean 
    public RabbitTemplate rabbitTemplate() { 
     RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); 
     rabbitTemplate.setRetryTemplate(createRetryTemplate()); 
     rabbitTemplate.setRecoveryCallback(createRecoveryCallback()); 
     return rabbitTemplate; 
    } 

    createRecoveryCallback() // Omitted for brevity 
    createRetryTemplate() // Omitted for brevity 
} 

EListener.javaファイルが含まれています:

@Component 
public class EListener { 

    @Autowired 
    RabbitTemplate rabbitTemplate; 

    @RabbitListener(bindings = @QueueBinding(value = @Queue(value = "test", durable = "true"), exchange = @Exchange(value = "test", type = ExchangeTypes.TOPIC, durable = "true", autoDelete = "true"), key = "test")) 
    public void receive(Message m) throws Exception { 
     System.out.println(m); 
     throw new Exception(); 
    } 
} 

Test.javaは含まれています

RetryTemplateを追加210

答えて

0
@SpringBootApplication 
@ComponentScan("rabbit") 
public class Test { 

    public static void main(String[] args) { 
     new SpringApplicationBuilder(Test.class).application().run(args); 
    } 
} 

公開メッセージを再試行することです。

コンシューマ側で再試行を追加するには、リトライインターセプタをリスナーcontainer's advice chainに追加する必要があります。

@RabbitListenerを使用しているので、アドバイスチェーンはlistener container factory @Beanになります。つまり、ブートによって作成されたデフォルトのものに頼るのではなく、自分で宣言する必要があります。

ステートレスリトライは、メモリ内のリトライを行います。ステートフルリトライはメッセージを再キューします。 messageIdプロパティ(またはメッセージを一意に識別するその他のメカニズム)が必要です。

+0

デフォルトのリカバリとして現在使用されている 'RejectAndDontRequeueRecoverer'を置き換えることは可能ですか? – dparted

+0

残念ながらそうではありません。リカバリは[boot 'config'd retry interceptor]にハード配線されています(https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework)。 /boot/autoconfigure/amqp/SimpleRabbitListenerContainerFactoryConfigurer.java#L104)。あなたは自分のbeanを結ぶことができます(https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/)。 amqp/RabbitAnnotationDrivenConfiguration.java#L62)は、ブートのコンフィギュレーターを使用し、 'adviceChain'を独自のインターセプターで上書きします。 –

+0

それから私はそれをします。それを最初に持っていることは素晴らしいことです。助けてくれてありがとう。 – dparted

関連する問題