关注与消息的发送和接收,利用高效可靠的异步消息传递机制,集成分布式系统的软件。java
JMS(JAVA Message Service) java消息服务, 是一个java平台中关于面向消息中间件的API, 用于在两个应用程序之间或分布式系统中发送消息, 进行异步通讯。注:它仅仅是一种规范。
JMS 容许应用程序组件基于JavaEE平台建立、发送、接收和读取消息。它使分布式通讯耦合度更低,消息服务更加可靠以及异步性。在J2EE架构模式中,有消息服务者模式,用于实现消息与应用直接的解耦。服务器
JMS天生就是异步的,客户端获取消息的时候,不须要主动发送请求,消息会自动发送给可用的客户端。
JMS保证消息只会递送一次。你们都遇到太重复建立消息问题,而JMS能帮你避免该问题。架构
提供者:实现JMS规范的消息中间件服务器。
客户端:发送或接收消息的应用程序。
生产者/发布者:建立并发送消息的客户端。
消费者/订阅者:接收并处理消息的客户端。
消息:应用程序之间传递的数据内容。
消息模式:在客户端之间传递消息的方式,JMS中定义了主题和队列两种模式。并发
ConnectionFactory:用于建立链接到消息中间件的链接工厂。
Connection:表明了应用程序和消息服务器之间的通讯链路。
Destination:指消息发布和接收的地点,包括队列或主题。
Session:表示一个单线程的上下文,用于发送和接收消息。
MessageConsumer:由会话建立,用于接收发送到目标的消息。
MessageProducer:由会话建立,用于发送消息到目标。
Message:是在消费者和生产者之间传送的对象,消息头,一组消息属性,一个消息体。异步
接口的关系如图:工厂建立一个链接,链接建立一个会话,会话中包含消息,会话建立发送者和接收者。
分布式
消息模型:在JMS标准中,有两种消息模型P2P(Point to Point),Publish/Subscribe(Pub/Sub)。编码
P2P模式:
线程
P2P模式包含三个角色:消息队列(Queue),发送者(Sender),接收者(Receiver)。每一个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到他们被消费或超时。中间件
P2P的特色:
每一个消息只有一个消费者(Consumer)(即一旦被消费,消息就再也不在消息队列中)。
发送者和接收者之间在时间上没有依赖性,当发送者发送了消息以后,无论接收者有没有正在运行,它不会影响到消息被发送到队列。
接收者在成功接收消息以后需向队列应答成功 ,若是但愿发送的每一个消息都会被成功处理的话,那么须要P2P模式。对象
Pub/Sub模式:
包含主题(Topic),发布者(Publisher),订阅者(Subscriber),多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。
Pub/Sub的特色:
每一个消息能够有多个消费者。
发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须建立一个订阅者以后,才能消费发布者的消息。
为了消费消息,订阅者必须保持运行的状态。为了缓和这样严格的时间相关性,JMS容许订阅者建立一个可持久化的订阅。这样,即便订阅者没有被激活(运行),它也能接收到发布者的消息。
若是但愿发送的消息能够不被作任何处理、或者只被一个消息者处理、或者能够被多个消费者处理的话,那么能够采用Pub/Sub模型。
在JMS中,消息的产生和消费都是异步的。对于消费来讲,JMS的消息者能够经过两种方式来消费消息。
同步
订阅者或接收者经过receive方法来接收消息,receive方法在接收到消息以前(或超时以前)将一直阻塞;
异步
订阅者或接收者能够注册为一个消息监听器。当消息到达以后,系统自动调用监听器的onMessage方法。
JMS消息头预约义了若干字段用于客户端与JMS提供者之间识别和发送消息,预编译头以下:
– JMSDestination
– JMSDeliveryMode
– JMSMessageID
– JMSTimestamp
– JMSCorrelationID
– JMSReplyTo
– JMSRedelivered
– JMSType
– JMSExpiration
– JMSPriority
咱们能够给消息设置自定义属性,这些属性主要是提供给应用程序的。对于实现消息过滤功能,消息属性很是有用,JMS API定义了一些标准属性,JMS服务提供者能够选择性的提供部分标准属性。
消息体中,JMS API定义了五种类型的消息格式,不一样的消息类型以下:
Text message : javax.jms.TextMessage:表示一个文本对象。
Object message : javax.jms.ObjectMessage:表示一个JAVA对象。
Bytes message : javax.jms.BytesMessage:表示字节数据。
Stream message : javax.jms.StreamMessage:表示java原始值数据流。
Map message : javax.jms.MapMessage:表示键值对。
JMS消息监听器是消息的默认事件处理者,他实现了MessageListener接口,该接口包含一个onMessage方法,在该方法中须要定义消息达到后的具体动做。经过调用setMessageListener方法咱们给指定消费者定义了消息监听器。
要使用Java消息服务,你必需要有一个JMS提供者,管理会话和队列。如今既有开源的提供者也有专有的提供者。 开源的提供者包括:ActiveMQ、Kafka、WebMethods、阿里的RocketMQ等。