`

理解JMS

阅读更多

首先JMS存在的理由:

RPC(Remote procedure call )系统以及JAVA的RMI都是采用基于服务端、客服端协同完成数据通信的,然而他们有一个共同点就是同步的,调用者必须阻止和等待,直到被调用的方法完成执行;而且两者之间的通信在同一时间必须都是处于活动状态。这样在服务端和客服端就死死的紧密的耦合在了一起,在企业应用中很不方便。应运而生的就是JMS,然后应运而生的就是基于JMS的面向消息中间件(Message-Oriented Middleware:MOM)。因为MOM能提供这种解决方案,它们是基于异步交互模式,并提供一个消息队列的抽象的,可以在网络上传输和访问。

 

JMS的概念:

JMS,Java Message Service,是一个在 Java标准化组织(JCP)内开发的标准(代号JSR 914),是Java平台上有关面向消息中间件(MOM)的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发,翻译为Java消息服务。

可以把它理解为是一套实现某类特定需求的一套接口,或者说是一套API,或者说是一套标准,或者说是一套规范,它的存在类似于JDBC一样。许多厂商针对标准就开发了自己的不同产品,JMS则提供与厂商无关的访问方法,以访问消息收发服务。许多厂商目前都支持 JMS,包括 IBM 的 MQSeries、BEA的 Weblogic JMS service和 Progress 的 SonicMQ以及Apache的ActiveMQ,这些MOM产品就跟针对JDBC的不同数据库的驱动包类似的效果,类似的概念。

Java消息服务(JMS)的设计,可以很容易地开发业务应用程序异步发送和接收的业务数据和事件,它可以很容易地和有效地支持广泛的企业消息传递产品。

 

JMS应用程序的成员:

一个JMS实现者:一个实现了JMS规范的消息管理系统

多个JMS客服端:发送和接收消息的JAVA应用程序
消息体: 指的是在客服端之间传输的对象
管理消息的对象: 使用JMS的管理员预先配置的JMS对象

 

JMS的消息传递模型

1.Point-to-Point (Queue destination): In this model, a message is delivered from a producer to one consumer. The messages are delivered to the destination, which is a queue, and then delivered to one of the consumers registered for the queue. While any number of producers can send messages to the queue, each message is guaranteed to be delivered, and consumed by one consumer. If no consumers are registered to consume the messages, the queue holds them until a consumer registers to consume them.

点对点的基于队列的模型:在这个模型中,一个消息主体从一个生产这传输到一个消费者。生产者将生产的消息传递到队列(目的地),然后该队列将消息传输到一个在该队列上注册过的一个消费者。多个生产者都可以将消息传递到队列,每一个消息都将保证与一个消费者之间进行传输并消费。如果没有消费者的注册消费的消息,队列将保留,直到消费者请求消费它。

2.Publish/Subscribe (Topic destination): In this model, a message is delivered from a producer to any number of consumers. Messages are delivered to the topic destination, and then to all active consumers who have subscribed to the topic. In addition, any number of producers can send messages to a topic destination, and each message can be delivered to any number of subscribers. If there are no consumers registered, the topic destination doesn't hold messages unless it has durable subscription for inactive consumers. A durable subscription represents a consumer registered with the topic destination that can be inactive at the time the messages are sent to the topic.

发布订阅模型:在这个模型中,一个由生产者(发布者)生产的消息可以传递给多个消费者。发布的消息首先被传输到Topic(目的地),可以将它看成是一个主题,接着将消息传输到所有订阅了这个主题的并且处于活动状态的消费者。此外,任何数量的生产者可以向主题topic发送消息,每个消息可以发送到任意数量的订阅者。如果没有用户订阅该消息,主题topic不保留消息,除非它有持久订阅者。一个持久订阅者指的是一个订阅了某个主题的一个消费者,在消息被发送到主题的这段时间里该订阅者是处于非活动状态的,此时topic才持久化该消息

 

JMS编程模型:

 

一个JMS应用程序由业务定义的消息和一组消费这些消息的消费者构成。通过使用JMS的提高的API来发送和接受这些消息进行交互。一个消息由三部分组成:消息头,属性和主体:

  • The header, which is required for every message, contains information that is used for routing and identifying messages. Some of these fields are set automatically, by the JMS provider, during producing and delivering a message, and others are set by the client on a message by message basis.

   消息头,每个消息都必须有消息头,包含该消息的指向和定义的一些信息,消息头里面的部分字段是被JSM产品提供商在生产和传递过程中自动设值的,另一部分字段是在基本消息体的基础上被客服端设值的。

  • Properties, which are optional, provide values that clients can use to filter messages. They provide additional information about the data, such as which process created it, the time it was created. Properties can be considered as an extension to the header, and consist of property name/value pairs. Using properties, clients can fine-tune their selection of messages by specifying certain values that act as selection criteria.

    属性信息,是可选的,是以键值对出现的,可以方便消费者用来过滤消息。他是用来记录一些额外的一些数据,比如该消息是哪个进程创建的,什么时间创建的。属 性可以被认为是作为消息头的一个扩展,由键值对组成。使用属性,客服端可以根据他们的选择标准选择他们需要的消息。

  • The body, which is also optional, contains the actual data to be exchanged. The JMS specification defined six type or classes of messages that a JMS provider must support:

    消息体,也是可选的,包含在交换过程中的实际数据。JMS规范定义了6个类型或类别的消息, JMS产品提供商必须支持这些类型:

  • Message : This represents a message without a message body.消息不包含消息主体的消息
  • StreamMessage : A message whose body contains a stream of Java primitive types. It is written and read sequentially.消息体包含能被顺序读写的Java基本数据类型流的消息
  • MapMessage : A message whose body contains a set of name/value pairs. The order of entries is not defined.消息体包含没有先后顺序的一组键值对的消息
  • TextMessage : A message whose body contains a Java string...such as an XML message.消息体包含类似于XML格式的Java字符串的消息
  • ObjectMessage : A message whose body contains a serialized Java object.消息体包含Java序列化对象的消息
  • BytesMessage : A message whose body contains a stream of uninterpreted bytes.消息体包含未经过解析的字节流的消息
3
0
分享到:
评论
4 楼 crawler 2012-09-13  
TheMatrix 写道
简单认为它就是一组API,不同中间件厂商有自己的实现,单都大同小异?因为接口相同,消息生产者余消费者访问的都只是接口,对吗?

可以这样简单的理解
3 楼 TheMatrix 2012-09-13  
简单认为它就是一组API,不同中间件厂商有自己的实现,单都大同小异?因为接口相同,消息生产者余消费者访问的都只是接口,对吗?
2 楼 crawler 2012-09-07  
vanghoh 写道
楼主文章写的不错,但是关于“JMS存在的理由”有点小毛病:

jms 其实更像jdbc,是java语言与各厂商消息中间件的api接口;也就是说先有的消息中间件,后有的jms。 只不过消息中间件的实现比数据库相对容易的多,所以很多java ee server上也就顺便实现了jms,后来又有了一些基于java的独立的消息中间件,如apache activemq。

你的正解,其实我想表达的也就是你的意思,我不是强调先后顺序,我想表达的是很多厂商实现了JMS标准。
1 楼 vanghoh 2012-09-07  
楼主文章写的不错,但是关于“JMS存在的理由”有点小毛病:

jms 其实更像jdbc,是java语言与各厂商消息中间件的api接口;也就是说先有的消息中间件,后有的jms。 只不过消息中间件的实现比数据库相对容易的多,所以很多java ee server上也就顺便实现了jms,后来又有了一些基于java的独立的消息中间件,如apache activemq。

相关推荐

    JMS样例项目

    我自己用Eclipse写的JMS...完全是用来理解JMS的基础用法,没有太大的生产价值。 代码结构简单,只有三个java代码页,只演示基本功能。安装好jboss之后,不需要进行任何配置,在本机运行和编译代码。仅供学习JMS使用

    MQ、JMS以及ActiveMQ关系的理解

    一般MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。

    《JMS 1.1 规范》-电子文档下载(PDF)(中文)

    作者:卫建军 Java 是当前 IT 领域中比较流行的技术之一。J2EE 是当前比较流行的企业级应用架构。 本人一直致力于 J2EE 架构的学习和研究,但是总是对英文文档...持久化规范》和《JMS1.1 规范》。希望对大家有所帮助。

    深入掌握JMS深入掌握JMS

    在了解了JMS的基础上深入的了解它,有实例代码,可以加深你对它的理解。

    spring中集成JMS使用工程实例..eclipse项目例子,带注解.导入即可运行.

    这是一个使用spring 集成JMS工程实例,带注解,容易学习理解.

    品优购_day13_SpringJms_V1.31

    品优购电商系统开发第13章消息中间件解决方案JMS 课程目标目标1:理解消息中间件、JMS等概念目标2:掌握JMS点对点与发布订阅模式的收发

    Java理论与实践: 应该在下一个企业应用程序中使用JMS吗?

    MQ工具没有数据库工具为人所知或为人理解,数据库工具是几乎所有企业应用程序和大量比较简单的应用程序中的关键组件。开发人员总是可以采用多种类型的数据产品,其范围包括从廉价的、只能在台式机上使用的数据库,到...

    消息队列服务HazelcastMQ.zip

    HazelcastMQ 分解成多个组件:hazelcastmq-core:核心 MQ 库,提供 JMS 2.0 类似的 API ,用来发送和接收信息hazelcastmq-camel:Apache Camel 组件,支持 Camel 的集成矿井爱和企业集成模式(EIP)hazelcastmq-jms...

    better-serializer:PHP的通用序列化器。 JmsSerializer的替代品

    它试图比JmsSerializer更快,并且还试图维持更好的可维护性和可理解的代码库。 此外,由于这也是一个学习实验,因此目标之一就是进行单元测试,并覆盖100%的代码。 除了上述目标外,该项目还旨在提供一些很酷的...

    io:java io学习项目

    java io学习以io,nio为基础,netty为辅程序员素养:掌握面向对象的...能够使用网络框架如netty开发服务端程序掌握RPC框架的使用,比如RMI,Thrift,Dubbo掌握消息队列的使用,如JMS,ActiveMQ等掌握分布式缓存如memcac

    ActiveMQ.rar

    n 三:理解和掌握JMS 包括:基本概念、消息结构、可靠性机制、PTP、Pub/Sub、API结构、JMS应用开 发的基本步骤、持久和非持久的Topic等 n 四:用ActiveMQ构建应用 包括:多种启动Broker的方法、单独应用的开发、结合...

    Web应用开发j2ee教学大纲.doc

    通过本课程的学习,学生应理解J2EE开发平台的概念,掌握J2EE中的核心技术:JSP、Servlet、JDBC、会话bean、消息bean等,理解EJB、JNDI、JMS等技术。

    java消息通信activemq

    关于jms activemq demo,内容实现了消息的发送和接收,并含有一定的注释,容易理解

    EJB 编程及 J2EE 系统架构和设计.pdf

    :本文阐述了J2EE 平台的所有主要技术,围绕J2EE 规范所定义的四个层次: 客户端层(Client Tier...本文试图给出J2EE 平台技术概念理解上的一个较为清晰 的完整的思路,帮助大家掌握各技术间的相互关系和重要的思想。

    EJB编程及J2EE系统框架设计.pdf

    摘要:本文阐述了J2EE 平台的所有主要技术,围绕J2EE 规范所定义的四个层次: ...本文试图给出J2EE 平台技术概念理解上的一个较为清晰 的完整的思路,帮助大家掌握各技术间的相互关系和重要的思想。

    ActiveMQ从入门到精通(一)

    的基础知识,并且讲解了一个HelloWorld级别的例子帮助理解。这是关于消息中间件ActiveMQ的一个系列专题文章,将涵盖JMS、ActiveMQ的初步入门及API详细使用、两种经典的消息模式(PTP andPub/Sub)、与Spring整合、...

    EJB 编程及 J2EE 系统架构和设计

    API,这些技术涵盖了组件技术、 Servlets和JSP、EJB技术、数据库访问、分布式通信技术(Java RMI、Java IDL、 JNDI、JMS)、安全等;本文试图给出 J2EE 平台技术概念理解上的一个较为清晰的完整的思路,帮助...

    EJB编程及J2EE系统架构和设计

    这些技术涵盖了组件技术、 Servlets 和JSP、EJB 技术、数据库访问、分布式通信技术(Java RMI、Java IDL、 JNDI、JMS)、安全等;本文试图给出J2EE 平台技术概念理解上的一个较为清晰 的完整的思路,帮助...

    Spring in Action(第2版)中文版

    1.3理解依赖注入 1.3.1依赖注入 1.3.2di应用 1.3.3企业级应用中的依赖注入 1.4应用aop 1.4.1aop介绍 1.4.2aop使用 1.5小结 第2章基本bean装配 2.1容纳你的bean 2.1.1beanfactory介绍 2.1.2使用应用上下文...

    Spring in Action(第二版 中文高清版).part2

    1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP使用 1.5 小结 第2章 基本Bean装配 2.1 容纳你的Bean 2.1.1 BeanFactory介绍 2.1.2 ...

Global site tag (gtag.js) - Google Analytics