【发布时间】:2016-09-09 22:42:30
【问题描述】:
我正在执行以下步骤:
- MessageListener 从队列 Q1 接收消息
- 验证消息
- 如果验证失败,调用 channel.basicReject() 并将其移至死信队列
- 否则,可以说,电子邮件服务器出现故障。我用 requeue true 调用 channel.basicReject() 并抛出异常。它进入重试模板并在 maxAttempts 之后被恢复(RepublishMessageRecoverer)并进入死信队列。
但它不会从 Q1 中删除消息。
public void onMessage(Message message, Channel channel) throws Exception {
try {
validateMessage();
processMessage(message);
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
}
catch (DataValidationException ex){
channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
}
catch(DownstreamAppException ex) {
channel.basicReject(message.getMessageProperties().getDeliveryTag(),true);
throw ex;
}
}
void validMessage() {
..
throw new DataValidationException();
}
void processMessage() {
...
throw new DownstreamAppException();
}
我不想重新排队验证失败的消息,但想重新排队由于某些下游应用程序失败而未处理的消息以进行重试。
几个问题: 1.如果我在DownstreamAppException的catch中没有抛出异常,消息不会去抛出retryTemplate和recoverer。是因为重新排队被拒绝的消息是一条新消息吗?
- 为什么消息没有从 Q1 中删除?我该如何解决?
谢谢
【问题讨论】:
标签: rabbitmq spring-amqp spring-rabbit