什么是MQ?
消息队列中间件,MQ通过消息的发送和接受来实现程序的异步和解耦,mq主要用于异步操作,这个不是mq的真正目的,只不过是mq的应用,mq真正的目的是为了通讯
MQ的应用场景?
支付业务、
常见的mq产品?
RabbitMQ、ActiveMQ、RocketMQ、KafKa
什么是AMQP协议模型?
是用于在应用程序之间传递业务的开放标准
rabbitmq支持哪些消息模式?
简单队列模型
任务工作模型
发布/订阅 模式:
广播模式
路由模式
主题模式
如何使用RabbitMQ收发消息?(基于SpringAMQP)?
1、双方引入SpringAMQP依赖
<!--AMQP依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
2、创建队列
3、创建消费者,监听队列
4、创建发送者,
如何项目中声明交换机、队列及绑定关系?
第一种通过Bean对象:
@Bean
public Queue queue1(){
return new Queue("fanout.queue1");
}
@Bean
public Queue queue2(){
return new Queue("fanout.queue2");
}
@Bean
public Binding fanoutQueueBinding1(Queue queue1,FanoutExchange fanoutExchange){
return BindingBuilder.bind(queue1).to(fanoutExchange);
}
@Bean
public Binding fanoutQueueBinding2(Queue queue2,FanoutExchange fanoutExchange){
return BindingBuilder.bind(queue2).to(fanoutExchange);
}
第二种通过注解:
@RabbitListener(bindings = @QueueBinding(
value = @Queue("fanout.queue1"),
exchange = @Exchange(name = "itcast.fanout",type = ExchangeTypes.FANOUT)
))
public void listenFanoutQueueMessage1(String msg){
System.err.println("listenFanoutQueueMessage1 消费者接收到消息:【" + msg + "】");
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue("fanout.queue2"),
exchange = @Exchange(name = "itcast.fanout",type = ExchangeTypes.FANOUT)
))
public void listenFanoutQueueMessage2(String msg){
System.err.println("listenFanoutQueueMessage2 消费者接收到消息:【" + msg + "】");
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue("queue1"),
exchange = @Exchange(name = "Direct",type = ExchangeTypes.DIRECT),
key = {"blue","red"}
))
public void listenDirectQueueMessage1(String msg){
System.err.println("listenDirectQueueMessage1 消费者接收到消息:【" + msg + "】");
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue("queue2"),
exchange = @Exchange(name = "Direct",type = ExchangeTypes.DIRECT),
key = {"yellow","red"}
))
public void listenDirectQueueMessage2(String msg){
System.err.println("listenDirectQueueMessage2 消费者接收到消息:【" + msg + "】");
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue("topic.queue1"),
exchange = @Exchange(name = "itcast.topic",type = ExchangeTypes.TOPIC),
key = {"china.#"}
))
public void listenTopicQueueMessage1(String msg){
System.err.println("listenTopicQueueMessage1 消费者接收到消息:【" + msg + "】");
}
@RabbitListener(bindings = @QueueBinding(
value = @Queue("topic.queue2"),
exchange = @Exchange(name = "itcast.topic",type = ExchangeTypes.TOPIC),
key = {"#.news"}
))
public void listenTopicQueueMessage2(String msg){
System.err.println("listenTopicQueueMessage2 消费者接收到消息:【" + msg + "】");
}
<br />消息转换器的作用?<br />Spring会把你发送的消息序列化为字节发送给MQ,接收消息的时候,还会把字节反序列化为Java对象。<br />只不过,默认情况下Spring采用的序列化方式是JDK序列化。众所周知,JDK序列化存在下列问题:
- 数据体积过大
- 有安全漏洞
- 可读性差
如何修改MQ默认的消息转换器?
1、引入依赖
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.9.10</version>
</dependency>
2、分别在生产者和消费者中的配置类里声明@Bean对象
消费者:
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
生产者:
@SpringBootApplication
public class PublisherApplication {
public static void main(String[] args) {
SpringApplication.run(PublisherApplication.class);
}
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
https://www.processon.com/view/link/62a735040e3e747c5c3ffeb9
MQ高级:
rabbitmq如何保证消息的可靠性?
rabbitmq如何解决百万消息堆积问题?
rabbitmq如何防止消息重复消费?
rabbitmq如何保证高可用?
rabbitmq消息的重试机制?
rabbitmq如何实现延迟消费?
rabbitmq在项目中的使用场景?
