文章目录
- 一,MQ基础
- 二,JMS和AMQP
-
- 1,二者区别
- 2,用法
-
- 使用Spring-JMS
- 使用Spring-Rabbit
- [Spring Boot自动配置](#Spring Boot自动配置)
一,MQ基础
-
在大多数应用中,可以通过消息服务中间件来提升系统的异步通信能力和扩展解耦能力。
-
消息服务中有两个重要概念:消息代理(message broker)和目的地(destination)。当消息发送者发送消息后,消息代理会接管消息,并确保消息传递到指定的目的地。
-
消息队列主要有以下两种形式的目的地:
- 队列(queue):用于点对点消息通信(point-to-point)。
- 主题(topic):用于发布/订阅消息通信(publish/subscribe)。
根据您提供的文件内容,这里是一段关于消息队列通信模式和相关技术的介绍,具体内容如下:
-
点对点式通信:
- 消息发送者发送消息,消息代理将其放入一个队列中。
- 消息接收者从队列中获取消息内容。
- 消息读取后被移出队列。
- 消息只有唯一的发送者和接收者,但并不是说只能有一个接收者。
-
发布订阅式通信:
- 发送者(发布者)发送消息到主题。
- 多个接收者(订阅者)监听(订阅)这个主题。
- 消息到达时,所有订阅者都会同时收到消息。
-
JMS(Java Message Service):
- 基于Java虚拟机(JVM)的消息代理规范。
- ActiveMQ、HornetMQ等是JMS的实现。
-
AMQP(Advanced Message Queuing Protocol):
- 高级消息队列协议,也是一个消息代理的规范。
- 兼容JMS。
- RabbitMQ是AMQP的实现。
根据您提供的文件内容,这是一个比较JMS(Java Message Service)和AMQP(Advanced Message Queuing Protocol)的表格。下面是表格的内容和解释:
特征/协议 | JMS(Java Message Service) | AMQP(Advanced Message Queuing Protocol) |
---|---|---|
定义 | Java API | 网络线级协议 |
跨语言 | 否 | 是 |
跨平台 | 否 | 是 |
Model | 提供两种消息模型: (1) Peer-2-Peer (2) Pub/sub | 提供了五种消息模型: (1) direct exchange (2) fanout exchange (3) topic exchange (4) headers exchange (5) system exchange 本质来讲,后四种和JMS的pub/sub模型没有太大差别, 仅是在路由机制上做了更详细的划分; |
支持消息类型 | 多种消息类型: TextMessage, MapMessage, BytesMessage, StreamMessage, ObjectMessage, Message(只有消息头和属性) | byte[] 当实际应用时,有复杂的消息,可以将消息序列化后发送。 |
综合评价 | JMS定义了JAVA API层面的标准;在java体系中, 多个client均可以通过JMS进行交互,不需要应用修改代码,但是其对跨平台的支持较差; | AMQP定义了wire-level层的协议标准;天然具有跨平台、跨语言特性。 |
根据您提供的文件内容,这是一段关于Spring框架对消息队列(MQ)的支持以及市场上常见的消息队列产品的介绍。以下是具体内容:
- Spring支持
spring-jms
提供了对 JMS 的支持。spring-rabbit
提供了对 AMQP 的支持。- 需要
ConnectionFactory
的实现来连接消息代理。 - 提供
JmsTemplate
、RabbitTemplate
来发送消息。 - 使用
@JmsListener
(JMS)、@RabbitListener
(AMQP)注解在方法上监听消息代理发布的消息。 - 使用
@EnableJms
、@EnableRabbit
开启对 JMS 和 AMQP 的支持。
- Spring Boot自动配置
JmsAutoConfiguration
:Spring Boot 自动配置 JMS。RabbitAutoConfiguration
:Spring Boot 自动配置 RabbitMQ。
- 市面的MQ产品
- 市面上常见的消息队列产品包括:
- ActiveMQ
- RabbitMQ
- RocketMQ
- Kafka
二,JMS和AMQP
1,二者区别
JMS(Java Message Service)和AMQP(Advanced Message Queuing Protocol)。
JMS
想象一下,你正在经营一家大型连锁咖啡店,你需要一个系统来管理来自各个门店的订单请求。在这个场景中,JMS就像是这家咖啡店内部使用的通信规范或规则手册,它规定了各个门店应该如何发送订单请求以及总部应该如何接收这些请求。
-
角色:
- 生产者:相当于门店发送订单请求。
- 消费者:相当于总部接收并处理这些订单请求。
- 消息中间件:相当于咖啡店内部的消息传递系统,比如RabbitMQ、ActiveMQ等。
-
特点:
- 平台独立性:就像在不同地区的门店都可以按照这套规则来发送订单。
- 抽象层:JMS提供了一组API,允许开发者以统一的方式编写消息传递的应用程序,而不必关心底层的消息中间件的具体实现。
AMQP
现在,想象你的咖啡店决定扩展业务,不仅要在本地使用这套系统,还要与其他合作伙伴共享这套订单管理系统。这时候,你需要一套更加开放的标准来保证不同系统之间能够顺畅沟通。AMQP就是这样一个标准,它是一种开放的协议,定义了消息如何在网络上传输。
-
角色:
- 生产者:依然相当于门店发送订单请求。
- 消费者:相当于总部或其他合作伙伴接收并处理这些订单请求。
- 消息中间件:相当于实现了AMQP协议的消息队列服务,比如RabbitMQ就是一个支持AMQP的中间件。
-
特点:
- 协议规范:AMQP定义了消息在网络上传输的具体格式和流程,确保不同的系统之间可以相互通信。
- 开放性和互操作性:就像你的咖啡店不仅可以与本地门店交流,还可以与其他城市的合作伙伴甚至国际上的合作伙伴交流。
联系
- 目的相同:两者都是为了实现分布式系统之间的消息传递。
- 依赖于消息中间件:都需要有一个消息中间件来作为消息的传递枢纽。
- 实现消息传递:都可以实现消息的发布/订阅模式或者点对点模式。
区别
-
适用范围:
- JMS:主要用于Java环境,提供了Java API,因此更适合Java应用程序。
- AMQP:是一个开放的协议,可以跨语言、跨平台使用,适用于更广泛的开发环境。
-
灵活性和扩展性:
- JMS:提供了一套固定的API接口,虽然简化了开发过程,但可能限制了一些高级功能的实现。
- AMQP:作为一个开放的协议,支持更多的特性和定制选项,可以更好地满足复杂需求。
2,用法
以下是一些示例代码,说明如何在Spring框架中使用spring-jms
和spring-rabbit
来支持JMS和AMQP消息队列,以及如何使用Spring Boot的自动配置功能。
使用Spring-JMS
- 配置ConnectionFactory :首先,您需要配置一个
ConnectionFactory
,这通常在XML配置文件或Java配置类中完成。
java
@Bean
public ConnectionFactory connectionFactory() {
// 配置ConnectionFactory,例如使用ActiveMQ
return new ActiveMQConnectionFactory(url, username, password);
}
- 配置JmsTemplate :使用
ConnectionFactory
创建JmsTemplate
。
java
@Bean
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
JmsTemplate template = new JmsTemplate(connectionFactory);
// 其他配置...
return template;
}
- 定义消息监听器 :使用
@JmsListener
注解定义监听特定目的地的方法。
java
@Component
public class MyMessageListener {
@JmsListener(destination = "myQueue")
public void receiveMessage(String message) {
// 处理接收到的消息
}
}
- 开启JMS支持 :在配置类上使用
@EnableJms
注解。
java
@Configuration
@EnableJms
public class JmsConfig {
// 配置类内容
}
使用Spring-Rabbit
- 配置ConnectionFactory :与JMS类似,首先配置
ConnectionFactory
。
java
@Bean
public ConnectionFactory rabbitConnectionFactory() {
// 配置RabbitMQ的ConnectionFactory
return new CachingConnectionFactory(host, port, username, password);
}
- 配置RabbitTemplate :使用
ConnectionFactory
创建RabbitTemplate
。
java
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
// 其他配置...
return template;
}
- 定义消息监听器 :使用
@RabbitListener
注解定义监听特定队列的方法。
java
@Component
public class MyRabbitListener {
@RabbitListener(queues = "myQueue")
public void handleMessage(String message) {
// 处理接收到的消息
}
}
- 开启RabbitMQ支持 :在配置类上使用
@EnableRabbit
注解。
java
@Configuration
@EnableRabbit
public class RabbitConfig {
// 配置类内容
}
Spring Boot自动配置
Spring Boot提供了自动配置功能,可以简化上述配置步骤。如果您使用的是Spring Boot,通常只需要添加相应的依赖并进行少量配置即可。
-
添加依赖 :在
pom.xml
或build.gradle
中添加Spring-JMS或Spring-Rabbit的依赖。 -
配置application.properties或application.yml:配置连接信息和目的地名称。
properties
# JMS配置示例
spring.jms.activemq.broker-url=tcp://localhost:61616
spring.jms.queue-names=myQueue
# RabbitMQ配置示例
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.queue=myQueue
- 使用自动配置 :Spring Boot会自动配置
ConnectionFactory
、JmsTemplate
或RabbitTemplate
等组件,并注册相应的监听器容器。