2016-04-01 23 views
1

Yeniden deneme işlevini (tüketicide bir sorun olduğunda) 3 kez uygulamak istiyorum ve mesaj başka bir sıraya (ölü mektup değişimi) gitmelidir. Ben aşağıdaki gibi kuyruk/alışverişini yapılandırmıştavsiye zinciri Çalışmıyor

düzenli mesaj alışverişi ismi: test_dlq_exchange ölü ileti sırası: test_queue test_queue bağlamak

ölü mektup değiş adı anahtar test_queue yönlendirme ile test_exchange için: ileti sırası test_exchange test_dlq_queue RabbitMQ UI konsolunda anahtar test_dlq_queue

yönlendirme ile test_dlq_exchange için test_dlq_queue bağlamak, ben "test_exchange"

olarak "x-ölü harfli-alışverişi" yapılandırmış

Aşağıda sadece benim MessageObject vardır Benim özel ileti dinleyici POJO İleti tahrik edilmektedir SimpleMessageListenerContainer

@Bean 
    SimpleMessageListenerContainer getMessageListenerContainer(){ 
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
    container.setConnectionFactory(connectionFactory); 
    container.setQueueNames("test_queue"); 

    MessageListenerAdapter adapter = new MessageListenerAdapter(); 
    //configured my message listener class 
    //configured Jackson2JsonMessageConverter as converter 
    container.setMessageListener(adapter); 
    container.setAdviceChain(new Advice[] {retryAdvice()} 
    return container; 
    } 

    //configuration for retryAdvice 

    @Bean 
    public MethodInterceptor retryAdvice{ 

     ExponentialBackOffPolicy backoffPolicy = new ExponentialBackOffPolicy(); 
     backoffPolicy.setInitialInterval(10); 
     backoffPolicy.setMaxInterval(1000); 
     backoffPolicy.setMultiplier(2); 
     RabbitTemplate retryTemplate = new RabbitTemplate(connectionFactory()); 
     retryTemplate.setQueue("test_dl_queue"); 
     return RetryInterceptorBuilder 
        .stateful() 
        .backOffPolicy(backoffPolicy) 
        .maxAttempts(3) 
        .recoverer(
         new RepublishMessageRecoverer 
         (retryTemplate,"test_dl_exchange","test_queue")).build(); 
    } 

kodudur.

Durum bilgisi kullanıyorum beri, createMessageIds (true) özelliğini etkinleştirdim. Mesaj dinleyicimde targetobject'in yöntemini tekrar başlatıyorum. Konteynırı başlattıktan sonra, akış döngüsel olarak

'a gidecektir. İletiyi sıraya yayınla -> Mesaj dinleyicisi çağrısı bazı istisnalara dayanarak hedef yöntemdir -> mesajı tekrar sıraya yayınlıyor -> mesaj dinleyicisi çağırması'nın hedef yöntemi ... vb. Bu mesajı ölü mektup değişimi/kuyruğa itmemek ve sonsuz döngüye gitmek değildir. Bazı biri bana bu sorunu gidermek için yardımcı olabilir

 o.s.r.i.StatefulRetryOperationsInterceptor - Executing proxied method in stateful retry public abstract void org.springframework.amqp.rabbitlistener.SimpleMessageListenerContainer$ContainerDelegate.invokeListener(Channel,Message) throws java.lang.Exception(55435ee) 

aşağıda bakınız günlüğünde

?

cevap

0

RepublishMessageRecoverer'u kullandığınızdan, aracı üzerinde bir DLX/DLQ yapılandırması hiçbir şey yapmaz. DLQ'ya yönlendirmek için, bir RejectAndDontRequeueRecover'a ihtiyacınız vardır - yeniden denemeler bittiğinde, mesaj DLX/DLQ'ya gönderilecektir. Aynı kuyrukta Dolayısıyla

(retryTemplate,"test_dl_exchange","test_queue")) 

sonsuz döngü için yeniden yayınlama gibi

görünüyor.

+0

Teşekkürler Gary. RejectAndDontRequeueRecoverer'ı ekledikten sonra iyi çalışıyor. Artık maksimum deneme girişimlerine ulaştıktan sonra mesajı DLQ'ya taşır. – Raja