JMS简介:html
JMS即Java消息服务(Java Message Service)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通讯。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。java
定义:JMS(java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,而且经过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。JMS是一种与厂商无关的 API,用来访问消息收发系统消息。它相似于JDBC(Java DatabaseConnectivity):这里,JDBC 是能够用来访问许多不一样关系数据库的 API,而 JMS 则提供一样与厂商无关的访问方法,以访问消息收发服务.数据库
概念:网络
使用JMS 的应用程序被称为JMS 客户端,处理消息路由与传递的消息系统被称为JMS Provider,而JMS 应用则是由多个JMS 客户端和一个JMS Provider 构成的业务系统。发送消息的JMS 客户端被称为生产者(producer),而接收消息的JMS 客户端则被称为消费者(consumer)。同一JMS 客户端既能够是生产者也能够是消费者。session
基本概念数据结构
JMS是java的消息服务,JMS的客户端之间能够经过JMS服务进行异步的消息传输。负载均衡
消息模型异步
○ Point-to-Point(P2P) ○ Publish/Subscribe(Pub/Sub)
即点对点和发布订阅模型socket
P2P分布式
PTP(point-to-point)即点对点消息传输模型。PTP以下图所示:
咱们能够看到,一个或多个生产者发送消息,消息m2先抵达了queue,而后m1也发出了,并一同存在于一个先进先出的queue里面。消费者也存在一个或多个,对queue里的消息进行消费。但消息被随机的一个消费者消费且仅消费一次。
P2P的特色
若是你但愿发送的每一个消息都应该被成功处理的话,那么你须要P2P模式。
Pub/Sub
Pub/Sub的特色
若是你但愿发送的消息能够不被作任何处理、或者被一个消息者处理、或者能够被多个消费者处理的话,那么能够采用Pub/Sub模型
Queue与Topic的比较
1. JMS Queue执行load balancer语义
一条消息仅能被一个consumer收到。若是在message发送的时候没有可用的consumer,那么它讲被保存一直到能处理该message的consumer可用。若是一个consumer收到一条message后却不响应它,那么这条消息将被转到另一个consumer那儿。一个Queue能够有不少consumer,而且在多个可用的consumer中负载均衡。
2. Topic实现publish和subscribe语义
一条消息被publish时,他将发送给全部感兴趣的订阅者,因此零到多个subscriber将接收到消息的一个拷贝。可是在消息代理接收到消息时,只有激活订阅的subscriber可以得到消息的一个拷贝。
3. 分别对应两种消息模式
Point-to-Point(点对点),Publisher/Subscriber Model(发布/订阅者)
其中在Publicher/Subscriber模式下又有Nondurable subscription(非持久化订阅)和durable subscription(持久化订阅)两种消息处理方式。
消息的消费
在JMS中,消息的产生和消费是异步的。对于消费者来讲,JMS的消费者能够经过两种方式来消费消息。
○ 同步
订阅者或接收者调用receive方法来接收消息,receive方法在可以接收到消息以前(或超时以前)将一直阻塞
○ 异步
订阅者或接收者能够注册为一个消息监听器。当消息到达以后,系统自动调用监听器的onMessage方法。
MQ(JMS Provider)
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通讯方法。应用程序经过写和检索出入列队的针对应用程序的数据(消息)来通讯,而无需专用链接来连接它们.
JMS和MQ的关系:
JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程当中的全部数据结构和交互流程。而MQ则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者;MQ的实现能够基于JMS,也能够基于其余规范或标准。
支持JMS的开源MQ:
目前选择的最多的是ActiveMQ。
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个彻底支持JMS1.1和J2EE 1.4规范的 JMS Provider实现.
JMS接口API
流程以下:
发送端的标准流程是:建立链接工厂>建立链接>建立session>建立发送者>建立消息体>发送消息到Destination(queue或topic)。
接收端则为:建立链接工厂>建立链接>建立session>建立接收者>建立消息监听器监听某Destination的消息>获取消息并执行业务逻辑
接口简介:
顶级接口 |
P2P |
Pub/sub |
备注 |
ConnectionFactory |
QueueConnectionFactory |
TopicConnectionFactory |
基于工厂模式,建立和JMS提供者之间的连接,须要制定连接的URL或者协议;任何JMS客户端和JMS提供者之间的交互,都必须基于制定的链接. |
Destination |
Queue |
Topic |
“目的地”,用于描述消息的通道类型,是JMS提供者用于标记消息归属类型的”标记”. Destination的意思是消息生产者的消息发送目标或者说消息消费者的消息来源。对于消息生产者来讲,它的Destination是某个队列(Queue)或某个主题(Topic);对于消息消费者来讲,它的Destination也是某个队列或主题(即消息来源)。 因此,Destination实际上就是两种类型的对象:Queue、Topic |
Connection |
QueueConnection |
TopicConnection |
Connection表示在客户端和JMS系统之间创建的连接(对TCP/IP socket的包装)。Connection能够产生一个或多个Session。跟ConnectionFactory同样,Connection也有两种类型:QueueConnection和TopicConnection。 |
Session |
QueueSession |
TopicSession |
“会话”,在逻辑上用于区分JMS客户端,由于”连接”可被公用以提升网络利用率;每一个session能够支持相互独立的”事务”和相关属性.每一个session都有ID.
|
Message |
-- |
-- |
“消息”,JMS API中提供了多种类型Message,它们有各自的”序列化/反序列化”机制;消息中能够包含多种JMS属性以及客户端自定义的消息属性和内容. |
MessageProducer |
QueueSender |
TopicPublisher |
“生产者”,一种能够向JMS提供者提交消息的客户端类型. |
MessageConsumer |
QueueReceiver |
TopicSubscriber |
“消费者”,一种能够向JMS提供获取消息的客户端类型. |
至此,JMS的基本概念以及经常使用的接口Api大体了解.更深层次的理解须要在实际的业务代码中去理解.
参考:
http://www.cnblogs.com/whsa/p/4223728.html
http://blog.csdn.net/jiuqiyuliang/article/details/46701559