持久化就是防止异常情况下的数据丢失,提高rabbitmq的可靠性。这里的异常主要说的就是重启,关闭,宕机等。根据我们近期学习的rabbitmq中有关消息的概念来说,消息要经过交换器、队列。因此我们的持久化就是针对交换器、队列和消息本身的。
1.交换器的持久化
对于经常使用的交换器来说,我们可以将交换器声明为durable参数为true,如果不声明,那么rabbitmq重启之后。相关的交换器元数据会丢失,但是消息不会丢失,只是消息不能发送到这个交换器中了。所以对于长久使用的交换器来说,我们最好设置其为持久化的。
代码语言:javascript复制 @Bean
public DirectExchange exchangeA() {
Map map=new HashMap<>();
//第二个参数就是是否持久化
return new DirectExchange("A",true,false,map);
}
2.队列持久化
保证其数据本身的元数据不因异常而丢失,但是并不能保证内部所存储消息不会丢失。
代码语言:javascript复制@Bean
public Queue directTwoQueue()
Map map=new HashMap<>();
//第二个参数为是否持久化
return new Queue("EEE",true,false,false,map);
}
3.消息的持久化
要确保消息不会丢失,就需要将其设置为持久化的。在之前我们学习过deliveryMode,其值为2的时候表示消息持久化,1表示非持久化。
代码语言:javascript复制byte[] body = JSON.toJSONBytes(message, SerializeConfig.globalInstance);
MessageProperties messageProperties = new MessageProperties();
messageProperties.setMessageId(UUID.randomUUID().toString());
messageProperties.setContentType(MediaType.APPLICATION_JSON_VALUE);
//设置消息持久化
messageProperties.setDeliveryMode(MessageDeliveryMode.PERSISTENT);
return new Message(body, messageProperties);
综合上述,严密的消息消息服务都应该设置持久化,持久化的顶层是消息的持久化,底层是队列持久化和交换器持久化,如果底层非持久化,那么上层持久化就没有什么意义!但是设置持久化必然对系统的性能有所影响。