0

Spring Boot Rabbit のデッド レター キューを設定しましたが、ErrorHandler はメッセージを受け取りません。配信不能キューに関するすべての質問を検索しましたが、わかりませんでした。誰でも私を助けることができますか?

デッド レター キュー/交換を設定する RabbitConfig.java:

@Configuration
public class RabbitConfig {

public final static String MAIL_QUEUE = "mail_queue";

public final static String DEAD_LETTER_EXCHANGE = "dead_letter_exchange";

public final static String DEAD_LETTER_QUEUE = "dead_letter_queue";

public static Map<String, Object> args = new HashMap<String, Object>();

static {
    args.put("x-dead-letter-exchange", DEAD_LETTER_EXCHANGE);
    //args.put("x-dead-letter-routing-key", DEAD_LETTER_QUEUE);
    args.put("x-message-ttl", 5000);
}

@Bean
public Queue mailQueue() {
    return new Queue(MAIL_QUEUE, true, false, false, args);
}

@Bean
public Queue deadLetterQueue() {
    return new Queue(DEAD_LETTER_QUEUE, true);
}

@Bean
public FanoutExchange deadLetterExchange() {
    return new FanoutExchange(DEAD_LETTER_EXCHANGE);
}

@Bean  
public Binding deadLetterBinding() {  
    return BindingBuilder.bind(deadLetterQueue()).to(deadLetterExchange());  
}  

}

DEAD LETTER QUEUE を処理する ErrorHandler.java:

@Component
@RabbitListener( queues = RabbitConfig.DEAD_LETTER_QUEUE)
public class ErrorHandler {

@RabbitHandler
public void handleError(Object message) {
    System.out.println("xxxxxxxxxxxxxxxxxx"+message);
}

}

MAIL_QUEUE を処理するための MailServiceImpl.java:

@Service
@RabbitListener(queues = RabbitConfig.MAIL_QUEUE)
@ConditionalOnProperty("spring.mail.host")
public class MailServiceImpl implements MailService {

@Autowired
private JavaMailSender mailSender;

@RabbitHandler
@Override
public void sendMail(TMessageMail form) {
    //......
    try {
       mailSender.save(form);
    }catch(Exception e) {
        logger.error("error in sending mail: {}", e.getMessage());
        throw new AmqpRejectAndDontRequeueException(e.getMessage());
    }
}
}
4

1 に答える 1

1

thx 神よ、ついに答えが見つかりました!

すべての構成は正しいですが、問題は、配信不能キューを構成する前に、mail_queue などのすべてのキューが作成されることです。そのため、キューが作成された後にキューに x-dead-letter-exchange を設定しても、有効になりません。

中文では、修正リストのパラメーターの後に、リストの再構築を削除する必要があります。

キューを削除する方法は、答えに従います。 RabbitMQ でのキューの削除

于 2017-11-20T00:19:13.840 に答える