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
?
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