按照网上的图文分析:知道rabbitmq中有一些高级的特性,主要就是消费时的消费模式,消息持久化,以及事务性消息这三个高级特性
消息的消费模式分为: 推 拉 这两种模式
推: 就是消息存储在队列时,队列会将消息都推送给消费进行消费 没有多大的时间间隔 现在高版本中的其实就是默认采用推模式的
//如下就是一个推模式
rabbitTemplate.convertAndSend("exchange", "testDirectRouting", "消息序号:" + i);
拉: 就是消费者在进行消息消费时,它会确认消费者是否接受到消息,确认接收到了才会拉取下一条消息
//以下就是默认采用拉模式来进行消息消费的
rabbitTemplate.convertSendAndReceive("exchange", "testDirectRouting", "消息序号:" + i);
相比于队列,交换机的持久是在声明时规定好的,消息持久化也是在message中定义好的
//主要是将消息存储在body中的
Message message = MessageBuilder.withBody("我们发送的消息内容存放在message的body里面".getBytes()).build();
//将消息的deLiveryMode设置为持久与永久的
message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
rabbitTemplate.setChannelTransacted(true);
事务性消息 其实就是在声明RabbitTemplate时只需要将其的设置为true即可
//就是这么简单
rabbitTemplate.setChannelTransacted(true);
注意点:就是guest账号只能使用localhost连接 使用IP地址会报没有权限的错误
消息堆积感觉这很开放,特别是在我们前面了解了rabbitmq中的很多特性以后
其实消息堆积无非就是生产者的生产速度远大于消费者的消费速度,既然我们知道是什么原因导致,我们可以分别从生产者与消费者两个角度来分析问题
生产者:例如采取强制性的确认机制,这样可以减少生产者的生产速度
消费者:采取推模式进行消费,而不是一条一条的进行消费 采取Fanout模式的交换机,利用ttl特性对消息进行时间的设置,使其进入死信队列中去,无需对消息进行确认
对消费者中的属性根据业务进行设置,主要代码如下:这部分代码主要就是在消费端进行设置的
/**
* 这是设置消息监听类
* @return
*/
@Bean
public SimpleMessageListenerContainer simpleMessageListenerContainer(){
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cachingConnectionFactory);
container.setConcurrentConsumers(1); //设置当前消费者数量
container.setPrefetchCount(6); //设置每次从队列中拉取消息的数量
container.setMaxConcurrentConsumers(1);
container.setAcknowledgeMode(AcknowledgeMode.MANUAL); //设置当前的消费者确认为手动的,rabbit默认的是自动的
container.setQueueNames("topic.women", ""); //将队列注入到listenerContainer中去
container.setMessageListener(messageListener); //将消息监听类注入到容器中去
return container;
}