簡體   English   中英

RabbitListener異常不將消息發送到死信隊列

[英]RabbitListener Exception do not send message to dead letter queue

我在Spring Boot應用程序中有一個RabbitListener,它會在發生異常時重試並將消息發送到死信隊列。 但是,如果在我的消息偵聽器上發生一個特定的異常,我不希望重試該異常並進入死信隊列,但是我仍然希望事務回滾。 有沒有辦法做到這一點?

如下面的代碼所述,我嘗試捕獲異常,但使用者重新啟動。 如果拋出AmqpRejectAndDontRequeueException消息,將不會重試該消息,但最終將導致死信隊列

這是我的偵聽器方法:

    @RabbitListener(queues = "#{T(com.myproject.RabbitBinding).PROCESS_MESSAGE.getQueue()}")
    public void onMessage(MyMessage message)
    {
        if (log.isDebugEnabled())
        {
            log.debug("Received message: {}", message);
        }

        try
        {
            process.run(message);
        }
        catch (IllegalStateException e)
        {
            log.error("Exception occured: e", e);
        }

每當我捕獲到異常時,它都會輸出異常,但是由於我看到以下消息,使用者重新啟動:

org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer $ AsyncMessageProcessingConsumer killOrRestart

這是我的兔子配置:

    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(
            Jackson2JsonMessageConverter messageConverter,
            RetryAdviceChainFactory deadLetterRetryAdviceChainFactory,
            PlatformTransactionManager transactionManager)
    {
        final SimpleRabbitListenerContainerFactory cf = new SimpleRabbitListenerContainerFactory();
        cf.setConnectionFactory(connectionFactory);
        cf.setConcurrentConsumers(rabbitConcurrentConsumers);
        cf.setErrorHandler(defaultErrorHandler);
        cf.setAdviceChain(deadLetterRetryAdviceChainFactory.createDefaultRetryChain());
        cf.setChannelTransacted(true);
        cf.setTaskExecutor(taskExecutor);
        cf.setMessageConverter(messageConverter);
        cf.setTransactionManager(transactionManager);
        return cf;
    }
    @Bean
    protected RetryAdviceChainFactory deadLetterRetryAdviceChainFactory(
            MessageRecoverer deadLetterMessageRecoverer)
    {
        RetryAdviceChainFactory factory = new RetryAdviceChainFactory();
        factory.setMessageRecoverer(deadLetterMessageRecoverer);
        return factory;
    }

引發InstantAcknowledgeAmqpException。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM