学习笔记(21)消息队列
上表有一处问题,其中rabbitMQ也支持分布式。
本项目选rabbitMQ的原因:1 性能高 2 支持高级队列协议
每个服务建立一个长TCP连接,连接里有通道。
连接好处,一但服务器突然宕机,MQ能及时感知,不再给该服务器发消息。
在MQ里开小MQ,每个Vhost是隔离的,相当于一个镜像,另一个镜像。
direct是点对点模式,其它是发布订阅模式。
headers和topic模式一样,topic决定发给谁由路由件决定,但headers模式由消息头里某个字段决定,性能低,还需要拿到消息头的某个字段分析。
ACK模式:拿到队列中的消息后并移除。
NACK模式:拿到队列中的消息不移除。
自动注入rabbitTemplateConfigurer。
/**
* 使用RabbitMQ的步骤
* 1)、导入amqp-starter
* 2)、编写自动配置 RabbitAutoConfiguration;RabbitProperties
* 3)、开启RabbitMQ功能
*
* 自动配置了RabbitTemplate
*/
/**
* 自定义RabbitMQ的MessageConverter
* @return
*/
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
/**
* 方法上可以写以下参数
* 1、org.springframework.amqp.core.Message:既能获取到消息的内容字节,还能获取到消息的其他属性
* 2、 User user:如果明确我们这个队列以后都是这个类型对象,直接写这个类型参数
* 3、com.rabbitmq.client.Channel:通道;
*
* 以上无任何顺序,也无数量限制
*/
// @RabbitListener(queues = {"world"})
// public void receiveUserMessage(Message message, User user, Channel channel) throws IOException {
// System.out.println("收到的消息是:"+message.getClass());
// //byte[] body = message.getBody();
// //MessageProperties messageProperties = message.getMessageProperties();
// System.out.println("收到的消息是:"+user);
//
// //拒绝:可以把消息拒绝调,让 rabbitmq 再发给别人。
// channel.basicReject(message.getMessageProperties().getDeliveryTag(),true);
//
// }
AmqpAdmin自动创建队列,交换机,绑定关系
//通过配置类自动创建队列
@Configuration
public class MyRabbitConfig {
/**
* 如果RabbitMq没有这个队列、交换机、绑定关系会自动创建。
* @return
*/
@Bean
public Queue helloQueue(){
return new Queue("order-queue",true,false,false,null);
}
@Bean
public Exchange orderExchange(){
return new DirectExchange("order-exchange",true,false,null);
}
@Bean
public Binding orderbinding(){
return new Binding("order-queue", Binding.DestinationType.QUEUE,
"order-exchange","creatOrder",null);
}
/**
* 其他都一样。。。
*/
}