在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);
}
}
}