浅谈JMS(Java消息服务)
浅谈JMS(Java消息服务)
JMS,Java Message Service,即Java消息服务应用程序接口,是Java平台一个关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商对JMS提供支持。JMS是一种与厂商无关的API,用来访问收发系统消息,它类似于JDBC(Java Database Connectivity)。JDBC是可以用来访问许多种不同的关系数据库的API,而JMS则提供同样与厂商无关的访问方法,以访问消息收发服务。
JMS使你能够通过消息收发服务从一个JMS客户机向另一个JMS客户机发送消息。
消息是JMS中的一种类型对象,又两部分组成:报头和消息主体。报头由路由信息以及有关该消息的元数据组成。消息主体则携带应用程序的数据或有效负载。根据有效负载的类型来划分,可以将消息分为几种类型,它们分别携带:简单文本(TextMessage)、可序列化的对象(ObjectMessage)、属性集合(MapMessage)、字节流(ByteMessage)、原始值流(StreamMessage),还有无有效负载的消息(Message)。
JMS由以下元素组成:
- JMS提供者:连接面向消息中间件的,JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器。
开源的提供者包括:
Apache ActiveMQ
JBoss 社区所研发的 HornetQ
Joram
Coridan的MantaRay
The OpenJMS Group的OpenJMS
专有的提供者包括:
BEA的BEA WebLogic Server JMS
TIBCO Software的EMS
GigaSpaces Technologies的GigaSpaces
Softwired 2006的iBus
IONA Technologies的IONA JMS
SeeBeyond的IQManager(2005年8月被Sun Microsystems并购)
webMethods的JMS+ -
my-channels的Nirvana
Sonic Software的SonicMQ
SwiftMQ的SwiftMQ
IBM的WebSphere MQ
- JMS客户:生产或消费基于消息的Java应用程序对象。
- JMS生产者:创建并发送消息的JMS客户。
- JMS消费者:接受消息的JMS客户。
- JMS消息:包括可以在JMS客户之间传递的数据对象。
- JMS队列:一个容纳那些被发送的等待阅读的消息的区域。(与队列的FIFO不同,消息的接收顺序并不一定要与消息的发送顺序相同)。一个消息被阅读之后该消息将被从队列中移走。
- JMS主题:一种支持发送消息给多个订阅者的机制。
JMS对象模型包含下面的几个要素:
-
连接工厂(ConnectionFactory),由管理员创建,并绑定到JNDI树中,客户端使用JNDI查找连接工厂,然后利用连接工厂创建一个JMS连接。
-
JMS连接(Connection),表示JMS客户端和服务器端之间的一个活动的连接,是由客户端通过调用连接工厂的方法建立的。
-
JMS会话(Session),表示JMS客户与服务器之间的会话状态。JMS会话建立在JMS连接之上,表示客户与服务器之间的一个会话进程。
-
JMS目的(Destination),又称消息队列,是实际的消息源。
-
JMS 生产者(Message Producer)和消费者(Message Consumer),由Session对象创建,用于发送和接受消息。
-
JMS消息,通常有两种类型:
①点对点(Point-to-Point),消息系统,消息分发给一个单独的使用者。点对点消息往往跟JMS队列(javax.jms.Queue)相关联。
②发布/订阅(Publish/Subscribe)消息系统,支持一个事件驱动模型,消息生产者和消费者都参与消息的传递。生产者发布事件,而使用者订阅感兴趣的事件,并使用事件。该类型的消息一般与特定的主题(javax.jms.Topic)关联。
JMS的传递方式有以下两种: -
标记为NON_PERSISTENT的非持久性消息最多投递一次。
-
标记为PRESISTENT的持久性消息将使用暂存后再转发的机理投递。
如果一个JMS服务离线,持久性消息不会丢失,但是等到这个服务恢复联机是才会被传递;采用非持久性消息可能降低内务和需要的存储器,所以默认的消息传递方式是非持久性的,但是这种传递方式只有当你不需要接收所有的消息是才使用。
由百度百科摘录修改:https://baike.baidu.com/item/JMS/2836691?fr=aladdin
安利一个不错的博客:https://www.cnblogs.com/jaycekon/p/6220200.html