JMS(Java Message Service)即 Java 消息服务应用程序接口,是一个 Java 平台中关于面向消息中间件(MOM)的 API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java 消息服务是一个与具体平台无关的 API,绝大多数 MOM 提供商都对JMS 提供支持。
简短来说,JMS 是一种与厂商无关的 API,是 sun 公司为了统一厂商的接口规范,而定义出的一组api接口,用来访问消息收发系统消息。它类似于 JDBC(Java Database Connectivity),提供了应用程序之间异步通信的功能。
JMS(Java Message Service)是Java语言提供的用于构建面向消息的应用程序的API标准。它定义了一套用于发送、接收和管理消息的API规范,使得开发者可以使用统一的方式与不同的消息中间件进行交互。
- 消息模型: JMS采用了基于消息的异步通信模型。在JMS中,消息由生产者(Producer)发送到消息中间件(Message Broker),然后由消费者(Consumer)从中间件接收和处理消息。这种模型解耦了生产者和消费者之间的直接依赖关系,提供了更灵活、可靠的消息传递方式。
- JMS消息类型: JMS定义了不同类型的消息,包括文本消息(TextMessage)、字节消息(BytesMessage)、对象消息(ObjectMessage)、映射消息(MapMessage)等。开发者可以根据实际需求选择合适的消息类型来发送和接收消息。
- JMS队列(Queue)和主题(Topic): JMS提供了两种主要的消息传递模型:点对点(Point-to-Point)和发布/订阅(Publish/Subscribe)。在点对点模型中,消息被发送到一个队列,并由一个消费者接收和处理;而在发布/订阅模型中,消息被发送到一个主题,并可以由多个消费者订阅并接收。
- 连接工厂(ConnectionFactory): 在使用JMS API之前,需要通过连接工厂来创建一个JMS连接。连接工厂负责与消息中间件建立连接,并提供了创建会话(Session)和目的地(Destination)的方法。
- 会话(Session): 会话是JMS的核心对象之一,用于创建生产者、消费者以及发送和接收消息。会话可以是事务性的或非事务性的,开发者可以根据需求选择合适的模式。
- 目的地(Destination): 目的地表示消息发送和接收的位置,它可以是队列(Queue)或主题(Topic)。生产者将消息发送到目的地,消费者从目的地接收消息。
- 消息监听器(MessageListener): JMS支持使用消息监听器来异步接收和处理消息。开发者可以实现一个消息监听器接口,在接收到消息时自动触发相应的处理逻辑。
- 事务管理: JMS支持事务处理,开发者可以在会话中启用事务,并使用提交(commit)或回滚(rollback)操作来管理消息的发送和接收过程。
Java Message Service (JMS) 是一个用于在 Java 应用程序中发送、接收和处理消息的 API。它是一种异步通信机制,允许应用程序之间解耦并能够实现消息传递。以下是 JMS 架构的详细解析。
jms组件
Java Message Service (JMS) 是一个用于在 Java 应用程序中发送、接收和处理消息的 API。它是一种异步通信机制,允许应用程序之间解耦并能够实现消息传递。
JMS 定义了一种消息通信的标准,主要用于企业级应用的异步消息传递。通过 JMS,应用程序可以将消息发送到消息队列或主题,从而实现异步处理和负载均衡。
2. JMS 组件
JMS 架构主要包括以下几个组件:
消息生产者(Producer):负责创建并发送消息到目的地(Queue 或 Topic)。
消息消费者(Consumer):从目的地接收消息并处理。
目的地(Destination):
队列(Queue):用于点对点(Point-to-Point)通信,消息发送到队列后,只有一个消费者可以接收。
主题(Topic):用于发布-订阅(Publish-Subscribe)模式,消息发送到主题后,所有订阅了该主题的消费者都可以接收到消息。
消息:包含应用程序需要交换的信息,消息可以是文本、对象、字节数组等。
3. JMS 消息类型
JMS 定义了几种消息类型,主要包括:
TextMessage:包含文本数据的消息。
ObjectMessage:可以包含 Java 对象的消息。
BytesMessage:包含字节流数据的消息。
MapMessage:包含键值对的消息。
StreamMessage:包含可读写的流数据的消息。
4. JMS 消息模型
JMS 支持两种主要的消息传递模型:
点对点(Point-to-Point)模型:
使用队列作为目的地。
每条消息仅被一个消费者处理。
提供了可靠的消息传递机制,可以确保消息不会丢失。
发布-订阅(Publish-Subscribe)模型:
使用主题作为目的地。
消息可以被多个消费者接收。
适用于需要广播消息的场景。
5. JMS 的优点
解耦:生产者和消费者可以独立开发和部署,减少了系统之间的依赖关系。
异步处理:允许消息在后台处理,提高了应用程序的响应能力。
可扩展性:支持高并发和高负载的消息处理。
可靠性:通过持久性消息机制,确保消息在网络故障或系统崩溃时不会丢失。
6. JMS 使用流程
创建连接:生产者和消费者都需要创建到消息服务提供者的连接。
创建会话:通过连接创建会话,负责发送和接收消息。
创建目的地:根据需要创建队列或主题。
创建生产者和消费者:分别用于发送和接收消息。
发送和接收消息:通过生产者发送消息,消费者接收并处理消息。
关闭资源:完成操作后,关闭会话和连接。
7. 常见的 JMS 实现
一些流行的 JMS 提供者包括:
Apache ActiveMQ:开源的消息中间件,广泛使用,支持多种协议。
RabbitMQ:支持多种消息协议,尤其适合微服务架构。
IBM MQ:企业级消息中间件,提供高可用性和可靠性。
Apache Kafka:高吞吐量的分布式消息系统,适合大数据场景。
8. 总结
JMS 提供了一种强大的消息传递机制,使得 Java 应用程序之间能够高效、可靠地进行通信。通过理解 JMS 的架构和组件,开发者可以更好地利用这一技术构建高效的企业应用。
JMS和AMQP的区别
JMS(Java Message Service)和AMQP(Advanced Message Queuing Protocol)是两种用于消息传递的技术,但它们在设计理念和使用场景上有一些区别:
协议与API:
JMS 是Java平台上的一种API,主要用于在Java应用程序之间发送和接收消息。它并不是一个协议,而是一个接口规范。
AMQP 是一个开放的消息传递协议,旨在支持各种编程语言和平台之间的消息交换。它定义了一种标准的消息格式和消息队列的行为。
语言支持:
JMS 主要支持Java语言,虽然有一些第三方实现可以在其他语言中使用,但核心是为Java设计的。
AMQP 则支持多种编程语言,如Python、C#、Ruby等,适用于多种平台。
消息传递模式:
JMS 提供了点对点和发布/订阅两种消息传递模型,允许开发者根据需求选择合适的模式。
AMQP 也支持类似的模式,但其设计更加灵活,支持复杂的路由和消息传递策略。
实现与应用:
JMS 通常与Java EE应用服务器(如Apache ActiveMQ)紧密集成,适合企业应用。
AMQP 被广泛应用于各种消息中间件(如RabbitMQ),并且可以在分布式系统中有效使用。
事务支持:
JMS 允许在消息发送和接收之间进行事务处理,以确保消息的可靠性。
AMQP 也支持事务,但其实现可能更加复杂,支持更高层次的消息确认机制。
总的来说,JMS更适合Java环境,而AMQP则提供了更广泛的跨语言支持和灵活性,选择哪种技术取决于具体的应用需求和环境。
Spring集成Java Message Service (JMS)
下面是一个使用Spring集成Java Message Service (JMS) 的基本示例,展示如何配置和使用JMS来发送和接收消息。我们将使用Apache ActiveMQ作为消息中间件。
- Maven依赖
首先,确保在你的pom.xml中添加以下依赖:
<dependencies>
<!-- Spring JMS -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>5.3.20</version>
</dependency>
<!-- ActiveMQ -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-spring-boot-starter</artifactId>
<version>2.6.0</version>
</dependency>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
- Spring Boot配置
创建一个配置类来设置JMS连接工厂和模板:
import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.core.JmsTemplate;
@Configuration
@EnableJms
public class JmsConfig {
@Bean
public ActiveMQConnectionFactory connectionFactory() {
return new ActiveMQConnectionFactory("tcp://localhost:61616");
}
@Bean
public JmsTemplate jmsTemplate(ActiveMQConnectionFactory connectionFactory) {
return new JmsTemplate(connectionFactory);
}
}
- 发送消息的服务
创建一个服务类来发送消息:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Service;
@Service
public class MessageSender {
@Autowired
private JmsTemplate jmsTemplate;
public void sendMessage(String queue, String message) {
jmsTemplate.convertAndSend(queue, message);
}
}
- 接收消息的监听器
创建一个监听器来接收消息:
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
@Component
public class MessageListener {
@JmsListener(destination = "myQueue")
public void receiveMessage(String message) {
System.out.println("Received message: " + message);
}
}
5. 启动类
创建一个启动类来运行Spring Boot应用:
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class JmsApplication {
public static void main(String[] args) {
SpringApplication.run(JmsApplication.class, args);
}
@Bean
CommandLineRunner run(MessageSender messageSender) {
return args -> {
messageSender.sendMessage("myQueue", "Hello, JMS!");
};
}
}
- 运行程序
确保你的ActiveMQ服务器正在运行,然后启动Spring Boot应用。你应该会看到控制台输出:
Received message: Hello, JMS!
7996

被折叠的 条评论
为什么被折叠?



