Spring RabbitTemplate接收消息并重新查询

Spring RabbitTemplate接收消息并重新查询,spring,rabbitmq,amqp,spring-amqp,spring-rabbit,Spring,Rabbitmq,Amqp,Spring Amqp,Spring Rabbit,我的问题与此非常相似: 不幸的是,它已被标记为已回答,尽管答案不适合我的需要 我想模仿Rabbit Admin UI的功能,也就是说,我想同步读取队列中的消息,但不希望队列丢失消息,比如说,有点像偷看 这里的答案建议使用一个侦听器,但在这种情况下,它将无限期地读取和重新查询。我只想获取并重新查询消息一次,所以我想我应该使用rabbitmplate,而不是侦听器。类peek实现ChannelCallback{ class Peeker implements ChannelCallback<M

我的问题与此非常相似: 不幸的是,它已被标记为已回答,尽管答案不适合我的需要

我想模仿Rabbit Admin UI的功能,也就是说,我想同步读取队列中的消息,但不希望队列丢失消息,比如说,有点像偷看

这里的答案建议使用一个侦听器,但在这种情况下,它将无限期地读取和重新查询。我只想获取并重新查询消息一次,所以我想我应该使用rabbitmplate,而不是侦听器。

类peek实现ChannelCallback{
class Peeker implements ChannelCallback<Message> {

    final MessagePropertiesConverter propertiesConverter = new DefaultMessagePropertiesConverter();

    @Override
    public Message doInRabbit(Channel channel) throws Exception {
        GetResponse result = channel.basicGet("someQ", false);
        if (result == null) {
            return null;
        }
        channel.basicReject(result.getEnvelope().getDeliveryTag(), true);
        return new Message(result.getBody(), propertiesConverter.toMessageProperties(
                result.getProps(), result.getEnvelope(), "UTF-8"));
    }
}
Peeker peeker = new Peeker();


...


Message peek = this.rabbitTemplate.execute(peeker);
final MessagePropertiesConverter propertiesConverter=新的默认MessagePropertiesConverter(); @凌驾 公共消息doInRabbit(通道)引发异常{ GetResponse result=channel.basicGet(“someQ”,false); 如果(结果==null){ 返回null; } channel.basicject(result.getEnvelope().getDeliveryTag(),true); 返回新消息(result.getBody(),propertiesConverter.toMessageProperties( result.getProps(),result.getEnvelope(),“UTF-8”); } } Peek Peek=新Peek(); ... Message peek=this.rabbitmplate.execute(peek);
@GarryRussel,看起来不错。但是我如何才能获得N条消息(或所有消息)?我应该在循环中调用basicGet直到得到null吗?是的,您可以通过一次调用
basicNack
(而不是
BasicObject
)来拒绝它们-显然,将返回类型更改为
Collection
或类似类型。