转载请出自出处:http://eksliang.iteye.com/blog/2242475
一、简介
Java 消息服务(Java Message Service,简称JMS)是Java平台上有关面向消息中间件(MOM)的技术规范。JMS 在其中扮演的角色与JDBC 很相似,正如JDBC 提供了一套用于访问各种不同关系数据库的公共API,JMS也提供了独立于特定厂商的企业消息系统访问方式,Java提供一个接口让不同的厂商去实现,常见的实现有ActiveMQ、JBoss MQ、IBM Websphere MQ等。其中当下最流行的就是ActiveMQ
使用JMS的应用程序被称为JMS客户端,处理消息路由与传递的消息系统被称为JMS Provider(JMS提供商),而JMS应用则是由多个JMS 客户端和一个JMS Provider 构成的业务系统。发送消息的JMS 客户端被称为生产者(producer),而接收消息的JMS 客户端则被称为消费者(consumer)。同一JMS客户端既可以是生产者也可以是消费者。
JMS 的编程过程很简单,概括为:应用程序A 发送一条消息到消息服务器(也就是JMS Provider)的某个目得地(Destination),然后消息服务器把消息转发给应用程序B。因为应用程序A 和应用程序B 没有直接的代码关连,所以两者实现了解偶。如下图:
二.消息的组成
在JMS系统中最核心的就是消息。一条Message 由三个部分组成:
- 头(head)
每条JMS 消息都必须具有消息头。头字段包含用于路由和识别消息的值。可以通过多种方式来设置消息头的值:
a. 由JMS 提供者在生成或传送消息的过程中自动设置
b. 由生产者客户机通过在创建消息生产者时指定的设置进行设置
c. 由生产者客户机逐一对各条消息进行设置
- 属性(property)
消息可以包含称作属性的可选头字段。他们是以属性名和属性值对的形式制定的。可以将属性是为消息头得扩展,其中可以包括如下信息:创建数据的进程、数据的创建时间以及每条数据的结构。JMS提供者也可以添加影响消息处理的属性,如是否应压缩消息或如何在消息生命周期结束时废弃消息。
- 主体(body)
包含要发送给接收应用程序的内容。每个消息接口特定于它所支持的内容类型。JMS为不同类型的内容提供了他们各自的消息类型,但是所有消息都派生自Message接口。
- StreamMessage 一种主体中包含Java基元值流的消息。其填充和读取均按顺序进行。
- MapMessage 一种主体中包含一组键--值对的消息。没有定义条目顺序。
- TextMessage 一种主体中包含Java字符串的消息(例如,XML消息)。
- ObjectMessage 一种主体中包含序列化Java对象的消息。
- BytesMessage 一种主体中包含连续字节流的消息。
三、消息的传递模型
JMS支持两种消息传递模型:基于队列(Queue)点对点模型和基于主题(Topic)发布/订阅模型。这两种消息传递模型非常相似,但有以下区别:
- Queue消息传递模型规定了一条消息只能够传递给一个消费者。
- Topic消息传递模型允许一条消息传递给多个消费者
每个模型都通过扩展公用基类来实现。例如:javax.jms.Queue和Javax.jms.Topic都扩展自javax.jms.Destination类。
3.1点对点的消息传递模型
通过点对点的消息传递模型,一个应用程序可以向另外一个应用程序发送消息。在此传递模型中,目标类型是队列。消息首先被传送至队列目标,然后从该队列将消息传送至对此队列进行监听的某个消费者,如下图:
一个队列可以关联多个队列发送方和接收方,但一条消息仅传递给一个接收方。如果多个接收方正在监听队列上的消息,JMS Provider将根据“先来者优先”的原则确定由哪个接收方接受下一条消息。如果没有接收方在监听队列,消息将保留在队列中,直至接收方连接到队列为止。
温馨提示:在此列模型中,消息不会自动推给给客户端,而是要求客户端从队列中请求获得。
3.2发布/订阅消息传递模型
通过发布/订阅消息传递模型,应用程序能够将一条消息发送到多个接收方。在此传送模型中,目标类型是主题。消息首先被传送至主题目标,然后传送至所有已订阅此主题的送消费者。如下图:
主题目标也支持长期订阅。长期订阅表示消费者已注册了主题目标,但在消息到达目标时该消费者可以处于非活动状态。当消费者再次处于活动状态时,将会接收该消息。如果消费者均没有注册某个主题目标,该主题只保留注册了长期订阅的非活动消费者的消息。与点对点消息传递模型不同,发布/订阅消息传递模型允许多个主题订阅者接收同一条消息。JMS一直保留消息,直至所有主题订阅者都接收到消息为止。
温馨提示:在该模型中,消息会自动广播,消费者无须通过主动请求或轮询主题的方法来获得新的消息。
上面两种消息传递模型中,我们都需要定义消息生产者和消费者,生产者把消息发送到JMS Provider的某个目标地址(Destination),消息从该目标地址传送至消费者。消费者可以同步或异步接收消息,一般而言,异步消息消费者的执行和伸缩性都优于同步消息接收者,体现在:
- 异步消息接收者创建的网络流量比较小。
- 异步消息接收者使用线程比较少。异步消息接收者在不活动期间不使用线程。同步消息接收者在接收调用期间内使用线程,结果线程可能会长时间保持空闲,尤其是如果该调用中指定了阻塞超时。
- 对于服务器上运行的应用程序代码,使用异步消息接收者几乎总是最佳选择,尤其是通过消息驱动Bean。使用异步消息接收者可以防止应用程序代码在服务器上执行阻塞操作。而阻塞操作会是服务器端线程空闲,甚至会导致死锁。阻塞操作使用所有线程时则发生死锁。如果没有空余的线程可以处理阻塞操作自身解锁所需的操作,这该操作永远无法停止阻塞。
四.JMS Provider(ActiveMQ)的特性与优势
- 实现JMS1.1规范,支持J2EE1.4以上。
- 可运行与任何JVM和大部分web容器(ActiveMQ works great in any JVM)
- 支持多种语言客户端(java, C, C++, Ajax, ActionScript等等)
- 支持多种协议(stomp, openwire, REST)
- 良好的Spring支持(ActiveMQ has great Spring Support)
- 速度很快,JBossMQ的十倍(ActiveMQ is very fast; often 10x faster than JBossMQ)
- 与OpenJMS、JBossMQ等开源jms provider相比,ActiveMQ有apache的支持,持续发展的优势明显
五、Queue与Topic的比较
- JMS Queue(队列)
一条消息仅能被一个consumer(消费者)收到。如果在message发送的时候没有可用的consumer,那么它将被保存一直到有处理该message的consumer可用。如果一个consumer收到一条message后却不响应它,那么这条消息将被转到另外一个consumer那儿。一个Queue可以有很多consumer,并且在多个可用的consumer中负载均衡。
- JMS Topic(发布/订阅)
一条消息被publish(发布)时,他将发送给所有感兴趣的订阅者,所以零到多个subscriber(订阅者)将接收到消息的一个拷贝。但是在消息代理接收到消息时,只有激活订阅的subscriber能够获得消息的一个拷贝。根据订阅的处理方式不同,分为非持久化订阅与持久化订阅两种消息处理方式。
参考博客:http://boy00fly.iteye.com/blog/1103586
非常优秀的博客:http://jinguo.iteye.com/blog/233947
相关推荐
3. **jms规范教程.pdf** - 这是一个关于JMS规范的教程,可能详细讲解了JMS接口、消息类型(如点对点和发布/订阅模型)、消息队列和主题等核心概念,为理解JMS和ActiveMQ的工作原理提供了基础。 综上所述,这个主题...
本文将深入探讨如何在Spring 3.0中整合JMS与ActivemQ,以及它们在实际应用中的关键知识点。 首先,我们要了解Spring对JMS的支持。Spring通过其`org.springframework.jms`包提供了丰富的JMS抽象,简化了JMS的使用。...
在提供的“一头扎进JMS之ActiveMQ视频教程”中,你将学习如何配置和使用ActiveMQ,包括安装和启动服务、创建和管理消息队列、使用生产者和消费者发送与接收消息、理解不同消息模式的工作原理,以及如何利用ActiveMQ...
本教程将围绕"使用JMS操作ActiveMQ"这一主题,详细阐述如何通过JMS与ActiveMQ进行交互,包括创建生产者、消费者以及消息的发送和接收。 首先,我们需要理解JMS的基本概念。在JMS中,消息生产者(Producer)负责创建...
3. **Eclipse工程** - `JMS` 文件可能是一个Eclipse项目,用于演示如何在实际开发环境中集成和使用JMS与ActiveMQ。这个工程可能包含了配置文件(如Spring的XML配置)、消息生产者和消费者的Java代码,以及必要的依赖...
**JMS与ActiveMQ入门实例详解** Java消息服务(Java Message Service,简称JMS)是Java平台中用于创建、发送、接收和阅读消息的应用程序接口。它为应用程序提供了标准的接口,可以跨越多种消息中间件产品进行通信。...
详细内容: SpringJMS整合ActiveMQ.doc 详细说明文档 apache-activemq-5.8.0-bin.zip ActiveMQ安装包 JMSTest.rar MyEclipse8.5下web工程
<a href=http://activemq.apache.org/version-5-getting-started.html >http://activemq.apache.org/version-5-getting-started.html</a> <a href=http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html>...
作为JMS的一个实现,ActiveMQ提供了与多种消息队列产品进行交互的能力,并且允许Java应用程序以标准的方式发送和接收消息。ActiveMQ的主要特点包括支持多种编程语言和协议的客户端、完全支持JMS 1.1和J2EE 1.4规范、...
一. 简介 1. 什么是Apache ActiveMq Apache ActiveMq是最流行和最强大的开源消息和集成服务器。同时Apache ActiveMq是速度快,支持多种跨语言客户端和协议,同时配有易于使用的企业集成模式和优秀的特性,并且支持...
#### 一、JMS简介 **Java Message Service (JMS)** 是由Sun Microsystems提出的一项技术规范,旨在为多种消息中间件(Message-Oriented Middleware, MOM)提供统一的接口标准。JMS的核心价值在于其提供了一套标准化...
ActiveMQ 是Apache出品,最流行的,能力强劲的开源jms...ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
为了更深入地理解上述概念,本章节将结合ActiveMQ这一具体的JMS提供者来进行实例分析。 1. **选择JMS提供者**:如果在Java EE环境中,可以直接使用内置的JMS提供者;而在非Java EE环境下,则需要手动配置JMS提供者...
JMS为开发者提供了一个与特定平台无关的API,使得开发人员能够更方便地开发、部署消息驱动的应用程序。 - **核心特性**: - **消息模型**:JMS 支持两种主要的消息模型 —— 点对点(Point-to-Point, PTP)和发布/...
ActiveMQ是Apache软件基金会开发的一个开源JMS提供者,它允许开发者在分布式环境中进行可靠的异步通信。本教程将带你深入理解JMS与ActiveMQ的核心概念和实践应用。 1. **JMS简介** JMS是Java平台中用于处理异步...
ActiveMQ是Apache软件基金会的一个开源项目,它实现了JMS规范,提供了一个高效、可靠的消息中间件。Spring框架是Java开发中的一个核心工具集,特别是在企业级应用开发中,它提供了简化事务管理、依赖注入和AOP(面向...
基于Spring+JMS+ActiveMQ+Tomcat,我使用的版本情况如下所示:Spring 3.2.0,ActiveMQ 5.4.3,Tomcat 6.0.43。本例通过详细的说明和注释,实现消息服务的基本功能:发送与接收。Spring对JMS提供了很好的支持,可以...
本项目结合这三者,提供了一个整合的Demo,旨在帮助开发者理解如何在SpringMVC应用中集成JMS和ActiveMQ,实现消息的发布与订阅。 首先,SpringMVC是Spring框架的一部分,专门用于构建Web应用程序的模型-视图-控制器...
ActiveMQ是Apache软件基金会开发的一款开源消息中间件,它是Java消息服务(Java Message Service,简称JMS)的一个实现。JMS是一种为分布式应用提供异步消息传递的API,它定义了一种标准接口,使得不同的消息系统...
**JMS与ActiveMQ简介** Java消息服务(Java Message Service,简称JMS)是一个标准接口,用于在不同的Java应用程序之间交换消息。就像JDBC允许我们与各种数据库进行交互一样,JMS提供了一种与供应商无关的方式来...