RabbitMQ與Spring集成(二)

RabbitMQ與Spring集成(一)中,我們只是簡單的介紹了RabbitMQ與Spring的集成後,利用Direct、Fanout、Topic等模式發送消息。其實在介紹RabbitMQ時,我們還介紹了其更多的高級特性,如失敗通知、發送方確認、消息的確認與拒絕、持久化等等,這裏就來看看RabbitMQ在Spring環境中如何使用。


RabbitMQ消息發佈之發送方確認

在與Spring集成之後,RabbitMQ的發送方確認需要配置在CachingConnectionFactory之中,如下:
在這裏插入圖片描述


然後我們需要在RabbitTemplate來接受發送方確認的回調,如下:
在這裏插入圖片描述

@Component
public class ConfirmCallback implements RabbitTemplate.ConfirmCallback {
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        if (ack)
            System.out.println("成功");
        else
            System.out.println("失敗:" + cause);
    }
}



RabbitMQ消息發佈之失敗確認

失敗確認同樣也是需要在RabbitTemplate中進行配置,如下:
在這裏插入圖片描述

@Component
public class ReturnCallback implements RabbitTemplate.ReturnCallback {
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        String msg = new String(message.getBody(), CharsetUtil.UTF_8);
        System.out.println("replyText:" + replyText);
        System.out.println("exchange:" + exchange);
        System.out.println("routingKey:" + routingKey);
        System.out.println("message:" + msg);
    }
}



消息的持久化

我們在RabbitMQ消息的屬性中,曾介紹過消息的持久化,在進行消息的持久化的時候,必須將其交換器及隊列也進行持久化處理,所以首先我們先來看一下交換器即隊列的持久化,如下:
在這裏插入圖片描述

然後我們還需要在發送消息的時候,將消息也進行持久化處理,如下:
在這裏插入圖片描述




RabbitMQ消息應答

RabbitMQ消息應答中,我們介紹過消費者手動確認的模式,在Spring中首先我們需要在監聽容器將其設置爲手動確認如下:
在這裏插入圖片描述

然後我們消息監聽器在接受到消息後,就需要手動做出應答,之前都是藉助於信道channel來完成的,這裏也是一樣,不過之前我們實現的接口MessageListener提供的方法是拿不到channel的,所以之類我們需要修改下實現的接口,改爲ChannelAwareMessageListener,如下:

@Component
//public class DirectMsgAccept implements MessageListener{
public class DirectMsgAccept implements ChannelAwareMessageListener{

    /*@Override
    public void onMessage(Message message) {
        String msg = new String(message.getBody(), CharsetUtil.UTF_8);
        System.out.println(msg);
    }*/

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        try {
            String msg = new String(message.getBody(), CharsetUtil.UTF_8);
            System.out.println(msg);

            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章